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

article/2025/11/9 17:46:29

1. 定义
贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。

贝塞尔曲线的一些特性:

  •  使用n个控制点{\{P_1,P_2,...,P_n\}}来控制曲线的形状
  • 曲线经过起点{P_1}和终点P_n,但不经过中间点P_2~P_{n-1}

 2.直观理解

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

 在这里插入图片描述

step2:在线段AB和BC上找到D、E两个点,使得\frac{AD}{DB}=\frac{BE}{EC}

Step3: 连接DE,并在DE上找到F点,使其满足\frac{DF}{FE}=\frac{AD}{DB}=\frac{BE}{EC}(抛物线的三切线定理)

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

在这里插入图片描述

上述为一个二阶贝塞尔曲线。同样的,也有n解贝塞尔曲线

曲线图示
一阶
三阶
四阶
五阶

 3.公式推导

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

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

        B(t)=P_0+(P_1-P_0)t=(1-t)P_0+tP_1,t\in [0,1]

 其中,公式中的 P_0,{P_1}同步表示为横或纵坐标。

 假设P_0坐标为(a,b),{P_1}的坐标为(c,d),P_2的坐标为(x,y),则有

\frac{x-a}{c-x}=\frac{t}{1-t}\Rightarrow x=(1-t)a+tc                                                         (3-1)

同理,有:

       \frac{y-b}{d-y}=\frac{t}{1-t}\Rightarrow y=(1-t)b+td                                                     (3-2)

 于是可将(3-1)(3-2)可简写为

 B(t)=(1-t)P_0+tP_1,t\in [0,1] 

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

定义:二次贝塞尔曲线的路径由给定点P_0{P_1}P_2的函数B(t)给出:

 B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2,t\in [0,1]

 假设P_0{P_1}上的点为A,{P_1}P_2上的点为B,AB上的点为C(也即C为曲线上的点)。则根据一次贝塞尔曲线公式有:

A=(1-t)P_0+tP_1

B=(1-t)P_1+tP_2

 C=(1-t)A+tB

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

B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2 , t\in [0,1]

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

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

        B(t)=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3 , t\in [0,1]

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

定义:给定点P_0,P_1,...,P_n,则n次贝塞尔曲线由下式给出:

B(t)=\sum_{i=0}^{n}\binom{n}{i}P_i(1-t)^{n-i}t^i=\binom{n}{0}P_0(1-t)^{n}t^0+\binom{n}{1}P_1(1-t)^{n-1}t^1+...+\binom{n}{n-1}P_{n-1}(1-t)^{n-1}t^{n-1}+\binom{n}{n}P_{n}(1-t)^{n}t^{n},t\in[0,1]

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

        P_0^{n}=(1-t)P_0^{n-1}+tP_1^{n-1},t\in [0,1]

————————————————
版权声明:以上内容来自CSDN博主「hailler1119」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hailler1119/article/details/89195558

 4、代码实现

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

N = 3: P = (1-t)^2P0 + 2(1-t)tP1 + t^2*P2
N = 4: P = (1-t)^3P0 + 3(1-t)^2tP1 + 3(1-t)t^2P2 + t^3*P3
N = 5: P = (1-t)^4P0 + 4(1-t)^3tP1 + 6(1-t)2*t2P2 + 4(1-t)t^3P3 + t^4*P4

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

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

b: (N - 1) 递减到 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 循环里计算,Pn从传入的点坐标读取。

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

N=length(control_points);
ta=zeros(N,N);%%对数组进行初始化
%%杨辉三角左右两边的值赋1% 杨辉三角的数的规律
% 1
% 1 1
% 1 2 1
% 1 3 3 1
% 1 4 6 4 1
for i=1:Nta(i,1)=1;ta(i,i)=1;
end
%%从第二个数开始,也就是从第三行开始,等于前列的左边加上正上方的一个
for row=2:Nfor col=2:rowta(row,col)=ta(row-1,col-1)+ta(row-1,col);end
end

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

for i=1:Mt=i/M;%%确定每一个点的比例for k=0:N-1c=k;%分别确定a,b,c三个系数b=N-c-1;%分别确定a,b,c三个系数a=ta(N,k+1);%分别确定a,b,c三个系数p(i,1)=p(i,1)+a*(1-t)^b*t^c*control_points(k+1,1);%确定点的x坐标p(i,2)=p(i,2)+a*(1-t)^b*t^c*control_points(k+1,2);%确定点的y坐标endend

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

 以上,从0到1的完成了贝塞尔曲线的实现。

————————————————
版权声明:本文为CSDN博主「CA727」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cfan927/article/details/104649623/


http://chatgpt.dhexx.cn/article/Swt2aVJh.shtml

相关文章

Bezier(贝塞尔曲线通用规律算法-DEMO)

之前也看过一些相关贝塞尔曲线的知识,但就是一直没有实践应用; 今天,听到有同事:程序、美术,在讨论相关的,人物的曲线路径行走的问题; 一些数学比较牛X的,说了用2阶,或…

bezier曲线原理(简单阐述)

原理和简单推导(以三阶为例): 设P0、P02、P2是一条抛物线上顺序三个不同的点。过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11,则如下比例成立: 这是所谓抛物线的三切线定理。 当P0&…

Bezier贝塞尔曲线

1.简介 Bezier曲线在图形学和游戏中经常使用,一般用的比较多的是4个控制点的贝塞尔曲线,这里手写了一个仅供参考(注:理论上也可以写任意多个点(3个及以上)的贝塞尔,就是一个递归的过程&#xff…

java 贝塞尔曲线_在Java中绘制贝塞尔曲线

我需要创建一个简单的Java程序,通过任意数量的点逐个像素地绘制贝塞尔曲线.此刻,一切似乎都没问题,只是曲线总是在x 0 y 0坐标处结束. 截图1 截图2 我需要它在最后一点结束.我的大脑今天工作不太好,所以我正在寻求帮助. 这是我有的: private void drawScene(){ pr…

贝塞尔曲线(Bezier Curve)原理及公式推导

1. 定义 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋&#…

Bezier(贝塞尔)曲线小总结

在初学时,我发现Bezier曲线(中文名贝塞尔曲线,想要了解历史发展等的可以看此百度百科:贝塞尔曲线_百度百科)很难理解,故在此写了一篇自己的心得感悟。要理解它最重要的是理解Bernstein基函数。首先&#xf…

Bezier曲线原理—动态解释

Bezier曲线原理 贝塞尔曲线(Bzier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮…

正确的Bezier曲线的绘制

原文地址:http://blog.csdn.net/mylovestart/article/details/8434310 Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状 Bezier曲线的数…

根据Bezier曲线的定义公式实现Bezier曲线的绘制

Bezier曲线的定义公式 Pi是曲线上点的坐标(x,y,(z0)), Bi,n(t)伯恩斯坦公式,绘制Bezier曲线的第一种方法是根据这个公式来绘制。首先看看绘制的效果: (1)计算定义中多项式的值 首先要求伯恩斯…

Bezier曲线描述

Bezier曲线 1.Bezier曲线的定义 当用曲线段拟合曲线f(x)时,可以把曲线表示为许多小线段φi(x)之和,其中φi(x)称为基(混合)函数。 这些基(混合)函数是要用于计算和显示的。因此,经常选择多项式…

Bezier曲线的绘制

Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状 Bezier曲线的数学基础是能够在第一个和最后一个顶点之间进行插值的一个多项式混合函数,…

Bezier曲线的生成算法

Bezier曲线的生成方法 生成一条Bezier曲线实际上就是要求出曲线上的点。 1.根据定义直接生成Bezier曲线 定义: 其中 那么生成步骤为: ①首先给出 的递归计算式: ②:将表示成分量形式 由于的计算量大,算法效率不高…

bezier曲线解析与代码(c++)

前言: 作为rhino重度用户,我对于nurbs建模早有耳闻,但对于何为nurbs却不得其解。最近借上《计算机辅助设计》课程的机会,对此作了一些深入的学习,于是在此记录一下一些课程笔记和课后思考。了解nurbs,主要对…

Bezier曲线构造

Bezier曲线构造 曲线公式 曲 线 : C ( u ) ∑ i 0 n B n , i ( u ) P i 基 函 数 : B n , i n ! i ! ( n − i ) ! u i ( 1 − u ) n − i 曲线:C(u) \sum^n_{i0}B_{n,i}(u)P_i\\ 基函数:B_{n,i}\frac{n!}{i!(n-i)!}u^i(1-u)…

java版 贝塞尔曲线算法

public void test() {CvPoint controlPoint[] new CvPoint[4];controlPoint[0] new CvPoint(50, 60); //起点controlPoint[1] new CvPoint(130, 200); //控制点controlPoint[2] new CvPoint(300, 360); //控制点controlPoint[3] new CvPoint(400, 600); //终点int n cont…

Bezier曲线原理及实现代码(c++)

http://devres.zoomquiet.io/data/20110728232822/index.html Bezier曲线原理及实现代码(c) 一、原理: 贝塞尔曲线于1962年,由法国工程师皮埃尔贝塞尔(Pierre Bzier)所广泛发表,他运用贝塞尔曲线…

用Java实现可交互的贝塞尔曲线(Bezier curve)

关于贝塞尔曲线的详细数学原理及公式可参考: 贝塞尔曲线_百度百科 我们来谈谈贝塞尔曲线 本文给出了一种用Java实现贝塞尔曲线的方法,并且可以用鼠标拖动改变锚点。 效果演示图: 这里引用百度百科给出的公式: 二次方公式 三次方…

Bezier曲线简介

Bezier曲线简介 Bezier曲线,又有人叫贝赛尔曲线,贝兹曲线,在计算机绘图中经常被用到,由于前些天事件要用到这个,所以就研究了下。 有了参考资料,其实也不是很复杂。 曲线的介绍(转自维基百科,见…

Bezier曲线原理及其代码实现

Bezier曲线原理及实现代码(c) 一、原理: 贝塞尔曲线于1962年,由法国工程师皮埃尔?贝塞尔(Pierre B?zier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Cast…

Bezier曲线及其性质

本文为Bezier曲线mooc教程学习笔记。 目录 Bezier曲线与曲面[1] Bezier曲线的背景[2] Bezier曲线[3] Bezier曲线详细定义[4] Bezier曲线举例[5] Bernstein 基函数性质[6] 贝塞尔曲线的性质[7] Bezier曲线的生成[8] Bezier曲线的拼接[9] Bezier曲线的升阶与降阶 Bezier曲线与曲面…