Bezier曲线
一、 使用幂基来表达曲线
1、二次多项式曲线(抛物线)
f
(
t
)
=
a
t
2
+
b
t
+
c
f(t)=at^2+bt+c
f(t)=at2+bt+c
几何观点:系数顶点
基函数为这些顶点的组合权系数
缺点:
1、系数顶点与曲线本身无直观的联系:无几何意义!
2、不利于用户来交互修改曲线:设计建模
二、建模的两种形式
f ( t ) = a t 2 + b t + c f(t)=at^2+bt+c f(t)=at2+bt+c
1、重建
逆向工程:形状已经有了,将其“猜”出来
采样
→
\rightarrow
→拟合:需要函数空间足够丰富(表达能力够)
代数观点:{𝑎, 𝑏, 𝑐}作为基函数的组合权系数
2、设计
自由设计:凭空产生,或从一个简单的形状编辑得到
交互式编辑:几何直观性要好
几何观点:基函数
{
𝑡
2
,
𝑡
,
1
}
\{𝑡^2, 𝑡, 1\}
{t2,t,1}作为控制点的组合权系数
三、使用Bernstein基函数表达
f
(
t
)
=
(
1
1
)
t
2
+
(
−
2
0
)
t
+
(
1
0
)
→
f
(
t
)
=
(
1
0
)
(
1
−
t
)
2
+
(
0
0
)
2
t
(
1
−
t
)
+
(
0
1
)
t
2
f(t)= \left(\begin{matrix} 1 \\ 1 \end{matrix}\right)t^2+\left(\begin{matrix} -2 \\ 0 \end{matrix}\right)t+\left(\begin{matrix} 1\\ 0 \end{matrix}\right) \rightarrow f(t)=\left(\begin{matrix} 1 \\ 0 \end{matrix}\right)(1-t)^2+\left(\begin{matrix} 0 \\ 0 \end{matrix}\right)2t(1-t)+\left(\begin{matrix} 0\\ 1 \end{matrix}\right)t^2
f(t)=(11)t2+(−20)t+(10)→f(t)=(10)(1−t)2+(00)2t(1−t)+(01)t2
- 系数顶点与曲线关联性强,具有很好的几何意义
- 对于交互式曲线设计更直观
四、Bezier曲线
n次Bezier曲线:n+1个顶点
Bezier曲线的性质来源于Bernstein基函数的性质
(曲线是控制顶点的线性组合构成的,基函数提供了组合系数)
五、Bernstein基函数及Bezier曲线的性质
1、Bernstein基函数
Bernstein基函数:
{
B
0
(
n
)
,
B
1
(
n
)
,
⋯
,
B
n
(
n
)
}
\{B_0^{(n)},B_1^{(n)},\cdots,B_n^{(n)}\}
{B0(n),B1(n),⋯,Bn(n)}
𝑛次(𝑛+1)阶Bernstein基函数:
B
i
(
n
)
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
=
B
第
i
个
基
函
数
(
d
e
g
r
e
e
)
B^{(n)}_i(t)=\left(\begin{matrix} n \\ i \end{matrix}\right) t^i (1-t)^{n-i}=B^{(degree)}_{第i个基函数}
Bi(n)(t)=(ni)ti(1−t)n−i=B第i个基函数(degree)
对称性:
1、
B
i
(
n
)
(
t
)
=
B
n
−
i
(
n
)
(
1
−
t
)
B^{(n)}_i(t)=B^{(n)}_{n-i}(1-t)
Bi(n)(t)=Bn−i(n)(1−t)
2、
B
i
(
n
)
(
t
)
B^{(n)}_i(t)
Bi(n)(t)在
t
=
i
n
t=\frac{i}{n}
t=ni达到最大值
2、性质
1、正性(非负性)+权性
- B i ( n ) ( t ) ≥ 0 , ∀ t ∈ [ 0 , 1 ] B^{(n)}_i(t)\geq 0,\forall t \in[0,1] Bi(n)(t)≥0,∀t∈[0,1]
-
∑
i
=
1
n
B
i
(
n
)
(
t
)
=
1
,
∀
t
∈
[
0
,
1
]
\sum^n_{i=1}B^{(n)}_i(t)=1,\forall t \in[0,1]
∑i=1nBi(n)(t)=1,∀t∈[0,1]
⇓ \Downarrow ⇓
Bezier曲线的凸包性
2、基性
- B = { B ( n ) 0 , B ( n ) 1 , ⋯ , B ( n ) n } B=\{B^(n)_0,B^(n)_1,\cdots,B^(n)_n\} B={B(n)0,B(n)1,⋯,B(n)n}是次数不高于n的多项式集合(空间)的一组基
- 与幂基可以相互线性表达:
3、递推公式
- 基函数的递推公式
B i ( n ) ( t ) = ( 1 − t ) B i ( n − 1 ) ( t ) + t B i − 1 ( n − 1 ) ( 1 − t ) B^{(n)}_i(t) = (1-t)B^{(n-1)}_i(t)+tB^{(n-1)}_{i-1}(1-t) Bi(n)(t)=(1−t)Bi(n−1)(t)+tBi−1(n−1)(1−t)
B 0 0 ( t ) = 1 , B i n ( t ) = 1 , i ∉ { 0 , ⋯ , n } B^{0}_0(t) =1,B^{n}_i(t) =1,i \notin \{0,\cdots,n\} B00(t)=1,Bin(t)=1,i∈/{0,⋯,n}
由 ( n − 1 i ) + ( n − 1 i − 1 ) = ( n i ) \left(\begin{matrix} n-1 \\ i \end{matrix}\right) +\left(\begin{matrix} n-1 \\ i-1 \end{matrix}\right)=\left(\begin{matrix} n\\ i \end{matrix}\right) (n−1i)+(n−1i−1)=(ni)可推导得到
高阶的基函数由2个低阶的基函数“升阶”得到利于保持一些良好的性质。
4、端点插值性
- B 0 n ( t ) = 0 , B 1 n ( 0 ) = ⋯ = B n n ( 0 ) = 0 B^{n}_0(t) =0,B^{n}_1(0)=\cdots=B^{n}_n(0)=0 B0n(t)=0,B1n(0)=⋯=Bnn(0)=0
-
B
0
n
(
t
)
=
⋯
=
B
n
−
1
n
(
0
)
=
0
,
B
n
n
(
0
)
=
1
B^{n}_0(t) =\cdots=B^{n}_{n-1}(0)=0,B^{n}_n(0)=1
B0n(t)=⋯=Bn−1n(0)=0,Bnn(0)=1
⇓ \Downarrow ⇓ - Bezier曲线经过首末两个控制顶点 p 0 , p n p_0,p_n p0,pn
5、导数
- d d t B i n ( t ) = n [ B i − 1 n − 1 ( t ) − B i n − 1 ( t ) ] \frac{d}{dt}B^{n}_i(t)=n[B^{n-1}_{i-1}(t)-B^{n-1}_i(t)] dtdBin(t)=n[Bi−1n−1(t)−Bin−1(t)]
- d 2 d t 2 B i n ( t ) = n ( n − 1 ) [ B i − 2 n − 2 ( t ) − 2 B i − 1 n − 2 ( t ) + B i n − 2 ( t ) ] \frac{d^2}{dt^2}B^{n}_i(t)=n(n-1)[B^{n-2}_{i-2}(t)-2B^{n-2}_{i-1}(t)+B^{n-2}_{i}(t)] dt2d2Bin(t)=n(n−1)[Bi−2n−2(t)−2Bi−1n−2(t)+Bin−2(t)]
- Bezier曲线的导数(切线)
p 0 , ⋯ , p n , f ( t ) = ∑ i = 0 n B i n ( t ) p i p_0,\cdots,p_n,f(t)=\sum^n_{i=0}B^n_i(t)p_i p0,⋯,pn,f(t)=∑i=0nBin(t)pi- f ′ ( t ) = n ∑ i = 0 n − 1 B i n − 1 ( t ) ( p i + 1 − p i ) f^{'}(t)=n\sum^{n-1}_{i=0}B^{n-1}_i(t)(p_{i+1}-p_i) f′(t)=n∑i=0n−1Bin−1(t)(pi+1−pi)
- f [ r ] ( t ) = n ! ( n − r ) ! ∑ i = 0 n − r B i n − 1 ( t ) ⋅ △ r p i f^{[r]}(t)=\frac{n!}{(n-r)!}\sum^{n-r}_{i=0}B^{n-1}_i(t) \cdot \triangle^r p_i f[r](t)=(n−r)!n!∑i=0n−rBin−1(t)⋅△rpi
- 端点性质
端点插值:
f ( 0 ) = p 0 , f ( 1 ) = p n f(0)=p_0,f(1)=p_n f(0)=p0,f(1)=pn
切线方向与边相同:
f ′ ( 0 ) = n [ p 1 − p 0 ] f^{'}(0)=n[p_1-p_0] f′(0)=n[p1−p0]
f ′ ( 1 ) = n [ p n − 1 − p n ] f^{'}(1)=n[p_{n-1}-p_{n}] f′(1)=n[pn−1−pn]
2阶(k)切线与3点(k+1)相关:
f ′ ′ ( 0 ) = n ( n − 1 ) [ p 2 − 2 p 1 + p 0 ] f^{''}(0)=n(n-1)[p_2-2p_1+p_0] f′′(0)=n(n−1)[p2−2p1+p0]
f ′ ′ ( 1 ) = n ( n − 1 ) [ p n − 2 p n − 1 + p n − 2 ] f^{''}(1)=n(n-1)[p_n-2p_{n-1}+p_{n-2}] f′′(1)=n(n−1)[pn−2pn−1+pn−2]6、升阶
- ( 1 − t ) B i n ( t ) = ( 1 − i n + 1 ) B i n + 1 ( t ) (1-t)B^{n}_i(t)=(1-\frac{i}{n+1})B^{n+1}_i(t) (1−t)Bin(t)=(1−n+1i)Bin+1(t)
- t B i n ( t ) = i + 1 n + 1 B i n + 1 ( t ) tB^{n}_i(t)=\frac{i+1}{n+1}B^{n+1}_i(t) tBin(t)=n+1i+1Bin+1(t)
六、Bezier曲线的de Casteljau算法
- 计算Bezier曲线 x ( t ) x(t) x(t)上参数为t的点
- 良好的几何意义:该点将曲线一分两条子Bezier曲线,其控制顶点是中间生成的点
- 可用于Bezier曲线的离散及求根等许多应用
七、几何样条曲线
1、用分段Bezier曲线来插值型值点
- 分段Bezier曲线来插值型值点
• 给定型值点: k 0 , ⋯ , k n ∈ R 3 k_0,\cdots,k_n \in R^3 k0,⋯,kn∈R3
• 每两点间生成一段Bezier曲线,使得整体曲线满足一定的连续性 ( C 0 , C 1 , C 2 ) (C^0,C^1,C^2) (C0,C1,C2)