贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现

这篇具有很好参考价值的文章主要介绍了贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

参考链接

定义

直观理解

 公式推导

一次贝塞尔曲线(线性公式)

二次贝塞尔曲线(二次方公式)

 三次贝塞尔曲线(三次方公式)

n次贝塞尔曲线(一般参数公式)

代码实现


参考链接

贝塞尔曲线(Bezier Curve)原理及公式推导_bezier曲线-CSDN博客

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现-CSDN博客

贝塞尔曲线——这个是可以在线控制点来绘制贝塞尔曲线的网站

定义

贝塞尔曲线用于计算机图形绘制形状,CSS 动画和许多其他地方。

贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。

1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。

贝塞尔曲线的一些特性:

  • 使用个控制点来控制曲线的形状
  • 曲线通过起始点 和终止点,接近但不通过中间点
  • 曲线的阶次等于控制点的数量减一。 对于两个点我们能得到一条线性曲线(直线),三个点 — 一条二阶曲线,四个点 — 一条三阶曲线。

  • 曲线总是在控制点的凸包内部

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

由于最后一个属性,在计算机图形学中,可以优化相交测试。如果凸包不相交,则曲线也不相交。因此,首先检查凸包的交叉点可以非常快地给出“无交叉”结果。检查交叉区域或凸包更容易,因为它们是矩形,三角形等(见上图),比曲线简单的多。

直观理解

Step 1. 在二维平面内选三个不同的点并依次用线段连接

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

Step 2. 在线段和上找到、两点,使得

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 Step 3. 连接,并在上找到点,使其满足(抛物线的三切线定理)

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

Step 4. 找出符合上述条件的所有点

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 上述为一个二阶贝塞尔曲线。同样的有阶贝塞尔曲线:

曲线 图示
一阶

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

二阶

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

三阶

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

四阶

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

五阶

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 公式推导

一次贝塞尔曲线(线性公式)

定义:给定点、,线性贝塞尔曲线只是一条两点之间的直线,这条线由下式给出,且其等同于线性插值:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

其中,公式里的、同步表示为其或轴坐标。

假设坐标为,坐标为,坐标为,则有:

 贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

同理有:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

于是可将上式简写为:


贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

二次贝塞尔曲线(二次方公式)

定义:二次贝塞尔曲线的路径由给定点、、的函数给出:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 假设、上的点为,、上的点为,上的点为(也即为曲线上的点。则根据一次贝塞尔曲线公式有:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

将上式中、带入中,即可得到二次贝塞尔曲线的公式:


贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 三次贝塞尔曲线(三次方公式)

同理可得三次贝塞尔曲线公式:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

n次贝塞尔曲线(一般参数公式)

定义:给定点、、,则次贝塞尔曲线由下式给出:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

n次贝塞尔曲线的公式可由如下递归表达:

 贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

进一步可以得到贝塞尔曲线的递推计算公式:

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

代码实现

首先来看不同阶数的贝塞尔曲线公式,来找共同点:

N=2:         贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

N=3:         贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

N=4:        贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

可将贝塞尔曲线一般参数公式中的表达式用如下方式表示:
设有常数 a,b 和 c,则该表达式可统一表示为如下形式:

根据上面的分析就可以总结出 a,b,c 对应的取值规则:

b: 递减到 0 (b 为 1-t 的幂)
c: 0 递增到 (N - 1) (c 为 t 的幂)
a: 在 N 分别为 1,2,3,4,5 时将其值用如下形式表示: 

N=1:---------1
N=2:--------1 1
N=3:------1 2 1
N=4:-----1 3 3 1
N=5:---1 4 6 4 1
a 值的改变规则为: 杨辉三角

-------------------------------------------------------------------

理论基础有了,开始写代码

a 值用杨辉三角计算,b ,c 值在for 循环里计算,从传入的点坐标读取。

step1:首先使用杨辉三角的方式生成a值
 

    N = len(control_points)
    ta = np.zeros((N, N))

    # 初始化杨辉三角左右两边的值为1
    for i in range(N):
        ta[i, 0] = 1
        ta[i, i] = 1

    # 计算杨辉三角
    for row in range(2, N):
        for col in range(1, row):
            ta[row, col] = ta[row-1, col-1] + ta[row-1, col]

step2:生成贝塞尔曲线上的点

    p = np.zeros((M, 2))

    for i in range(M):
        t = i / M  # 确定每一个点的比例
        for k in range(N):
            c = k  # 分别确定 a, b, c 三个系数
            b = N - c - 1  # 分别确定 a, b, c 三个系数
            a = ta[N-1, k]  # 分别确定 a, b, c 三个系数

            # 确定点的 x 和 y 坐标
            p[i, 0] += a * (1 - t)**b * t**c * control_points[k, 0]
            p[i, 1] += a * (1 - t)**b * t**c * control_points[k, 1]

完整代码


# N表示控制点个数,M表示时间步
import numpy as np
from scipy.special import comb

def calculate_bezier_curve(control_points, M=1000):
    N = len(control_points)
    ta = np.zeros((N, N))

    # 初始化杨辉三角左右两边的值为1
    for i in range(N):
        ta[i, 0] = 1
        ta[i, i] = 1

    # 计算杨辉三角
    for row in range(2, N):
        for col in range(1, row):
            ta[row, col] = ta[row-1, col-1] + ta[row-1, col]

    p = np.zeros((M, 2))

    for i in range(M):
        t = i / M  # 确定每一个点的比例
        for k in range(N):
            c = k  # 分别确定 a, b, c 三个系数
            b = N - c - 1  # 分别确定 a, b, c 三个系数
            a = ta[N-1, k]  # 分别确定 a, b, c 三个系数

            # 确定点的 x 和 y 坐标
            p[i, 0] += a * (1 - t)**b * t**c * control_points[k, 0]
            p[i, 1] += a * (1 - t)**b * t**c * control_points[k, 1]

    return p

# 示例调用
control_points = np.array([(0, 0), (1, 2), (2, 0)])
result_points = calculate_bezier_curve(control_points)

# 打印结果
print(result_points)

# 可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(result_points[:, 0], result_points[:, 1], label='Bezier Curve')

下图是一个生成的二阶贝塞尔曲线(有3个控制点)

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现,matlab,开发语言

 另外一种实现方式:文章来源地址https://www.toymoban.com/news/detail-807699.html

def bezier_curve(points, n_times=1000):
    """
    Generate a Bezier curve from control points.
    Args:
    points (list of tuples): control points.
    n_times (int): number of time steps (resolution of the curve).
    Returns:
    list of tuples: points on the bezier curve.
    """
    n_points = len(points)
    t = np.linspace(0, 1, n_times)

    curve = np.zeros((n_times, 2))
    for i in range(n_points):
        binom = comb(n_points - 1, i) # 计算二项式系数,即组合数。表示从 n_points - 1 个元素中选择 i 个元素的方式有多少种。
        curve += np.outer(binom * (t ** i) * ((1 - t) ** (n_points - 1 - i)), points[i])
    return curve

control_points1 = [(0, 0), (1, 2), (2, 0)]
bezier1 = bezier_curve(control_points1)
print(bezier1)

到了这里,关于贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LVGL笔记】-- 贝塞尔曲线绘制

    什么是贝塞尔曲线 贝塞尔曲线 (Bézier Curve,也被称为贝塞尔多项式(Bézier Polynomial),是由一系列控制点(Control Point)所定义的一条平滑曲线。 Pierre Bézier 于1960年开始利用该曲线设计雷诺的车身线条,故命名为贝塞尔曲线。目前,贝塞尔曲线被广泛应用于图形设计、路径

    2024年02月02日
    浏览(32)
  • c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

    效果可查看上一篇博文: js手动画平滑曲线,贝塞尔曲线拟合 【代码】js手动画平滑曲线,贝塞尔曲线拟合。 https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm=1001.2014.3001.5502 代码如下:

    2024年02月16日
    浏览(29)
  • CSS动画中的贝塞尔曲线

    最近在学习CSS动画,其中动画时间函数的部分涉及到了 贝塞尔曲线 的相关知识。对于这部分知识,之前一直没有好好学习过,正好借着这个机会学习下。 首先简单介绍下贝塞尔曲线。 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲

    2024年02月09日
    浏览(61)
  • unity 曲线可视化图表制作(lineRenderer + 贝塞尔曲线)

    需求要实现一个动态变化的曲线 思路: 分为两部分:画线和平滑曲线 首先解决画线问题: 1.lineRenderer 2.texture的setpixel 肯定选已经做好的轮子1啦 平滑曲线思路: 1.抛物线 2.贝塞尔曲线 抛物线做连续的曲线太抽象了 肯定选贝塞尔曲线 先了解一下贝塞尔曲线 一次贝塞尔 对应

    2023年04月08日
    浏览(33)
  • Godot插值、贝塞尔曲线和Astar寻路

    线性插值是采用一次多项式上进行的插值计算,任意给定两个值A和B,那么在A和B之间的任意值可以定义为: P(t) = A * (1 - t) + B * t,0 = t = 1。 数学中用于线性拟合,游戏应用可以做出跟随效果(宠物跟随、npc跟随) 贝塞尔是插值的应用之一。贝塞尔曲线是为工业设计,是图形

    2024年04月14日
    浏览(32)
  • 贝塞尔曲线的python实现(简单易理解)

    贝塞尔曲线在计算机图形学中被大量使用,通常可以产生平滑的曲线。比如ps中的钢笔工具,就是利用的这种原理。由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各种图形,拿到鼠标想随心

    2024年02月16日
    浏览(30)
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点,三角面,UV和法线。笔者有类似的文章unity 线绳管道纯代码创建方法_,详细的讲解了网格线的

    2024年02月04日
    浏览(30)
  • Unity中的数学基础——贝塞尔曲线

    一:前言  一条贝塞尔曲线是由一组定义的控制点P0到 Pn,n=1为线性,n=2为二次......第一个和最后一个控制点称为起点和终点,中间的控制点一般不会位于曲线上  获取两个点之间的点就是通过线性插值( Mathf.Lerp),0 = t = 1 二:贝塞尔曲线公式 ——线性公式:给定点P0、P

    2024年02月11日
    浏览(30)
  • Unity ——使用贝塞尔曲线对三维管状物体进行弯曲

    参考链接:【Unity】弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文:吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): 57-59. unity项目下载:https://download.csdn.net/download/weixin_43042683/87690343 效果图 随着虚拟现实的发展,在游戏引擎中

    2024年02月11日
    浏览(36)
  • 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 曲线杂谈(二):Bezier曲线的特殊性质 贝塞尔曲线的特性总结 贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔( Pierre Bézier)发表,他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线是应用于二维图形应用程序的数学曲线,由一组称为

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包