贝塞尔曲线
贝塞尔曲线(读作 [bezje])是一种使用数学方法描述的曲线,被广泛用于计算机图形学和动画中。在矢量图中,贝塞尔曲线用于定义可无限放大的光滑曲线。
贝塞尔曲线由至少两个控制点进行描述。Web 技术中使用的是三次贝塞尔曲线,即使用四个控制点 P0、P1、P2 和 P3 描述的曲线。
在绘制二次贝塞尔曲线的过程中,需要先作两条辅助线:P0 到 P1 和 P1 到 P2;第三条辅助线从其起点稳步移动到第一辅助线上,终点在第二辅助线上。在这条辅助线上,有一个点从其起点稳步移动到其终点。这个点描述的曲线就是贝塞尔曲线。以下是一个动画示例,展示了曲线的创建过程:
一般化
n阶贝塞尔曲线可如下推断。给定点P0,P1,P2,⋯,Pn,其贝塞尔曲线即
{\displaystyle \mathbf {B} (t)=\sum _{i=0}^{n}{n \choose i}\mathbf {P} _{i}(1-t)^{n-i}t^{i}={n \choose 0}\mathbf {P} _{0}(1-t)^{n}t^{0}+{n \choose 1}\mathbf {P} _{1}(1-t)^{n-1}t^{1}+\cdots +{n \choose n-1}\mathbf {P} _{n-1}(1-t)^{1}t^{n-1}+{n \choose n}\mathbf {P} _{n}(1-t)^{0}t^{n}{\mbox{ , }}t\in [0,1]}
术语
一些关于参数曲线的术语,有
B(t)=i=0∑nPibi,n(t),t∈[0,1]
bi,n(t)=(in)ti(1−t)n−i,i=0,…n
又称作n阶的伯恩斯坦基底多项式,定义00 = 1。
点Pi*称作贝塞尔曲线的控制点。多边形以带有线的贝兹点连接而成,起始于P0并以Pn终止,称作贝兹多边形(或控制多边形)。贝兹多边形的凸包(convex hull)包含有贝塞尔曲线。
构建贝塞尔曲线
线性曲线
线性贝塞尔曲线函数中的t会经过由P0至P1的B(t)所描述的曲线。例如当t=0.25时,B(t)即一条由点至P0至P1路径的四分之一处。就像由0至1的连续t,描B(t)述一条由P0至P1的直线。
二次曲线
为建构二次贝塞尔曲线,可以中介点Q0和Q1作为由0至1的t:
- 由P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
- 由P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
- 由Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。
高阶曲线
为建构高阶曲线,便需要相应更多的中介点。对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构:
对于四次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2、Q3,由二次贝塞尔曲线描述的点R0、R1、R2,和由三次贝塞尔曲线描述的点S0、S1所建构:
升阶
n次贝塞尔曲线可以变换为一个形状完全相同的n+1次贝塞尔曲线。 这在软件只支持特定阶次的贝塞尔曲线时很有用。 例如,Cairo只支持三次贝塞尔曲线,你就可以用升阶的方法在Cairo画出二次贝塞尔曲线。
我们利用B(t)=(1−t)B(t)+tB(t)这个特性来做升阶。我们把曲线方程式中每一项bi,n(t)Pi都乘上 (1 − t) 或 t,让每一项都往上升一阶。以下是将二阶升为三阶的示例
(1−t)2P0+2(1−t)tP1+t2P2=(1−t)3P0+(1−t)2tP0+2(1−t)2tP1+2(1−t)t2P1+(1−t)t2P2+t3P2=(1−t)3P0+3(1−t)2t3P0+2P1+3(1−t)t232P1+P2+t3P2
对任何的n值,我们都可以使用以下等式
(in+1)(1−t)bi,n=(in)bi,n+1,(1−t)bi,n=n+1n+1−ibi,n+1
(i+1n+1)tbi,n=(in)bi+1,n+1,tbi,n=n+1i+1bi+1,n+1
B(t)=(1−t)i=0∑nbi,n(t)Pi+ti=0∑nbi,n(t)Pi=i=0∑nn+1n+1−ibi,n+1(t)Pi+i=0∑nn+1i+1bi+1,n+1(t)Pi=i=0∑n+1(n+1iPi−1+n+1n+1−iPi)bi,n+1(t)=i=0∑n+1bi,n+1(t)P′i
式中P−1和Pn+1可以任意挑选。
因此,新的控制点为P′i=n+1iPi−1+n+1n+1−iPi,i=0,…,n+1.