德卡斯特里奥构造 · 伯恩斯坦权重

贝塞尔曲线

贝塞尔曲线:在一条折线的每条边上取同一个比例t,再在新的、少一条边的折线上照样取,直到只剩一个点;t从0走到1,这个点画出的就是曲线。

贝塞尔曲线与本页画面

n次贝塞尔曲线由n + 1个控制点P0,…,PnP_0, \dots, P_n决定:两个点是线段,三个点是二次曲线,四个点就是绘图软件里的三次曲线。它上面的点B(t)B(t)(画面上的红点),是在控制折线的每条边上反复取比例t得到的。在这一页,你可以移动控制点,让t从0扫到1,看构造里的线段留下一根根线,勾出曲线。

“构造”画出当前t处每一层的折线,每一层比上一层少一条边。“扫”让t从0走到1,按相等的t步长留下按t上色的构造线。曲线本身是那条细线。

写成式子,这个构造就是一层一层的加权平均,也就是德卡斯特里奥算法:

Pi0=Pi,Pik(t)=(1−t) Pik−1(t)+t Pi+1k−1(t),B(t)=P0n(t).P_i^0 = P_i, \qquad P_i^k(t) = (1 - t)\,P_i^{k-1}(t) + t\,P_{i+1}^{k-1}(t), \qquad B(t) = P_0^n(t) .

把这一层层平均乘开,每个控制点前面是若干个乘积之和,每个乘积有n个因子,每个因子是1 − t或t。PiP_i的每个乘积恰好含i个t,这样的乘积有(ni)\binom{n}{i}个,所以

B(t)=∑i=0nbi,n(t) Pi,bi,n(t)=(ni)ti(1−t)n−i.B(t) = \sum_{i=0}^{n} b_{i,n}(t)\, P_i, \qquad b_{i,n}(t) = \binom{n}{i} t^{i} (1 - t)^{n-i} .

这些权重是伯恩斯坦多项式,小窗画的就是它们。0≤t≤10 \le t \le 1时它们都不为负,加起来等于1,所以B(t)B(t)是控制点的加权平均,曲线不会跑出控制点的凸包。把一个点PiP_i移动一个向量Δ,曲线上每一点都移动bi,n(t) Δb_{i,n}(t)\,\Delta,在t=i/nt = i/n附近移得最多。这一段不一定是离这个点最近的一段。

t = 0时,每一层都从P0P_0开始,所以B(0)=P0B(0) = P_0;同样B(1)=PnB(1) = P_n。曲线经过两个端点,其余的点通常不经过。构造的最后一层只有一条线段,只要它没有缩成一点,就在曲线的切线上:

B′(t)=n(P1n−1(t)−P0n−1(t)),B′(0)=n (P1−P0),B′(1)=n (Pn−Pn−1).B'(t) = n \bigl(P_1^{n-1}(t) - P_0^{n-1}(t)\bigr), \qquad B'(0) = n\,(P_1 - P_0), \qquad B'(1) = n\,(P_n - P_{n-1}) .

所以曲线从P0P_0出发时朝着P1P_1,到达PnP_n时从Pn−1P_{n-1}的方向过来,除非那一端的两个点重合。这就是绘图软件把三次曲线中间两个点画成从两端伸出的手柄的原因。

最后一层留下的线,只要不是一个点,都在它所带的那一点与曲线相切。低一层的线,也以同样的方式与相邻几个点的曲线相切,所以每一族线都勾出一条自己的曲线,次数较低的曲线显在折线里面。勾出不等于从一侧包住:曲线有拐点的地方会穿过自己的切线,线分布在两侧。三个控制点不在一条直线上时,二次曲线的线就是在两条直边上钉钉子绕成的穿线画,它们勾出的是抛物线。

t = s处的构造还能把曲线切成两段。各层的第一个点,是0到s那一段的控制点;各层的最后一个点,是s到1那一段的控制点,“切开”画的就是这两组。一次次对半切下去,各段的控制折线会越来越贴近曲线。“升阶”反过来:多一个控制点,曲线不变,控制折线离曲线更近。在画面上按下加的点,则会改变曲线。

雪铁龙的德卡斯特里奥在1959年得出这个构造;雷诺的贝塞尔独立得到同样的曲线,在1960年代发表。

值得注意

  • t的步长相等,沿曲线走过的距离不一定相等。
  • 最浓的地方不是曲线,而是线重叠最多的地方,可能稍稍偏离曲线。

相关