曲线
光滑曲线
定义
当曲线上的每一点处都有切线,并且切线随切点的移动而连续转动,这样的曲线称为光滑曲线。
充分条件
-
设平面曲线 C C C由参数方程 x = x ( t ) , y = y ( t ) , t ∈ [ α , β ] x=x(t),y=y(t),t\in[\alpha,\beta] x=x(t),y=y(t),t∈[α,β]给出。若 x ( t ) x(t) x(t)与 y ( t ) y(t) y(t)在[α,β]上连续可微。 x ′ ( t ) x\prime(t) x′(t)与 y ′ ( t ) y\prime(t) y′(t)不同时为零,即 x ′ ( t ) 2 + y ′ ( t ) 2 ≠ 0 , t ∈ [ α , β ] x^\prime(t)^2+y^\prime(t)^2\ne0,t\in[\alpha,\beta] x′(t)2+y′(t)2=0,t∈[α,β],则称 C C C一条光滑曲线。
y = x 3 y=x^3 y=x3对应的参数曲线 x = t , y = t 3 , t ∈ [ α , β ] x=t,y=t^3,t\in[\alpha,\beta] x=t,y=t3,t∈[α,β],虽然不满足 x ′ ( 0 ) 2 + y ′ ( 0 ) 2 ≠ 0 , t ∈ [ α , β ] x^\prime(0)^2+y^\prime(0)^2\ne0,t\in[\alpha,\beta] x′(0)2+y′(0)2=0,t∈[α,β],但该曲线是光滑的
-
若函数 f ( x ) f(x) f(x)在区间 [ α , β ] [\alpha,\beta] [α,β]内具有一阶连续导数,则其对应的图形称之为光滑曲线。
y = f ( x ) = R 2 − x 2 , x ∈ [ − R , R ] y=f(x)=\sqrt{R^2-x^2},x\in[-R,R] y=f(x)=R2−x2,x∈[−R,R]的参数方程可以表示为 x = R cos ( t ) , y = R sin ( t ) , t ∈ [ − R , R ] x=R\cos(t),y=R\sin(t),t\in[-R,R] x=Rcos(t),y=Rsin(t),t∈[−R,R],由参数方程可得知其为光滑曲线。但 y ′ = f ′ ( x ) = − x R 2 − x 2 , x ∈ [ − R , R ] y^\prime=f^\prime(x)=-\frac{x}{\sqrt{R^2-x^2}},x\in[-R,R] y′=f′(x)=−R2−x2x,x∈[−R,R]在 − R -R −R, R R R处不连续。
曲率
曲线的弯曲程度,切线转角与弧长关系的微分绝对值,即切线转角 Δ α \Delta\alpha Δα与弧长 Δ s \Delta s Δs之比的绝对值。记作 K = lim Δ s → 0 ∣ Δ α Δ s ∣ K=\lim_{\Delta s\rightarrow0} |{\Delta\alpha \over \Delta s}| K=limΔs→0∣ΔsΔα∣。
设曲线方程为 y = f ( x ) y=f(x) y=f(x),曲率公式为 K = y ′ ′ ( 1 + y ′ 2 ) 3 2 ∣ x = x 0 K=\frac{y^{\prime\prime}}{(1+{y^\prime}^2)^\frac{3}{2}}|x=x_0 K=(1+y′2)23y′′∣x=x0
设曲线是参数方程 { x = x ( t ) y = y ( t ) ∣ t ∈ [ α , β ] \begin{cases}x=x(t)\\y=y(t)\end{cases}|t\in[\alpha,\beta] {x=x(t)y=y(t)∣t∈[α,β],曲率公式为 K = x ′ ( t ) y ′ ′ ( t ) − x ′ ′ ( t ) y ′ ( t ) [ x ′ ( t ) 2 + y ′ ( t ) 2 ] 3 2 K=\frac{x^\prime(t)y^{\prime\prime}(t)-x^{\prime\prime}(t)y^\prime(t)}{[x^\prime(t)^2+y^\prime(t)^2]^\frac{3}{2}} K=[x′(t)2+y′(t)2]23x′(t)y′′(t)−x′′(t)y′(t)
相关概念引申
曲线上点 M M M处的曲率倒数称作曲线在改点的曲率半径,记作 ρ \rho ρ, ρ = 1 K = ( 1 + y ′ 2 ) 3 2 y ′ ′ ∣ x = x 0 \rho={1 \over K}=\frac{(1+{y^\prime}^2)^\frac{3}{2}}{y^{\prime\prime}}|x=x_0 ρ=K1=y′′(1+y′2)23∣x=x0。
在点
M
M
M处做曲率的法线的某一侧取点
D
D
D,使得
∣
D
M
∣
=
ρ
|DM|=\rho
∣DM∣=ρ,以
D
D
D为圆心,以
ρ
\rho
ρ为半径作圆。该圆称作曲线在点
M
M
M处的曲率圆(密切圆),圆心
D
D
D称作曲线在M
处的曲率中心。曲率中心
(
a
,
b
)
(a,b)
(a,b)的计算公式
a
=
x
0
−
f
′
(
x
0
)
1
+
f
′
(
x
0
)
2
f
′
′
(
x
0
)
a=x_0-f^\prime(x_0)\frac{1+f^\prime(x_0)^2}{f^{\prime\prime}(x_0)}
a=x0−f′(x0)f′′(x0)1+f′(x0)2,
b
=
f
(
x
0
)
+
1
+
f
′
(
x
0
)
2
f
′
′
(
x
0
)
b=f(x_0)+\frac{1+f^{\prime}(x_0)^2}{f^{\prime\prime}(x_0)}
b=f(x0)+f′′(x0)1+f′(x0)2
曲率圆(密切圆)与曲线在 M M M邻近有相同的凹向。在实际设计计算中,常用密切圆在点 M M M邻近的一段圆弧来近似代替曲线弧,以简化问题。
观察得知,圆上各点曲率半径为 R R R(盲猜这是曲率半径名词的由来),直线上各点曲率半径为 + ∞ +\infty +∞
应用
案例一
题目:使用圆柱形铣刀加工椭圆 x 2 4 0 2 + y 2 5 0 2 = 1 \frac{x^2}{40^2}+\frac{y^2}{50^2}=1 402x2+502y2=1工件,选用多大的铣刀可以得到好的效果?
解答:
- 通过观察,得知曲率最大的点位于 ( 0 , ± 50 ) (0,\pm50) (0,±50)
- 选取 ( 0 , 50 ) (0,50) (0,50),计算曲率半径得到32
- 选用直径64的圆柱形铣刀可得到较好的效果
案例二
题目:激光加工时,即需要快也需要稳,如何实现
解答:
- 计算出各个点的曲率信息
- 速度规划时,使用曲率信息,即曲率大的地方速度规划小,曲率小的地方速度规划大
曲线数学理论
Weierstrass
逼近定理
曲线是一种几何图形,由笛卡尔几何可得知,其必然对应一方程 f ( x , y ) = 0 f(x,y)=0 f(x,y)=0。
1885年Weierstrass
提出逼近定理,1927年被美国数学家Stone
首次证明,又称Stone-Weierstrass
逼近定理:
- 设 f ( x ) f(x) f(x)是 [ a , b ] [a,b] [a,b]上的连续函数,则必存在多项式函数列 f n ( x ) {f_n(x)} fn(x),使得 f n ( x ) f_n(x) fn(x)一致收敛于 f ( x ) f(x) f(x)。
- 设
f
(
x
)
f(x)
f(x)是
[
a
,
b
]
[a,b]
[a,b]上的周期性连续函数,则必可用三角函数级数一致逼近。(傅里叶变换
Fourier Transform
)
y = f ( x ) = ∑ i = 0 n a i f i ( x ) = [ a 0 a 1 … a n ] [ f 0 ( x ) f 1 ( x ) ⋮ f n ( x ) ] = [ a 0 a 1 … a n ] [ β 0 , k ( x ) β 1 , k ( x ) ⋮ β n , k ( x ) ] y=f(x)=\sum_{i=0}^na_if_i(x)= \left[ \begin{matrix} a_0&a_1&\ldots&a_n \end{matrix} \right] \left[ \begin{matrix} f_0(x)\\ f_1(x)\\ \vdots\\ f_n(x) \end{matrix} \right]=\left[ \begin{matrix} a_0&a_1&\ldots&a_n \end{matrix} \right] \left[ \begin{matrix} \beta_{0,k}(x)\\ \beta_{1,k}(x)\\ \vdots\\ \beta_{n,k}(x) \end{matrix} \right] y=f(x)=i=0∑naifi(x)=[a0a1…an] f0(x)f1(x)⋮fn(x) =[a0a1…an] β0,k(x)β1,k(x)⋮βn,k(x)
β i , k \beta_{i,k} βi,k表征序号 i i i的不高于 k k k次多项式。
曲线方程 f ( x , y ) = 0 f(x,y)=0 f(x,y)=0分析
- 单值方程:即一个 x x x有唯一的 y y y与之对应,可以直接表征为 y = f ( x ) y=f(x) y=f(x)
- 多值方程:即一个 x x x有多个的 y y y与之对应,则可引入隐形参数 t t t得到 f ( x ( t ) , y ( t ) ) = 0 f(x(t),y(t))=0 f(x(t),y(t))=0。从而演变成两个连续函数 { x = x ( t ) y = y ( t ) \begin{cases}x=x(t)\\y=y(t)\end{cases} {x=x(t)y=y(t)(隐形参数函数同样适用单值方程)
至此,理论论证了对于任意曲线,均可以由多项式函数逼近。也即通过给定一组特征点可以由多项式函数表达一条曲线。
Bernstein
伯恩施坦多项式
定义
Bernstein
在证明Weierstrass
逼近定理中深入研究,提出了伯恩施坦多项式
{
B
n
(
t
)
=
∑
k
=
0
n
b
k
,
n
(
t
)
b
k
n
(
t
)
=
C
n
k
t
k
(
1
−
t
)
n
−
k
C
n
k
=
n
!
k
!
(
n
−
k
)
!
∣
0
0
=
0
\begin{cases} B_n(t)=\sum_{k=0}^nb_{k,n}(t)\\ b_k^n(t)=C_n^kt^k(1-t)^{n-k}\\ C_n^k={{n!} \over {k!(n-k)!}}|{0 \over 0}=0 \end{cases}
⎩
⎨
⎧Bn(t)=∑k=0nbk,n(t)bkn(t)=Cnktk(1−t)n−kCnk=k!(n−k)!n!∣00=0
从定义中可以得知共有
n
+
1
n+1
n+1个伯恩施坦多项式基函数,为方便起见,令
b
i
n
=
0
∣
∀
i
<
0
⋃
∀
i
>
n
b_i^n=0|\forall i<0 \bigcup \forall i > n
bin=0∣∀i<0⋃∀i>n
基函数概率解释
做独立可重复一个实验,成功的概率是
t
t
t。若连续重复
n
n
n次,正好成功
k
k
k次的概率。
该理解可以得知
lim
n
→
∞
b
k
n
(
t
)
\lim_{n\rightarrow\infty}b_k^n(t)
limn→∞bkn(t)仅在
k
/
n
=
t
k/n=t
k/n=t时达到峰值(图中为
t
=
0.4
t=0.4
t=0.4),并且快速向两侧衰减,该性质称之为尖峰,是非常重要的特性。
由于这种性质,Bernstein
多项式可以很自然地组合成近似于
[
0
,
1
]
[0,1]
[0,1]上的任何连续函数。给定这样一个函数
f
f
f,定义一个近似值
B
n
[
f
]
Bn[f]
Bn[f]为
B
n
[
f
]
(
t
)
=
∑
k
=
0
n
f
(
k
n
)
b
n
,
k
(
t
)
B_n[f](t)=\sum_{k=0}^nf(\frac{k}{n})b_{n,k}(t)
Bn[f](t)=∑k=0nf(nk)bn,k(t),且随着
n
→
∞
n\rightarrow\infty
n→∞,该多项式将一致收敛到原函数
f
f
f(即证明了Weierstrass
逼近定理)。
递归
b k n ( t ) = C n k t k ( 1 − t ) n − k = ( C n − 1 k + C n − 1 k − 1 ) t k ( 1 − t ) n − k = C n − 1 k t k ( 1 − t ) n − k + C n − 1 k − 1 t k ( 1 − t ) n − k = ( 1 − t ) C n − 1 k t k ( 1 − t ) n − 1 − k + t C n − 1 k − 1 t k − 1 ( 1 − t ) ( n − 1 ) − ( k − 1 ) = ( 1 − t ) b k n − 1 ( t ) + t b k − 1 n − 1 ( t ) \begin{aligned} b_k^n(t)&=C_n^kt^k(1-t)^{n-k}\\ &=\left(C_{n-1}^k+C_{n-1}^{k-1}\right)t^k(1-t)^{n-k}\\ &=C_{n-1}^kt^k(1-t)^{n-k}+C_{n-1}^{k-1}t^k(1-t)^{n-k}\\ &=(1-t)C_{n-1}^kt^k(1-t)^{n-1-k}+tC_{n-1}^{k-1}t^{k-1}(1-t)^{(n-1)-(k-1)}\\ &=(1-t)b_k^{n-1}(t)+tb_{k-1}^{n-1}(t) \end{aligned} bkn(t)=Cnktk(1−t)n−k=(Cn−1k+Cn−1k−1)tk(1−t)n−k=Cn−1ktk(1−t)n−k+Cn−1k−1tk(1−t)n−k=(1−t)Cn−1ktk(1−t)n−1−k+tCn−1k−1tk−1(1−t)(n−1)−(k−1)=(1−t)bkn−1(t)+tbk−1n−1(t)
伯恩斯坦多项式基函数的幂基表达
由于幂基 t 0 , t 1 , t 2 , … , t n {t^0,t^1,t^2,\ldots,t^n} t0,t1,t2,…,tn构成了次数小于或等于 n n n的多项式泛函空间,所以任何一个 n n n次伯恩斯坦多项式基函数都可以用幂基表示。
将牛顿二项式定理即
(
x
+
y
)
n
=
∑
i
=
0
n
C
n
i
x
i
y
n
−
i
(x+y)^n=\sum_{i=0}^nC_n^ix^iy^{n-i}
(x+y)n=∑i=0nCnixiyn−i代入伯恩斯多项式基函数得到
b
k
n
(
t
)
=
C
n
k
t
k
(
1
−
t
)
n
−
k
=
C
n
k
t
k
∑
i
=
0
n
−
k
1
n
−
i
C
n
−
k
i
(
−
t
)
i
=
C
n
k
t
k
∑
i
=
0
n
−
k
(
−
1
)
i
C
n
−
k
i
t
i
=
∑
i
=
0
n
−
k
(
−
1
)
i
C
n
k
C
n
−
k
i
t
i
+
k
=
∑
i
=
k
n
(
−
1
)
i
−
k
C
n
k
C
n
−
k
i
−
k
t
i
=
∑
i
=
k
n
(
−
1
)
i
−
k
C
n
i
C
i
k
t
i
\begin{aligned} b_k^n(t)&=C_n^kt^k(1-t)^{n-k}\\ &=C_n^kt^k\sum_{i=0}^{n-k}1^{n-i}C_{n-k}^i(-t)^i\\ &=C_n^kt^k\sum_{i=0}^{n-k}(-1)^iC_{n-k}^it^i\\ &=\sum_{i=0}^{n-k}(-1)^iC_n^kC_{n-k}^it^{i+k}\\ &=\sum_{i=k}^{n}(-1)^{i-k}C_n^kC_{n-k}^{i-k}t^i\\ &=\sum_{i=k}^{n}(-1)^{i-k}C_n^iC_{i}^{k}t^i\\ \end{aligned}
bkn(t)=Cnktk(1−t)n−k=Cnktki=0∑n−k1n−iCn−ki(−t)i=Cnktki=0∑n−k(−1)iCn−kiti=i=0∑n−k(−1)iCnkCn−kiti+k=i=k∑n(−1)i−kCnkCn−ki−kti=i=k∑n(−1)i−kCniCikti
矩阵表达
由递归公式,可以得知,伯恩施坦多项式可以由一组伯恩施坦基函数的线性组合
B
(
t
)
=
∑
k
=
0
n
a
k
b
k
n
(
t
)
=
[
b
0
n
(
t
)
b
1
n
(
t
)
…
b
n
n
(
t
)
]
[
a
0
a
1
⋮
a
n
]
=
[
t
0
t
1
…
t
n
]
[
b
0
0
0
0
…
0
b
0
1
b
1
1
0
…
0
⋮
⋮
⋮
⋱
⋮
b
0
n
b
1
n
b
2
n
⋯
b
n
n
]
[
a
0
a
1
⋮
a
n
]
\begin{aligned} B(t)&=\sum_{k=0}^na_kb_k^n(t)\\ &= \left[ \begin{matrix} b_0^n(t)&b_1^n(t)&\ldots & b_n^n(t) \end{matrix} \right] \left[ \begin{matrix} a_0 \\a_1 \\\vdots \\a_n \end{matrix} \right] \\ &= \left[ \begin{matrix} t^0&t^1& \ldots & t^n \end{matrix} \right] \left[ \begin{matrix} b_0^0&0&0&\ldots&0\\ b_0^1&b_1^1&0&\ldots&0\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ b_0^n&b_1^n&b_2^n&\cdots&b_n^n \end{matrix} \right] \left[ \begin{matrix} a_0 \\a_1 \\\vdots \\a_n \end{matrix} \right] \end{aligned}
B(t)=k=0∑nakbkn(t)=[b0n(t)b1n(t)…bnn(t)]
a0a1⋮an
=[t0t1…tn]
b00b01⋮b0n0b11⋮b1n00⋮b2n……⋱⋯00⋮bnn
a0a1⋮an
特性
此处没搞明白
- b k n ( t ) ∣ t ∈ [ 0 , 1 ] b_k^n(t)|t\in [0,1] bkn(t)∣t∈[0,1]非负性
- 单位剖分性
- 升阶
Bezier
曲线
1959年。当时就职于雪铁龙的法国数学家Paul de Casteljau
开始对Bernstein
多项式进行了图形化的尝试,并且提供了一种数值稳定的算法,实现很少的控制点生成复杂的平滑曲线。1962年,雷诺工程师Pierre Bézier
使用该方法辅助汽车车体工业设计得名Bezier
曲线。
贝塞尔为伯恩施坦多项式的应用(理论到应用,大部分情况下会做各种近似替换的尝试处理)。
推导
已知光滑曲线经过 P 0 , P 1 , … , P n {P_0,P_1,\ldots,P_n} P0,P1,…,Pn
设该曲线表征的函数为 f ( t ) = { x = x ( t ) y = y ( t ) f(t)=\begin{cases}x=x(t)\\y=y(t)\end{cases} f(t)={x=x(t)y=y(t)
则使用伯恩施坦多项式逼近 B n [ f ] ( t ) = ∑ k = 0 n f ( k n ) b k n ( t ) B_n[f](t)=\sum_{k=0}^nf({k \over n})b_k^n(t) Bn[f](t)=∑k=0nf(nk)bkn(t),
由伯恩施坦的尖峰特性,即 l i m n → + ∞ b k n ( t ) = { P K , k n = t 0 , k n ≠ t lim_{n \rightarrow +\infty}b_k^n(t)=\begin{cases}P_K,{k \over n}=t\\0,{k \over n}\ne t\end{cases} limn→+∞bkn(t)={PK,nk=t0,nk=t
可代入得到 B ( t ) = ∑ k = 0 n P k b k n ( t ) B(t)=\sum_{k=0}^n P_k b_k^n(t) B(t)=∑k=0nPkbkn(t)。
令 P k b k n ( t ) = P k n ( t ) P_kb_k^n(t)=P_k^n(t) Pkbkn(t)=Pkn(t)
进一步简化 B ( t ) = ∑ k = 0 n P k n ( t ) B(t)=\sum_{k=0}^nP_k^n(t) B(t)=∑k=0nPkn(t)
de Casteljau
递归
模仿伯恩施坦递归
b
k
n
(
t
)
=
(
1
−
t
)
b
k
n
−
1
(
t
)
+
t
b
k
−
1
n
−
1
(
t
)
b_k^n(t)=(1-t)b_k^{n-1}(t)+tb_{k-1}^{n-1}(t)
bkn(t)=(1−t)bkn−1(t)+tbk−1n−1(t),de Casteljau
提出贝塞尔的递归
P
k
n
(
t
)
=
(
1
−
t
)
P
k
n
−
1
(
t
)
+
t
P
k
+
1
n
−
1
(
t
)
P_k^n(t)=(1-t)P_k^{n-1}(t)+tP_{k+1}^{n-1}(t)
Pkn(t)=(1−t)Pkn−1(t)+tPk+1n−1(t),设定
P
k
0
(
t
)
=
P
k
P_k^0(t)=P_k
Pk0(t)=Pk。
对于上面的表达式,采用下图表示(图片盗自https://zhuanlan.zhihu.com/p/263749820)
上图最左侧为特征多边形的点(控制点)列表。
特性
-
n
+
1
n+1
n+1个控制点生成
n
n
n阶
Bezier
曲线 - 过首尾点,只逼近其他控制点,但不过。(引导过程中使用了 n → + ∞ n\rightarrow+\infty n→+∞,但实际上并不满足,且递归方程也发生了变异【此处的变异充满神奇】)
Bezier
曲线完全落在包含所有控制点的最小凸多边形内(在运动控制系统中,用于贝塞尔轨迹的碰撞检查的简化,否则需要采样,极度耗时)- 改变任意一个控制点,整条 B e z i e r Bezier Bezier曲线都会相应改变,但控制点对于附近影响最大,越远的点影响越小
- 仿射不变性:
Bezier
控制点与Bezier
曲线在整个坐标平面的仿射变换 x → A x + b x\rightarrow Ax+b x→Ax+b下(如旋转、平移等)均保持不变。(此处引出对称性) - 任意直线与
Bezier
曲线的交点个数,不超过该直线与控制多边形的交点个数
感性理解
N阶贝塞尔,表征点
t
∈
[
0
,
1
]
t\in [0,1]
t∈[0,1]时间内由第一个点走到最后一个点(也有做割角理解的),即如下图(网络盗图)
在t时刻,由控制点
P
0
,
P
1
P_0,P_1
P0,P1得到
P
10
P_{10}
P10,由控制点
P
1
,
P
2
P_1,P_2
P1,P2得到
P
11
P_{11}
P11,
P
10
,
P
11
P_{10},P_{11}
P10,P11得到
P
20
P_{20}
P20,经过
n
n
n次得到
n
n
n阶贝塞尔
t
t
t时刻的坐标。
B-Splines
样条
样条曲线是由给定的一组点而得到的一条光滑曲线。根据曲线经过这些给定的点还是逼近,分为插值样条和逼近样条。其数学核心在于使用分段低阶多项式连接组合表达连续的复杂曲线以取代高阶多项式组合(贝塞尔是高阶多项式,拉格朗日多项式也是高阶多项式,即随着点的变多,次数越来越高)。
插值样条
-
介绍
最初,样条曲线都是借助于物理样条得到的,放样员把富有弹性的柔性物体(细木条),用压铁固定在曲线应该通过的给定型值点处,样条做自然弯曲所绘制出来的曲线就是样条曲线。样条曲线不仅通过各有序型值点,并且在各型值点处的一阶和二阶导数连续,也即该曲线具有连续的、曲率变化均匀的特点。
-
数学表达
已知待插值函数
f
(
x
)
f(x)
f(x),已知节点
x
0
,
…
,
x
n
x_0,\ldots,x_n
x0,…,xn的函数值,按照相邻节点分段,获得
n
n
n个插值区间,每个区间内使用
k
k
k次多项式
s
i
(
x
)
s_i(x)
si(x)插值,使其满足插值条件与
k
−
1
k-1
k−1阶平滑性(
k
−
1
k-1
k−1阶导数连续):
{
S
i
(
x
i
)
=
f
(
x
i
)
,
S
i
(
x
i
+
1
)
=
f
(
x
i
+
1
)
,
0
≤
i
≤
n
−
1
S
i
(
j
)
(
x
i
+
1
)
=
S
i
+
1
(
j
)
(
x
i
+
1
)
,
0
≤
i
≤
n
−
2
,
1
≤
j
≤
k
−
1
∣
x
∈
{
x
0
,
…
,
x
n
}
\begin{cases}S_i(x_i)=f(x_i),S_i(x_{i+1})=f(x_{i+1}),0\le i\le n-1\\S_i^{(j)}(x_{i+1})=S_{i+1}^{(j)}(x_{i+1}),0\le i\le n-2,1\le j \le k-1\end{cases}|x\in \{x_0,\ldots,x_n\}
{Si(xi)=f(xi),Si(xi+1)=f(xi+1),0≤i≤n−1Si(j)(xi+1)=Si+1(j)(xi+1),0≤i≤n−2,1≤j≤k−1∣x∈{x0,…,xn}
-
应用场景
- 音频设计、视频融合、动画设计、动画融合、各种渲染效果融合
- 机械加工:补偿的曲线、速度曲线
-
基函数 S i ( x i ) S_i(x_i) Si(xi)选择以及求解示例
-
三次样条(盗图https://zhuanlan.zhihu.com/p/82619415)
对于 n + 1 n+1 n+1个节点 x 0 , … , x n x_0,\ldots ,x_n x0,…,xn一共 n n n个分段,即 4 n 4n 4n个未知数。其中每个分段两端的值已知,即存在 2 n 2n 2n个方程。因为一阶二阶导数连续,拥有 2 ( n − 1 ) 2(n-1) 2(n−1)个方程。还剩下两个条件,即 x 0 , x n x_0,x_n x0,xn的一阶二阶导数。此处存在不同设定- 自然边界: s ′ ′ ( x 0 ) = s ′ ′ ( x n ) = 0 s^{\prime\prime}(x_0)=s^{\prime\prime}(x_n)=0 s′′(x0)=s′′(xn)=0
- N o t − a − k n o t Not-a-knot Not−a−knot: { s ′ ′ ′ ( x 0 ) = s ′ ′ ′ ( x 1 ) s ′ ′ ′ ( x n − 1 ) = s ′ ′ ′ ( x n ) \begin{cases}s^{\prime\prime\prime}(x_0)=s^{\prime\prime\prime}(x_1)\\s^{\prime\prime\prime}(x_{n-1})=s^{\prime\prime\prime}(x_{n})\end{cases} {s′′′(x0)=s′′′(x1)s′′′(xn−1)=s′′′(xn)
- 固定边界: { s ′ ( x 0 ) = c 1 s ′ ( x n ) = c 2 \begin{cases}s^\prime(x_0)=c_1\\s^\prime(x_n)=c_2\end{cases} {s′(x0)=c1s′(xn)=c2
- 周期样条: { s ′ ( x 0 ) = s ′ ( x n ) s ′ ′ ( x 0 ) = s ′ ′ ( x n ) \begin{cases}s^\prime(x_0)=s^\prime(x_n)\\s^{\prime\prime}(x_0)=s^{\prime\prime}(x_n)\end{cases} {s′(x0)=s′(xn)s′′(x0)=s′′(xn)
对于多项式拟合,需要选择基函数,通过求解 A x = B Ax=B Ax=B计算基函数前面的系数。如果选择的基函数为 { 1 , x , x 2 , x 3 } \{1,x,x^2,x^3\} {1,x,x2,x3},A矩阵为范德蒙矩阵,此时可能会遇到条件数过高,导致解不稳定(方程无解)。所以,需要选择合适的基函数。
一般推荐
{ C 0 ( x ) = x 2 ( 3 − 2 x ) c 1 ( x ) = − x 2 ( 1 − x ) c 2 ( x ) = ( x − 1 ) 2 x c 3 ( x ) = 2 x 3 − 3 x 2 + 1 ∣ x ∈ [ 0 , 1 ] \begin{cases}C_0(x)=x^2(3-2x)\\c_1(x)=-x^2(1-x)\\c_2(x)=(x-1)^2x\\c_3(x)=2x^3-3x^2+1\end{cases}|x\in [0,1] ⎩ ⎨ ⎧C0(x)=x2(3−2x)c1(x)=−x2(1−x)c2(x)=(x−1)2xc3(x)=2x3−3x2+1∣x∈[0,1]
这组函数是线性不相关的。
{ C 0 ( 1 ) = 1 , C 0 ′ ( 1 ) = 0 , C 0 ′ ( 0 ) = 0 , C 0 ( 0 ) = 0 C 1 ( 1 ) = 0 , C 1 ′ ( 1 ) = 1 , C 1 ′ ( 0 ) = 0 , C 1 ( 0 ) = 0 C 2 ( 1 ) = 0 , C 2 ′ ( 1 ) = 0 , C 2 ′ ( 0 ) = 1 , C 0 ( 0 ) = 0 C 3 ( 1 ) = 0 , C 3 ′ ( 1 ) = 0 , C 3 ′ ( 0 ) = 0 , C 3 ( 0 ) = 1 \begin{cases}C_0(1)=1,C_0^\prime(1)=0,C_0^\prime(0)=0,C_0(0)=0\\C_1(1)=0,C_1^\prime(1)=1,C_1^\prime(0)=0,C_1(0)=0\\C_2(1)=0,C_2^\prime(1)=0,C_2^\prime(0)=1,C_0(0)=0\\C_3(1)=0,C_3^\prime(1)=0,C_3^\prime(0)=0,C_3(0)=1\end{cases} ⎩ ⎨ ⎧C0(1)=1,C0′(1)=0,C0′(0)=0,C0(0)=0C1(1)=0,C1′(1)=1,C1′(0)=0,C1(0)=0C2(1)=0,C2′(1)=0,C2′(0)=1,C0(0)=0C3(1)=0,C3′(1)=0,C3′(0)=0,C3(0)=1 -
逼近样条
通过控制点,逼近样条。一般用来构造物体的表面。
样条曲线是由一组折线组成的多边形构造出来的。简单地说,以数值计算的方法,用光滑的参数曲线段逼近该折线多边形,构造出一条样条曲线。改变该多边形的顶点和个数,会影响曲线的形状。这里所说的折线多边形,即样条曲线的特征多边形或控制多边形。
-
样条曲线段
样条曲线是由一组逼近控制多边形的光滑参数曲线段构成,这些曲线段就是样条曲线段。 特征多边形/控制多边形的顶点/控制点 构成特征多边形的各段折线的端点,就是特征多边形的顶点,也叫做控制多边形的控制点。只有在特殊情况下,样条曲线才能通过控制点。 -
编辑本段样条曲线的次数
样条曲线的次数,是由样条曲线数学定义中所取的基函数所决定的。直观的说,所构成样条曲线的一段光滑参数曲线段,由控制多边形的相邻连续的几段折线段决定,就是几次样条,最常用的就是二次和三次样条。二次样条的某一曲线段只与相应的两段折线段,三个控制多边形顶点有关,改变其中一个顶点,将影响三段样条曲线段。同样的,对三次样条,某一曲线段由相应的三段折线段,四个控制点决定。
-
样条曲线的阶数(order)
阶数与次数有关,样条曲线的阶是样条曲线的次数加一。样条曲线的阶越高,控制点越多。二次样条的阶数是三,样条曲线段与三个控制点决定;三次样条的阶数是四,样条曲线段与四个控制点决定。 -
样条曲线的权值
权值可控制样条曲线段在控制多边形范围内做局部调整,反映了曲线靠近控制多边形的程度,权值越大,曲线段越靠近控制多边形。反之,则远离。当权值为1时,NURBS曲线退化为非有理B样条曲线,可见非有理B样条曲线是NURBS的一个子集。 -
样条曲线的允差
允差是指样条曲线通过型值点的精确程度,允差越小,样条曲线与型值点越接近,允差为零,样条曲线将通过型值点。
B-Spline
样条
背景
1946年I.J.Schoenberg
提出一种基于样条的方法来近似曲线,他指出四种重要观点:傅里叶变换、截断多项式的差商、力学观点以及概率密度函数。
其动机来源于插值中的Runge-Kutta
现象,即高阶多项式很容易产生不稳定的上下抖动。于是诞生采用分段低阶多项式通过连续的连接来代替高阶多项式。
1972年de Boor
与Cox
分别独立提出了b-spline
的基函数公式。该公式称为deBoor-Cox
公式。在此之前,基函数大多用差分方法计算,数值上不稳定。该公式为de Casteljau
递归的的推广。
其克服了Bezier
的缺陷:一旦确定了特征多边形的顶点数,就决定了曲线的阶数。当数据点的数量太多时,计算量急剧增加;无法做局部修改,这是一个很大的局限性,牵一发而动全身;光滑性很高,导致拼接比较复杂。
b-splines
即基础样条。除此之外,样条还有其他类型,如Hermite splines
定义
p
次B-Spline
曲线由这些控制点和节点向量
U
U
U定义,其公式为
{
p
(
u
)
=
[
p
0
p
1
…
p
n
]
[
B
0
,
k
(
U
)
B
1
,
k
(
U
)
⋮
B
n
,
k
(
U
)
]
=
∑
i
=
0
n
p
i
B
i
,
k
(
u
)
N
i
,
1
(
t
)
=
{
1
,
t
1
≤
x
≤
t
i
+
1
0
,
O
t
h
e
r
N
i
,
k
(
t
)
=
t
−
t
i
t
i
+
k
−
1
−
t
i
N
i
,
k
−
1
(
t
)
+
t
i
+
k
−
t
t
i
+
k
−
t
i
+
1
N
i
+
1
,
k
−
1
(
t
)
0
0
=
0
\begin{cases} p(u)= \left[ \begin{matrix} p_0&p_1&\ldots&p_n \end{matrix} \right] \left[ \begin{matrix} B_{0,k}(U)\\ B_{1,k}(U)\\ \vdots\\ B_{n,k}(U)\\ \end{matrix} \right]=\sum_{i=0}^np_iB_{i,k}(u)\\ N_{i,1}(t)= \begin{cases} 1,t_1\le x \le t_{i+1}\\ 0, Other \end{cases}\\ N_{i,k}(t)=\frac{t-t_i}{t_{i+k-1}-t_i}N_{i,k-1}(t)+\frac{t_{i+k}-t}{t_{i+k}-t_{i+1}}N_{i+1,k-1}(t)\\ {0\over 0}=0 \end{cases}
⎩
⎨
⎧p(u)=[p0p1…pn]
B0,k(U)B1,k(U)⋮Bn,k(U)
=∑i=0npiBi,k(u)Ni,1(t)={1,t1≤x≤ti+10,OtherNi,k(t)=ti+k−1−tit−tiNi,k−1(t)+ti+k−ti+1ti+k−tNi+1,k−1(t)00=0
即BSpline
为Bezier
的一般性推广,使用节点将
[
0
,
1
]
[0,1]
[0,1]分割成
m
m
m个区间。然后引入阶梯函数作为权重,从而控制特征多边形顶点(控制点)的影响范围。但因为此处影响范围是彼此重叠的,保证了整体曲线的k阶连续(所以B样条是一组Bezier拼接在一起只是一种简单但不准确的说法)。其Cox-de Boor
递推图如下:
根据 N i , k N_{i,k} Ni,k的阶梯函数特性可以得知
- 基函数 N i , k ( t ) N_{i,k}(t) Ni,k(t)在 [ t i , t i + k ] [t_i,t_{i+k}] [ti,ti+k]上非零
- 任何一个节点区间 [ t i , t i + 1 ] [t_i,t_{i+1}] [ti,ti+1],最多有 k k k个 k − 1 k-1 k−1次的基函数非零, N i − k + 1 , k ( t ) , N i − k + 2 , k ( t ) , … , N i , k ( t ) N_{i-k+1,k}(t),N_{i-k+2,k}(t),\ldots,N_{i,k}(t) Ni−k+1,k(t),Ni−k+2,k(t),…,Ni,k(t)
- 在重复度 r r r的节点处,基函数 N i , k ( t ) 是 C ( k − r − 1 ) N_{i,k}(t)是C^{(k-r-1)} Ni,k(t)是C(k−r−1)阶连续的;
- 节点数=控制点数+次数+1.(阶数=次数+1,这一点和
Bezier
不同)
B-Spline
特殊类型
均匀B样条:节点成等差数列分布。不具备断点性质(起始点和终止点并不等于第一个和最后一个控制点)
准均匀B样条:起始节点与终止节点具有K的重复度。中间节点称等差数列分布
分段Bezier
曲线:起始节点与终止节点具有K的重复度,其他节点都具备k-1的重复度。即所有的曲线段都是Bezier
曲线
非均匀B样条:任意分布的节点矢量,两端节点重复都不大于k,内节点重复都不大于
k
−
1
k-1
k−1。
非均匀B样条的外延是包含了均匀、与准均匀、分段
Bezier
的外延的,而均匀、与准均匀、分段Bezier
的外延式并列。
特性
-
局部支撑性:B样条诞生的目的。
-
权性: ∑ i = 0 n N ( i , k ) ( t ) = 1 ∣ t ∈ [ t i , t i + 1 ] \sum_{i=0}^nN(i,k)(t)=1|t\in [t_i,t_{i+1}] ∑i=0nN(i,k)(t)=1∣t∈[ti,ti+1]
-
连续性:在 r r r重节点处的连续阶不低于 k − 1 − r k-1-r k−1−r
-
凸包性: P ( t ) P(t) P(t)在区间 ( t i , t i + 1 ) (t_i,t_{i+1}) (ti,ti+1)上的部分位于 k k k个点 [ P i − k + 1 , P i ] [P_{i-k+1},P{i}] [Pi−k+1,Pi]的凸包内。整个曲线位于各个凸包的并集内。
-
仿射不变性:仿射变换下 A t = b At=b At=b,表达式不变。
-
直线保持性:控制多边形退化为一条直线,曲线也退化为直线。
-
无法精确表达抛物线以外的二次曲线
一般来说,次数越高,则曲线的导数次数也会较高,那么将会有很多零点存在,较多的导数零点就导致原曲线存在较多的极值,使曲线出现较多的峰谷值;次数越低,样条曲线逼近控制点效果越好。另一方面,三次B样条曲线能够实现二阶导数连续,故最终选择准均匀三次B样条曲线作为轨迹规划的曲线比较合适。
有理B样条
非有理B样条无法精确表达抛物线意外的二次曲线。1975年美国锡拉丘兹大学的Versperille
在有理B样条在非有理B
样条的理论基础上为各个控制点拓展了权重,即权重控制
ω
\omega
ω该控制点对于其影响范围内的曲线段的影响比例。
公式
P ( t ) = ∑ i = 0 n ω i P i N i , k ( t ) ∑ i = 0 n ω i N i , k ( t ) = ∑ i = 0 n P i R i , k ( t ) P(t)={{\sum_{i=0}^n\omega_iP_iN_{i,k}(t)}\over{\sum_{i=0}^n\omega_iN_{i,k}(t)}}=\sum_{i=0}^nP_iR_{i,k}(t) P(t)=∑i=0nωiNi,k(t)∑i=0nωiPiNi,k(t)=i=0∑nPiRi,k(t)
齐次坐标
引入齐次坐标,即
n
n
n维空间的非有理B样条的控制点坐标用升
1
1
1维的
n
+
1
n+1
n+1维坐标来表征,其转换关系为
(
x
,
y
,
z
,
ω
)
→
(
x
ω
,
y
ω
,
z
ω
)
(x,y,z,\omega)\rightarrow({x\over\omega},{y\over\omega},{z\over\omega})
(x,y,z,ω)→(ωx,ωy,ωz)。从而权重的倒数作为齐次坐标的第
n
n
n个元素。其逆转换关系为
(
x
,
y
,
z
,
ω
)
→
(
x
ω
,
y
ω
,
z
ω
)
(x,y,z,\omega)\rightarrow({x\over\omega},{y\over\omega},{z\over\omega})
(x,y,z,ω)→(ωx,ωy,ωz)。
P
(
t
)
=
∑
i
=
0
n
ω
i
P
i
N
i
,
k
(
t
)
∑
i
=
0
n
ω
i
N
i
,
k
(
t
)
=
∑
i
=
0
n
P
i
ω
N
i
,
k
(
t
)
P(t)={{\sum_{i=0}^n\omega_iP_iN_{i,k}(t)}\over{\sum_{i=0}^n\omega_iN_{i,k}(t)}}=\sum_{i=0}^nP_i^\omega N_{i,k}(t)
P(t)=∑i=0nωiNi,k(t)∑i=0nωiPiNi,k(t)=i=0∑nPiωNi,k(t)
特性
有理B样条在非有理B样条的基础上增加了两个特性
-
透视不变性:在投影变换下产生正确的结果(而非有理B样条仅在仿射变换下产生准确的结果)
-
可以用来表示直线、二次曲线、非有理B样条曲线;并且,当推广到面片时,可以表示平面、二次曲面和复曲面
非有理B样条是有理B样条的子集。
1983年至1989年,
Piegl
与Tiller
有理B样条的基础上做了深入研究,推广了NURBS。非均匀有理B样条NURBS即有理非均匀B样条
圆锥曲线
-
概念定义:
由一平面截二次锥面得到的曲线。圆锥曲线包括椭圆(圆为椭圆的特例)、抛物线、双曲线。2000多年前的古希腊数学家阿波罗尼斯(著作<<圆锥曲线>>与欧几里得的《几何原本》齐名)提出该概念。精妙之处在于二维曲线的研究升阶到三维空间(回想齐次坐标)。
-
数学定义:
设一点 p 0 ( x 0 , y 0 ) p_0(x_0,y_0) p0(x0,y0),指定一直线
到平面内一定点(焦点)的距离 r r r与到定直线(准线)的距离 d d d之比是常数(离心率) e = r / d e=r/d e=r/d的点的轨迹叫做圆锥曲线。
- e > 1 e>1 e>1:双曲线
- e = 1 e=1 e=1:抛物线
- 0 < e < 1 0<e<1 0<e<1:椭圆(圆为椭圆的一种)
总结
圆锥曲线是平面二次曲线的统一表达,NURBS
是平面圆锥曲线与自由曲线的统一表达。OCC
中针对不同类型曲线提供了到NURBS
的转换器。此处的统一对于几何引擎的吸引力在于各种算法可以提供统一接口