给定4点P1(0,0,0)P_1(0,0,0)P1(0,0,0)P2(1,1,1)P_2(1,1,1)P2(1,1,1)P3(2,−1,−1)P_3(2,-1,-1)P3(2,1,1)P4(3,0,0)P_4(3,0,0)P4(3,0,0),用其作为特征多边形来构造一条三次Bezier曲线,并计算参数为0,1/3,2/3,10,1/3,2/3,10,1/3,2/3,1的值。


首先是贝塞尔曲线的定义:当给定空间n+1n+1n+1个点的位置矢量PiP_iPinnn次贝塞尔曲线上个点坐标的插值公式是:

P(t)=∑i=0nPiBi,n(t),t∈[0,1]P(t)=\sum_{i=0}^{n}P_iB_{i,n}(t), t\in[0,1]P(t)=i=0nPiBi,n(t),t[0,1]

具体到对于三次贝塞尔曲线,亦即当n=3n=3n=3时,有:

P(t)=∑i=03PiBi,3(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,t∈[0,1]P(t)=\sum_{i=0}^{3}P_iB_{i,3}(t)=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3,t\in[0,1]P(t)=i=03PiBi,3(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3,t[0,1]

问题是如何给它具体过来的呢?

其实就是对BernsteinBernsteinBernstein调和函数Bi,n(t)B_{i,n}(t)Bi,n(t)带入n=3n=3n=3,该函数的定义是:

Bi,n(t)=n!i!(n−i)!ti(i−t)n−i=Cniti(i−t)n−iB_{i,n}(t)=\frac{n!}{i!(n-i)!}t^i(i-t)^{n-i}=C_n^it^i(i-t)^{n-i}Bi,n(t)=i!(ni)!n!ti(it)ni=Cniti(it)ni

此式带入n=3n=3n=3可得上式。


对于式子:

P(t)=∑i=0nPiBi,n(t)P(t)=\sum_{i=0}^{n}P_iB_{i,n}(t)P(t)=i=0nPiBi,n(t)

要分为两部分看,一部分是不定的,即选取的点是不确定的,所以PiP_iPi具体取值不知道是多少,另一部分是固定的调和函数,在三次贝塞尔曲线的具体情况下,它就是

P(t)=∑i=03Bi,3(t)P(t)=\sum_{i=0}^{3}B_{i,3}(t)P(t)=i=03Bi,3(t)

为了看起来,把它写为矩阵形式。PiP_iPi它本身就有x,y,zx,y,zx,y,z分量,三次计算可以合到一个矩阵里进行计算,要不然就得按照下式分别计算

P(t)={x(t)=a3xt3+a2xt2+a1xt+a0xy(t)=a3yt3+a2yt2+a1yt+a0yz(t)=a3zt3+a2zt2+a1zt+a0z P(t)=\left\{ \begin{aligned} x(t) & = & a_{3x}t^3+a_{2x}t^2+a_{1x}t+a_{0x} \\ y(t) & = & a_{3y}t^3+a_{2y}t^2+a_{1y}t+a_{0y} \\ z(t) & = & a_{3z}t^3+a_{2z}t^2+a_{1z}t+a_{0z} \end{aligned} \right. P(t)= x(t)y(t)z(t)===a3xt3+a2xt2+a1xt+a0xa3yt3+a2yt2+a1yt+a0ya3zt3+a2zt2+a1zt+a0z


按照上面的思路写出三次BernsteinBernsteinBernstein调和函数的矩阵形式:

在这里插入图片描述
矩阵的推导如下,对于:

P(t)=∑i=03PiBi,3(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,t∈[0,1]P(t)=\sum_{i=0}^{3}P_iB_{i,3}(t)=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3,t\in[0,1]P(t)=i=03PiBi,3(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3,t[0,1]

取新函数Bi,3B_{i,3}Bi,3PiP_iPi的系数,则调和函数可写为矩阵形式(虽然是个单行矩阵)

B=[B0,3 B1,3 B2,3 B3,3]B=[B_{0,3} \text{ }B_{1,3}\text{ }B_{2,3}\text{ }B_{3,3}]B=[B0,3 B1,3 B2,3 B3,3]

其中每个Bi,3B_{i,3}Bi,3最高次项系数最大为3,故可用左侧含ttt矩阵乘右侧系数矩阵得到。

P0P_0P0系数(1−t)3(1-t)^3(1t)3为例,拆开即为1−3t+3t2−t31-3t+3t^2-t^313t+3t2t3

什么,你忘了怎么拆了?立方和公式为:

(a+b)3=a3+3a2b+3ab2+b3(a+b)^3=a^3+3a^2b+3ab^2+b^3(a+b)3=a3+3a2b+3ab2+b3


拆开的结果按ttt从高次到低次排列为−t3+3t2−3t+1-t^3+3t^2-3t+1t3+3t23t+1,取系数分别为−1,3,−3,1-1,3,-3,11,3,3,1,正对应右侧系数矩阵的第一列,按矩阵乘法乘到左面正好是−t3+3t2−3t+1-t^3+3t^2-3t+1t3+3t23t+1,也就是B0,3(t)B_{0,3}(t)B0,3(t)

该矩阵乘回去的结果是:

∣B0,3 B1,3 B2,3 B3,3∣T{ \left| {B_{0,3}\text{ } B_{1,3}\text{ }B_{2,3}\text{ }B_{3,3}} \right|^T }B0,3 B1,3 B2,3 B3,3T

(竖着这个矩阵忘了对应的markdown语法了,所以写成横着的并加个TTT,其实竖着才更直观)

然后就是求∣B0,3 B1,3 B2,3 B3,3∣T∗∣P0 P1 P2 P3∣T{ \left| {B_{0,3}\text{ } B_{1,3}\text{ }B_{2,3}\text{ }B_{3,3}} \right|^T }*{ \left| {P_0\text{ } P_1\text{ }P_2\text{ }P_3} \right|^T }B0,3 B1,3 B2,3 B3,3TP0 P1 P2 P3T

于是最终式子长这样(敲Markdown真不如用ipad手写…虽然难看不整齐就是了)

在这里插入图片描述


说了这么多,最后就绕到本题的解法去了,请务必要注意,P(t)P(t)P(t)参数归根到底还是ttt,所以先带入几个控制点PiP_iPi并化简之后,就要对着题意带入ttt来做题了。

在这里插入图片描述

带入对应的ttt,可把矩阵解为∣x y z∣{ \left| x \text{ }y \text{ }z \right| }x y z的形式,即三维坐标。

答案分别是(0,0,0)(0,0,0)(0,0,0)(1,2/9,2/9)(1,2/9,2/9)(1,2/9,2/9)(2,−2/9,2/9)(2,-2/9,2/9)(2,2/9,2/9)(3,0,0)(3,0,0)(3,0,0)


图文无关

虽然图文无关,但是看图可以知道ttt是干啥的。

事实上,参数t在de Casteljau算法中会更加直观

上文中的计算贝塞尔曲线,计算量大(尤其是阶数不止三阶时)还不通用(三阶的算法只能计算三阶的贝塞尔曲线),因此还有另一种算法值得学习,即de Casteljau算法,这一般也是计算机实现使用的代码。


图源:计算机图形学(孙家广)P303前后

在这里插入图片描述
在这里插入图片描述
n+1n+1n+1个点(可以形成nnn条线段),控制形成nnn阶贝塞尔曲线,所以不难看出为什么一次Bezier曲线控制点矩阵有两个点(即P0P_0P0P1P_1P1),高阶类推。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐