1. 定义
贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。
贝塞尔曲线的一些特性:
- 使用n个控制点{P1,P2,...,Pn}来控制曲线的形状
- 曲线通过起始点P1和终止点Pn,接近但不通过中间点P2~Pn−1
2. 直观理解
Step 1. 在二维平面内选三个不同的点并依次用线段连接
Step 2. 在线段AB和BC上找到D、E两点,使得DBAD=ECBE
Step 3. 连接DE,并在DE上找到F点,使其满足FEDF=DBAD=ECBE(抛物线的三切线定理)
Step 4. 找出符合上述条件的所有点
上述为一个二阶贝塞尔曲线。同样的有n阶贝塞尔曲线:
3. 公式推导
3.1 一次贝塞尔曲线(线性公式)
定义:给定点P0、P1,线性贝塞尔曲线只是一条两点之间的直线,这条线由下式给出,且其等同于线性插值:
B(t)=P0+(P1−P0)t=(1−t)P0+tP1, t∈[0,1]
其中,公式里的P0、P1同步表示为其x或y轴座标。
假设P0座标为(a,b),P1座标为(c,d),P2座标为(x,y),则有:
c−xx−a=1−tt⇒x=(1−t)a+tc(3-1)
同理有:
d−yy−b=1−tt⇒x=(1−t)b+td(3-2)
于是可将(3−1)(3−2)简写为:
B(t)=(1−t)P0+tP1, t∈[0,1](3-3)
3.2 二次贝塞尔曲线(二次方公式)
定义:二次贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t)给出:
B(t)=(1−t)2P0+2t(1−t)P1+t2P2, t∈[0,1]
假设P0P1上的点为A,P1P2上的点为B,AB上的点为C(也即C为曲线上的点。则根据一次贝塞尔曲线公式有:
A=(1−t)P0+tP1B=(1−t)P1+tP2C=(1−t)A+tB(3-4)
将上式中A、B带入C中,即可得到二次贝塞尔曲线的公式:
B(t)=(1−t)2P0+2t(1−t)P1+t2P2, t∈[0,1](3-5)
3.3 三次贝塞尔曲线(三次方公式)
同理可得三次贝塞尔曲线公式:
B(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3, t∈[0,1](3-6)
3.4 n次贝塞尔曲线(一般参数公式)
定义:给定点P0,P1,...,Pn,则n次贝塞尔曲线由下式给出:
n次贝塞尔曲线的公式可由如下递归表达:
P0n=(1−t)P0n−1+tP1n−1, t∈[0,1](3-7)
进一步可以得到贝塞尔曲线的递推计算公式:
Pik{Pi, k=0(1−t)Pik−1+tPi+1k−1, k=1,2,...,n; i=0,1,...,n−k
这就是德卡斯特里奥算法(De Casteljau’s algorithm)
参考
[1] https://www.jianshu.com/p/0c9b4b681724
[2] https://www.jianshu.com/p/8f82db9556d2