有理曲线和齐次坐标的概念,有理Bezier曲线是有理B样条曲线的特殊情况。
尽管多项式具有很多优点,但是有很多重要的曲线、曲面类型,如圆、椭圆、双曲线、圆柱面、圆锥面、球面等,无法精确地用多项式表达。例如,
x
y
xy
xy平面上圆心在原点的单位圆周无法用多项式坐标函数精确地表示。由经典数学可知,包括圆在内的所有二次曲线,都可以用有理函数(即两个多项式相除)来表示,事实上,他们可以用如下形式的有理函数来表示。
x ( u ) = X ( u ) W ( u ) , y ( u ) = Y ( u ) W ( u ) ( 1.13 ) x(u)=\frac{X(u)}{W(u)},\quad y(u)=\frac{Y(u)}{W(u)}\quad(1.13) x(u)=W(u)X(u),y(u)=W(u)Y(u)(1.13)
其中, X ( u ) X(u) X(u), Y ( u ) Y(u) Y(u)和 W ( u ) W(u) W(u)为多项式,由(1.13)式可见,每个坐标函数都具有相同的分母。
圆心在原点、半径为1的圆可以表示为
x
(
u
)
=
1
−
u
2
1
+
u
2
,
y
(
u
)
=
2
u
1
+
u
2
x(u)=\frac{1-u^2}{1+u^2},\quad y(u)=\frac{2u}{1+u^2}
x(u)=1+u21−u2,y(u)=1+u22u
中心在原点,长轴为
y
y
y周、短轴为
x
x
x轴,长、短半径分别为2和1的椭圆为
x
(
u
)
=
1
−
u
2
1
+
u
2
,
y
(
u
)
=
4
u
1
+
u
2
x(u)=\frac{1-u^{2}}{1+u^{2}},\quad y(u)=\frac{4u}{1+u^{2}}
x(u)=1+u21−u2,y(u)=1+u24u
中心在
P
=
(
0
,
4
/
3
)
P=(0, 4/3)
P=(0,4/3),横截轴(transverse axis)为
y
y
y轴的双曲线可表示为
x
(
u
)
=
−
1
+
2
u
1
+
2
u
−
2
u
2
,
y
(
u
)
=
4
u
(
1
−
u
)
1
+
2
u
−
2
u
2
x(u)=\frac{-1+2u}{1+2u-2u^2},\quad y(u)=\frac{4u(1-u)}{1+2u-2u^2}\quad
x(u)=1+2u−2u2−1+2u,y(u)=1+2u−2u24u(1−u)
其中,下面的那个分支(顶点为
P
=
(
0
,
2
/
3
)
P=(0,2/3)
P=(0,2/3))对应于
u
∈
(
1
−
3
2
,
1
+
3
2
)
u\in\left(\frac{1-\sqrt{3}}{2},\frac{1+\sqrt{3}}{2}\right)
u∈(21−3,21+3)。
顶点在原点,对称轴为y轴的抛物线可表示为
x
(
u
)
=
u
y
(
u
)
=
u
2
x(u)=u\quad y(u)=u^2
x(u)=uy(u)=u2
n
n
n次有理Bezier曲线的定义为
C
(
u
)
=
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
P
i
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
,
0
⩽
u
⩽
1
(
1.14
)
\mathbf{C}(u)=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i\mathbf{P_i}}{\sum\limits_{i=0}^n B_{i,n}(u)w_i},\quad0\leqslant u\leqslant1 \quad (1.14)
C(u)=i=0∑nBi,n(u)wii=0∑nBi,n(u)wiPi,0⩽u⩽1(1.14)
其中,
P
i
=
(
x
i
,
y
i
,
z
i
)
P_i=(x_i,y_i,z_i)
Pi=(xi,yi,zi)和
B
i
,
n
(
u
)
B_{i,n}(u)
Bi,n(u)同前,
w
i
w_i
wi是标量,称为权因子(weight),于是分母
W
(
u
)
=
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
W(u)=\sum\limits_{i=0}^n B_{i,n}\left(u\right)w_i
W(u)=i=0∑nBi,n(u)wi是普通的标量函数,除特别声明外,我们假设对所有的
i
i
i均有
w
i
>
0
w_i>0
wi>0。在此假设下,对所有的
u
∈
[
0
,
1
]
u\in\begin{bmatrix}0,1\end{bmatrix}
u∈[0,1]有
W
(
u
)
>
0
W(u)>0
W(u)>0。(1.14)式也可以写成
C
(
u
)
=
∑
i
=
0
n
R
i
,
n
(
u
)
P
i
,
0
⩽
u
⩽
1
(
1
,
15
)
\mathbf{C}(u)=\sum\limits_{i=0}^{n}R_{i,n}(u)\mathbf{P}_{i},\quad0\leqslant u\leqslant1\quad(1,15)
C(u)=i=0∑nRi,n(u)Pi,0⩽u⩽1(1,15)
其中
R
i
,
n
(
u
)
=
w
i
B
i
,
n
(
u
)
∑
j
=
0
n
w
j
B
j
,
n
(
u
)
{R}_{i,n}(u)=\frac{w_iB_{i,n}(u)}{\sum\limits_{j=0}^n w_jB_{j,n}(u)}
Ri,n(u)=j=0∑nwjBj,n(u)wiBi,n(u),
R
i
,
n
(
u
)
R_{i,n}(u)
Ri,n(u)是这种形式的曲线的有理基函数。
由(1.15)式和 B i , n ( u ) B_{i,n}(u) Bi,n(u)的性质容易得到 R i , n ( u ) R_{i,n}(u) Ri,n(u)具有如下性质:
- 非负性: R i , n ( u ) ⩾ 0 R_{i,n}(u)\geqslant0 Ri,n(u)⩾0,对所有的 i i i, n n n和 0 ⩽ u ⩽ 1 0\leqslant u \leqslant1 0⩽u⩽1。
- 规范性: ∑ i = 0 n R i , n ( u ) = 1 \sum\limits_{i=0}^{n}R_{i,n}(u) = 1 i=0∑nRi,n(u)=1,对所有的 0 ⩽ u ⩽ 1 0\leqslant u \leqslant1 0⩽u⩽1。
- 端点性质: R 0 , n ( 0 ) = R n , n ( 1 ) = 1 R_{0,n}(0)=R_{n,n}(1)=1 R0,n(0)=Rn,n(1)=1。
- 最大值 R i , n ( u ) R_{i,n}(u) Ri,n(u)在区间 [ 0 , 1 ] [0,1] [0,1]内只达到最大值一次。
- 如果 w i = 1 w_i=1 wi=1对所有的 i i i成立,则 R i , n ( u ) = B i , n ( u ) R_{i,n}(u) = B_{i,n}(u) Ri,n(u)=Bi,n(u),即 B i , n ( u ) B_{i,n}(u) Bi,n(u)是 R i , n ( u ) R_{i,n}(u) Ri,n(u)的特例。
由有理基函数的上述性质容易推导出有理Bezier曲线具有如下几何性质:
- 凸包性:曲线包含在定义它的控制点 { P i } \{P_i\} {Pi}的凸包内。
- 仿射变换不变性:对有理Bezier曲线进行旋转、平移和缩放变换,其表达形式不变,只是控制点发生了改变;新的控制点可以通过对原控制点作变换得到。即:要对有理Bezier曲线进行仿射变换,只需对其控制点作该变换即可。
- 变差减少性:和多项式Bezier曲线相同。
- 端点插值性: C ( 0 ) = P 0 C(0)=P_0 C(0)=P0, C ( 1 ) = P n C(1)=P_n C(1)=Pn。
- 在 u = 0 ( u = 1 ) u=0(u=1) u=0(u=1)处的 k k k阶导矢只依赖于开始的(最后的) k + 1 k+1 k+1个控制点和权因子;特别地, C ′ ( 0 ) C^{\prime}(0) C′(0)和 C ′ ( 1 ) C^{\prime}(1) C′(1)分别平行于 P 1 − P 0 P_1-P_0 P1−P0和 P n − P n − 1 P_n-P_{n-1} Pn−Pn−1。
- 多项式Bezier曲线是有理Bezier曲线的特例。
坐标函数形如(1.13)式(即:具有相同的分母)的有理曲线具有一种很好的几何解释,因而可以对其进行高效的处理和紧凑的存储。其思想是利用齐次坐标,用
n
+
1
n+1
n+1维空间中的多项式曲线来表示
n
n
n维空间中的一条有理曲线。三维Euclidcan空间中的一个点
P
=
(
x
,
y
,
z
)
P=(x,y,z)
P=(x,y,z)。采用齐次坐标,
P
P
P可以用四维空间中的点
P
w
=
(
w
x
,
w
y
,
x
z
,
w
)
=
(
X
,
Y
,
Z
,
W
)
(
w
≠
0
)
P^w=(wx,wy,xz,w)=(X,Y,Z,W) (w\neq0)
Pw=(wx,wy,xz,w)=(X,Y,Z,W)(w=0)来表示。
P
P
P可由
P
w
P^w
Pw的各个坐标分量除以第四个分量
W
W
W得到,即:由原点出发将
P
w
P^w
Pw映射到超平面
W
=
1
W=1
W=1上。这个映射就是(投影)中心在原点的透视投影,我们将其记为
H
H
H。于是
P
=
H
{
P
w
}
=
H
{
(
X
,
Y
,
Z
,
W
)
}
=
{
(
X
W
,
Y
W
,
Z
W
)
,
W
≠
0
direction
(
X
,
Y
,
Z
)
,
W
=
0
(
1.15
)
\mathbf{P}=H\lbrace\mathbf{P}^{w}\rbrace=H\lbrace(X,Y,Z,W)\rbrace=\begin{cases}\left(\frac{X}{W},\frac{Y}{W},\frac{Z}{W}\right), W\neq0\\ \text{direction}(X,Y,Z), W=0\end{cases} \quad (1.15)
P=H{Pw}=H{(X,Y,Z,W)}={(WX,WY,WZ),W=0direction(X,Y,Z),W=0(1.15)
注意,对于任意
x
,
y
,
z
,
w
1
,
w
2
,
w
1
≠
w
2
x,y,z,w_1,w_2,w_1\neq w_2
x,y,z,w1,w2,w1=w2,
H
{
p
w
1
}
=
H
{
(
w
1
x
,
w
1
y
,
w
1
z
,
w
1
)
}
=
(
x
,
y
,
z
)
=
H
{
(
w
2
x
,
w
2
y
,
w
2
z
,
w
2
)
}
=
H
{
P
u
2
}
\begin{aligned}\\H\left\{\mathbf{p}^{w_{1}}\right\} =H\{(w_{1}x,w_{1}y,w_{1}z,w_{1})\}=(x,y,z) \\=H\{(w_{2}x,w_{2}y,w_{2}z,w_{2})\}=H\{\mathbf{P}^{u_{2}}\}\end{aligned}
H{pw1}=H{(w1x,w1y,w1z,w1)}=(x,y,z)=H{(w2x,w2y,w2z,w2)}=H{Pu2}
即:一个点的齐次坐标是不唯一的。
假设给定控制点
{
P
i
}
\{P_i\}
{Pi},权因子
{
w
i
}
\{w_i\}
{wi},我们构造带权控制点
P
i
w
=
(
w
i
x
i
,
w
i
y
i
,
w
i
z
i
,
w
i
)
P^{w}_{i} =(w_ix_i,w_iy_i,w_iz_i,w_i)
Piw=(wixi,wiyi,wizi,wi),然后在四维空间中定义非有理(即多项式)Bezier曲线
C
w
(
u
)
=
∑
i
=
0
n
B
i
,
n
(
u
)
P
i
w
(
1.17
)
\mathbf{C}^w(u)=\sum\limits_{i=0}^n B_{i,n}(u)\mathbf{P}_i^w \quad (1.17)
Cw(u)=i=0∑nBi,n(u)Piw(1.17)
将透视投影变换
H
H
H应用于
C
w
(
u
)
{C}^w(u)
Cw(u),即可得到(1.14)式中对应的有理Bezier曲线。事实上,写出(1.17)式的各个坐标函数,有
x
(
u
)
=
X
(
u
)
W
(
u
)
=
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
x
i
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
x(u)=\frac{X(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i x_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i}
x(u)=W(u)X(u)=i=0∑nBi,n(u)wii=0∑nBi,n(u)wixi
y ( u ) = Y ( u ) W ( u ) = ∑ i = 0 n B i , n ( u ) w i y i ∑ i = 0 n B i , n ( u ) w i y(u)=\frac{Y(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i y_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i} y(u)=W(u)Y(u)=i=0∑nBi,n(u)wii=0∑nBi,n(u)wiyi
z ( u ) = Z ( u ) W ( u ) = ∑ i = 0 n B i , n ( u ) w i z i ∑ i = 0 n B i , n ( u ) w i z(u)=\frac{Z(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i z_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i} z(u)=W(u)Z(u)=i=0∑nBi,n(u)wii=0∑nBi,n(u)wizi
最后,写成矢量形式,有
C
(
u
)
=
(
x
(
u
)
,
y
(
u
)
,
z
(
u
)
)
=
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
(
x
i
,
y
i
,
z
i
)
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
=
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
P
i
∑
i
=
0
n
B
i
,
n
(
u
)
w
i
(
1.18
)
\mathbf{C}(u)=\left(x(u),y(u),z(u)\right) \\=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i(x_i,y_i,z_i)}{\sum\limits_{i=0}^n B_{i,n}(u)w_i}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_iP_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_{i}}\quad(1.18)
C(u)=(x(u),y(u),z(u))=i=0∑nBi,n(u)wii=0∑nBi,n(u)wi(xi,yi,zi)=i=0∑nBi,n(u)wii=0∑nBi,n(u)wiPi(1.18)
算法实现过程中主要采用(1.17)。因此,在四维空间中来处理有理曲线,最后,应用映射
H
H
H得到三维空间的结果。
取固定的
u
0
u_0
u0,由于
C
w
(
u
0
)
C^w(u_0)
Cw(u0)是多项式Bezier曲线,我们可以用deCasteljau算法来计算
C
w
(
u
0
)
C^w(u_0)
Cw(u0);然后,利用
C
(
u
0
)
=
H
{
C
u
(
u
0
)
}
\mathbf{C}(u_{0})=H\{\mathbf{C}^{u}(u_{0})\}
C(u0)=H{Cu(u0)}来计算
C
(
u
0
)
C(u_0)
C(u0)。因此,对
{
P
i
w
}
\{P_i^w\}
{Piw}应用(1.12)式,有
P
k
,
i
w
=
(
1
−
u
0
)
P
k
−
1
,
i
w
+
u
0
P
k
−
1
,
i
+
1
w
,
i
=
0
,
1
,
⋯
,
n
−
k
;
k
=
1
,
2
,
⋯
,
n
(
1.19
)
\mathbf{P}_{k,i}^w=(1-u_0)\mathbf{P}_{k-1,i}^w+u_0\mathbf{P}_{k-1,i+1}^w,\quad i=0,1,\cdots,n-k;k=1,2,\cdots,n\quad(1.19)
Pk,iw=(1−u0)Pk−1,iw+u0Pk−1,i+1w,i=0,1,⋯,n−k;k=1,2,⋯,n(1.19)
再考虑二维圆弧(第一象限的四分之一圆),有
P
0
=
(
1
,
0
)
P_0=(1,0)
P0=(1,0),
P
1
=
(
1
,
1
)
P_1=(1,1)
P1=(1,1),
P
2
=
(
0
,
1
)
P_2=(0,1)
P2=(0,1),
w
0
=
1
w_0=1
w0=1,
w
1
=
1
w_1=1
w1=1,
w
2
=
2
w_2=2
w2=2。因此,(1.17)式中的三维控制点是
P
0
w
=
(
1
,
0
,
1
)
\mathbf{P}_{0}^{w}=(1,0,1)
P0w=(1,0,1),
P
1
w
=
(
1
,
1
,
1
)
\mathbf{P}_{1}^{w}=(1,1,1)
P1w=(1,1,1),
P
2
w
=
(
0
,
2
,
2
)
\mathbf{P}_{2}^{w}=(0,2,2)
P2w=(0,2,2)。于是
C
w
(
u
)
=
(
1
−
u
)
2
P
0
w
+
2
u
(
1
−
u
)
P
1
w
+
u
2
P
2
w
\mathbf{C}^{w}(u)=(1-u)^{2}\mathbf{P}_{0}^{w}+2u(1-u)\mathbf{P}_{1}^{w}+u^{2}\mathbf{P}_{2}^{w}
Cw(u)=(1−u)2P0w+2u(1−u)P1w+u2P2w是三维空间中非有理的抛物线弧,将其投影到平面
W
=
1
W=1
W=1上,即得到圆弧(第一象限的四分之一圆)。
圆弧
C
(
1
/
2
)
=
(
3
/
5
,
4
/
5
)
C(1/2)=(3/5,4/5)
C(1/2)=(3/5,4/5)并不是第一象限的四分之一圆弧的中点,即:参数化不是均匀的。由起点到
(
3
/
5
,
4
/
5
)
(3/5,4/5)
(3/5,4/5)的弧长比整个弧长的一半要长。这在直观上是正确的,对圆弧
C
(
u
)
C(u)
C(u)求导,会发现在起点处的速率是终点处的两倍。