贝塞尔曲线介绍及其应用

news2024/7/6 19:44:23

  贝塞尔样条是一个允许用户控制节点处斜率的样条,是一种特殊的三次样条。
  皮埃尔·贝塞尔在其为雷诺(Renault)汽车公司工作时有了这个创意。Paul de Casteljau在与雷诺竞争关系的汽车公司雪铁龙Citroen公司工作时也独立有了这个想法。这在两家公司都认为是工业秘密,事实上在贝塞尔发表了他的研究后,大家才知道两家公司都进行了相同的研究。今天贝塞尔曲线(Bézier curve)是计算机辅助设计和制造的奠基石。
  平面贝塞尔样条的每一段由4个点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , ( x 4 , y 4 ) (x_{1}, y_{1}), (x_{2}, y_{2}), (x_{3}, y_{3}),(x_{4}, y_{4}) (x1,y1),(x2,y2),(x3,y3),(x4,y4)所确定。第一个点和最后一个点是样条的起点和终点,中间的两个点是控制点,曲线以切线方向 ( x 2 − x 1 , y 2 − y 1 ) (x_{2}-x_{1}, y_{2}-y_{1}) (x2x1,y2y1)离开 ( x 1 , y 1 ) (x_{1}, y_{1}) (x1,y1),并以切线方向 ( x 4 − x 3 , y 4 − y 3 ) (x_{4}-x_{3}, y_{4}-y_{3}) (x4x3,y4y3) ( x 4 , y 4 ) (x_{4}, y_{4}) (x4,y4)点结束。

对于贝塞尔曲线,给定端点 ( x 1 , y 1 ) , ( x 4 , y 4 ) (x_{1}, y_{1}), (x_{4}, y_{4}) (x1,y1),(x4,y4)和控制点 ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_{2}, y_{2}), (x_{3}, y_{3}) (x2,y2),(x3,y3),设
b x = 3 ( x 2 − x 1 ) c x = 3 ( x 3 − x 2 ) − b x d x = x 4 − x 1 − b x − c x b y = 3 ( y 2 − y 1 ) c y = 3 ( y 3 − y 2 ) − b y d y = y 4 − y 1 − b y − c y b_{x}=3(x_{2}-x_{1})\\ c_{x}=3(x_{3}-x_{2})-b_{x}\\ d_{x}=x_{4}-x_{1}-b_{x}-c_{x}\\ b_{y}=3(y_{2}-y_{1})\\ c_{y}=3(y_{3}-y_{2})-b_{y}\\ d_{y}=y_{4}-y_{1}-b_{y}-c_{y} bx=3(x2x1)cx=3(x3x2)bxdx=x4x1bxcxby=3(y2y1)cy=3(y3y2)bydy=y4y1bycy
定义在 0 ≤ t ≤ 1 0\leq t \leq 1 0t1的贝塞尔曲线如下:

x ( t ) = x 1 + b x t + c x t 2 + d x t 3 y ( t ) = y 1 + b y t + c y t 2 + d y t 3 x(t) = x_{1}+b_{x}t+c_{x}t^{2}+d_{x}t^{3}\\ y(t) = y_{1}+b_{y}t+c_{y}t^{2}+d_{y}t^{3} x(t)=x1+bxt+cxt2+dxt3y(t)=y1+byt+cyt2+dyt3

应用1 绘制贝塞尔曲线

  找出贝塞尔曲线(x(t), y(t))通过点(x,y)=(1, 1)和(2, 2),控制点为(1, 3)和(3, 3)。
  Python实现程序如下:

# -*- coding: utf-8 -*-
# @Time : 2023/3/9 10:56
# @Author : Jclian91
# @File : Bezier_curve.py
# @Place : Xuhui, Shanghai
# solve Bézier curve with given four points
import matplotlib.pyplot as plt


def get_bezier_curve(pass_points, control_points):
    p_point1, p_point2 = pass_points
    x1, y1 = p_point1
    x4, y4 = p_point2
    c_point1, c_point2 = control_points
    x2, y2 = c_point1
    x3, y3 = c_point2
    # parameter in bezier curve
    b_x = 3 * (x2-x1)
    c_x = 3 * (x3-x2) - b_x
    d_x = x4 - x1 - b_x - c_x
    b_y = 3 * (y2 - y1)
    c_y = 3 * (y3 - y2) - b_y
    d_y = y4 - y1 - b_y - c_y
    # curve
    n = 1000    # sample points in interval [0, 1]
    step = 1/n
    x_list, y_list = [], []
    t = 0
    for i in range(n):
        t += step
        x_list.append(x1 + b_x * t + c_x * (t**2) + d_x * (t**3))
        y_list.append(y1 + b_y * t + c_y * (t ** 2) + d_y * (t ** 3))
    return x_list, y_list


# plot bezier curve
def plot_bezier_curve(pass_points, control_points):
    x_list, y_list = get_bezier_curve(pass_points, control_points)
    plt.plot(x_list, y_list, label='bezier_curve', color='red')
    plt.title(f'Bezier Curve')
    plt.legend()
    # plt.show()
    plt.savefig(f"bezier_curve.png")


if __name__ == '__main__':
    # example curve
    p_points = [(1, 1), (2, 2)]
    c_points = [(1, 3), (3, 3)]
    plot_bezier_curve(p_points, c_points)

绘制的贝塞尔曲线如下:
样例贝塞尔曲线

绘制计算机字符

  在这个例子中,我们将解释如何使用二维贝塞尔曲线划出Times Roman字体的T字母。
  Python实现程序如下:

# -*- coding: utf-8 -*-
# @Time : 2023/3/9 10:56
# @Author : Jclian91
# @File : Bezier_curve.py
# @Place : Xuhui, Shanghai
# solve Bézier curve with given four points
import matplotlib.pyplot as plt


def get_bezier_curve(pass_points, control_points):
    p_point1, p_point2 = pass_points
    x1, y1 = p_point1
    x4, y4 = p_point2
    c_point1, c_point2 = control_points
    x2, y2 = c_point1
    x3, y3 = c_point2
    # parameter in bezier curve
    b_x = 3 * (x2-x1)
    c_x = 3 * (x3-x2) - b_x
    d_x = x4 - x1 - b_x - c_x
    b_y = 3 * (y2 - y1)
    c_y = 3 * (y3 - y2) - b_y
    d_y = y4 - y1 - b_y - c_y
    # curve
    n = 1000    # sample points in interval [0, 1]
    step = 1/n
    x_list, y_list = [], []
    t = 0
    for i in range(n):
        t += step
        x_list.append(x1 + b_x * t + c_x * (t**2) + d_x * (t**3))
        y_list.append(y1 + b_y * t + c_y * (t ** 2) + d_y * (t ** 3))
    return x_list, y_list


# plot character T in Times Roman Font
def plot_t_in_times_roman_font():
    points = [[(237, 620), (237, 620), (237, 120), (237, 120)],
              [(237, 120), (237, 35), (226, 24), (143, 19)],
              [(143, 19), (143, 19), (143, 0), (143, 0)],
              [(143, 0), (143, 0), (435, 0), (435, 0)],
              [(435, 0), (435, 0), (435, 19), (435, 19)],
              [(435, 19), (353, 23), (339, 36), (339, 109)],
              [(339, 109), (339, 108), (339, 620), (339, 620)],
              [(339, 620), (339, 620), (339, 620), (339, 620)],
              [(339, 620), (507, 620), (529, 602), (552, 492)],
              [(552, 492), (552, 492), (576, 492), (576, 492)],
              [(576, 492), (576, 492), (570, 662), (570, 662)],
              [(570, 662), (570, 662), (6, 662), (6, 662)],
              [(6, 662), (6, 662), (0, 492), (0, 492)],
              [(0, 492), (0, 492), (24, 492), (24, 492)],
              [(24, 492), (48, 602), (71, 620), (183, 620)],
              [(183, 620), (183, 620), (237, 620), (237, 620)]
              ]
    for point_list in points:
        pass_points, control_points = [point_list[0], point_list[-1]], point_list[1:3]
        x_list, y_list = get_bezier_curve(pass_points, control_points)
        plt.plot(x_list, y_list, color='black')
    plt.title('Bezier Curve')
    # plt.show()
    plt.savefig("T_in_Times_Roman_Font.png")


if __name__ == '__main__':
    # T in Times Roman Font with Bézier Curve
    plot_t_in_times_roman_font()

运行结果如下:
Times Roman字体的字母T
当前使用贝塞尔曲线可以生成数百种不同字体的字符,显示在计算机屏幕或者打印机上。尽管字体信息很多年来都是一个秘密,但是现在一部分在网上已经公开。因此,今天贝塞尔曲线(Bézier curve)是计算机辅助设计和制造的奠基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联合解决方案 | 亚信科技AntDB数据库携手浪潮K1 Power赋能关键行业数字化转型,助力新基建

自2022年印发《“十四五”数字经济发展规划》以来,我国数字化发展进入快车道。数据库作为数据存储与计算的基础软件,对筑牢数字经济底座至关重要。服务器是承载数据的重要载体,在数据库性能可以通过扩容而无上限提升的情况下,数据…

老爸:“你做的什么游戏测试简直是不务正业!”——我上去就是一顿猛如虎的解释。

经常有人问我:游戏测试到底是干什么呢?是游戏代练?每天玩游戏?装备随便造,怪物随便秒,线上GM指令随便用?可以每天玩玩游戏,不用忙工作,太爽了?有时朋友不理解…

1638_chdir函数的功能

全部学习汇总:GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 今天看一个半生不熟的小函数,chdir。说半生不熟,是因为这个接口一看就知道是什么功能。然而,这个接口如何用可真就没啥想法了。 …

【微信小程序】-- 自定义组件 -- 数据、方法和属性(三十三)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

设计模式之门面模式(外观模式)

目录 1.模式定义 2.应用场景 2.1 电源总开关例子 2.2 股民炒股场景 ​编辑 3. 实例如下 4. 门面模式的优缺点 传送门: 项目中用到的责任链模式 给对象讲工厂模式,必须易懂易会 策略模式,工作中你用上了吗? 1.模式定…

Linux order(文件、磁盘、网络、系统管理、备份压缩)

1. Linux 文件命令 -rwxrwxrwx chmod:change mode,用于(文件所有者或 root )变更用户(u:owner g:group o:other a:all)的权限 chmod [OPTION]… MODE[,MODE]… FILE… OPTION -R:递归修改more option:chmod…

【WPS文字-Word】WPS文字设置段落居中对齐后公式左边右边的文字仍然无法跟公式对齐,公式和文字对不齐

一、问题背景 原来的公式左边文字是底端,右边文字是居中,我想着让左右文字全跟公式居中对齐,就全部设置了段落居中对齐。 结果发现,公式左右边的文字依然无法居中对齐。左边的文字是居中,但是右边的文字变成了顶端对…

数据推介⎮情感语音合成音库

在语音交互领域,语音合成是重要的一环,其技术也在不断发展。近年来,人们对情感合成的兴趣和需求越来越高。情感语音合成会让机器如真人一样和我们交流,它可以用愤怒的声音、开心的声音、悲伤的声音等不同情绪来表达,甚…

Atlassian Server用户新选择 | 云版和本地部署的数据中心版,总有一个适合您

Atlassian对Server版本产品的支持将于2024年2月15日结束,现在,是时候创建您的迁移计划了。一起来看看您需要了解什么基础知识以及如何规划下一步行动吧。 虽然离终止支持还有几个月的时间,但对于使用Server版的企业来说,这是一则…

数字孪生与 UWB 人员定位:双剑合璧的智能物联新时代

人员定位是指利用各种定位技术对人员在特定场所的位置进行准确定位的技术。人员定位技术主要应用于需要实时监控、管理和保障人员安全的场所,如大型厂区、仓库、医院、学校、商场等。人员定位技术的应用范围非常广泛,例如:-在工厂生产线上&am…

MySQL数据库迁移

考试系统的数据库一直是在我自己的服务器上面的, 但是最近,自己的服务器马上要过期了,里面的MySQL数据需要迁移出来,放在另外一个服务器上面。百度了几篇教程,也没研究太多,选了一种比较简单的方式进行迁移…

蓝桥杯三月刷题 第7天

文章目录💥前言😉解题报告💥三角回文数🤔一、思路:😎二、代码:💥数数🤔一、思路:😎二、代码:💥数组切分🤔一、思路:😎二、…

归并排序的学习过程(代码实现)

归并排序的学习过程 在知乎上搜索相关内容: 先在必应和知乎上搜索归并排序的概念: 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型…

工作记录:举步维艰的在线 word 之旅 - tinymce

项目中需要实现 “在线编辑 word 模板” 的功能,我打算使用富文本组件 tinymce ,因为业务需求比较特殊,研究一下 tinymce 是否能实现。 如何在 vue 项目中引用 tinymce,可以看另一篇文章 《在 vue 项目中使用 tinymce》 &#x…

HTML文档的基本结构

HTML文档以.html结尾&#xff0c;可以直接使用笔记本创建。 外部结构 <!DOCTYPE HTML><html></html>HTML文档外部结构由DOCTYPE和HTML构成。DOCTYPE告诉浏览器处理的是HTML文档&#xff0c;HTML规定使用HTML5标准。 然后是html元素&#xff0c;他告诉浏览…

基于Spring事件驱动模式实现业务解耦

事件驱动模式 举个例子&#x1f330; 大部分软件或者APP都有会有会员系统&#xff0c;当我们注册为会员时&#xff0c;商家一般会把我们拉入会员群、给我们发优惠券、推送欢迎语什么的。 值得注意的是&#xff1a; 注册成功后才会产生后面的这些动作&#xff1b;注册成功后的…

Flutter(五)容器类组件

布局类组件包含多个子组件&#xff0c;而容器类组件只包含一个子组件 目录填充&#xff08;Padding&#xff09;装饰容器&#xff08;DecoratedBox&#xff09;变换&#xff08;Transform&#xff09;Transform.translate 平移Transform.rotate 旋转Transform.scale 缩放Rotate…

C++中拷贝构造和赋值重载的注意事项以及编译器的优化处理

C中拷贝构造和赋值重载的注意事项以及编译器的优化处理前言1. 拷贝构造和赋值重载的易混淆点和注意事项1.1 易混淆点1.2 注意事项2.编译器对拷贝构造和赋值重载的优化处理前言 本文可以帮助你对下面&#xff1a; &#xff08;1&#xff09;何时调用拷贝构造何时调用赋值重载 &a…

多元统计分析、混合效应模型、结构方程模型、极值统计学、贝叶斯网络、copula

生态环境视角下的多元统计分析 1、多元数据分析:概念、定义、及应用困惑; 2、生态环境数据多元统计方法及应用情景; 3、生态环境多元数据分析预处理; 时长&#xff1a;2小时24分钟 结构方程模型&#xff08;SEM&#xff09;原理、构建流程及应用 1、结构方程模型基本原理 …

Windows 事件日志分析管理

Windows 设备是大多数商业网络中最受欢迎的选择。为了处理这些设备生成的数 TB 的事件日志数据&#xff0c;安全管理员需要使用功能强大的日志管理工具&#xff08;如EventLog Analyzer&#xff09;&#xff0c;该工具可以通过自动执行日志收集、解析、分析、关联和存档等过程来…