本文主要是介绍Bezier曲线曲面--拟合技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Bezier曲线曲面–拟合应用
1.Bezier曲线
1.1.Bezier曲线的定义
给定一组控制点 P_0, P_1, …, P_n,其中 n 是曲线的阶数,Bezier曲线的参数方程可以表示为:
B ( t ) = ∑ i = 0 n P i b i , n ( t ) , t ∈ [ 0 , 1 ] B(t) = \sum_{i=0}^{n} P_i b_{i,n}(t), \quad t \in [0, 1] B(t)=i=0∑nPibi,n(t),t∈[0,1]
其中, b i , n ( t ) 是 B e r n s t e i n 基函数,定义为: 其中,b_{i,n}(t) 是Bernstein基函数,定义为: 其中,bi,n(t)是Bernstein基函数,定义为:
b i , n ( t ) = C ( n , i ) t i ( 1 − t ) n − i = n ! i ! ( n − i ) ! t i ( 1 − t ) n − i b_{i,n}(t) = C(n, i) t^i (1-t)^{n-i} = \frac{n!}{i!(n-i)!} t^i (1-t)^{n-i} bi,n(t)=C(n,i)ti(1−t)n−i=i!(n−i)!n!ti(1−t)n−i
这里,C(n, i) 是组合数,表示从 n 个不同元素中选择 i 个的组合数。
常见的Bezier曲线
- 二次Bezier曲线:由三个控制点定义,参数方程为:
B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 , t ∈ [ 0 , 1 ] B(t) = (1-t)^2 P_0 + 2t(1-t) P_1 + t^2 P_2, \quad t \in [0, 1] B(t)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]
- 三次Bezier曲线:由四个控制点定义,是最常用的形式,参数方程为:
B ( t ) = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 , t ∈ [ 0 , 1 ] B(t) = (1-t)^3 P_0 + 3t(1-t)^2 P_1 + 3t^2(1-t) P_2 + t^3 P_3, \quad t \in [0, 1] B(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,t∈[0,1]
1.2.Bernstein基函数性质
定义:给定一个参数( t ),其中( 0 <= t <= 1 ),以及一个正整数( n ),Bernstein基函数定义为:
B i , n ( t ) = ( n i ) t i ( 1 − t ) n − i for i = 0 , 1 , 2 , . . . , n B_{i,n}(t) = \binom{n}{i} t^i (1-t)^{n-i} \quad \text{for} \quad i = 0, 1, 2, ..., n Bi,n(t)=(in)ti(1−t)n−ifori=0,1,2,...,n
其中:
( n i ) 是组合数,表示从 n 个元素中选择 i 个的组合数。 \binom{n}{i}是组合数,表示从n个元素中选择i个的组合数。 (in)是组合数,表示从n个元素中选择i个的组合数。
性质:
1.非负性:对于所有的( t )和( i ):
B i , n ( t ) ≥ 0 ; B_{i,n}(t) \geq 0; Bi,n(t)≥0;
2.归一化:Bernstein基函数的和为1,即:
∑ i = 0 n B i , n ( t ) = 1 \sum_{i=0}^n B_{i,n}(t) = 1 i=0∑nBi,n(t)=1
这一性质使得Bernstein基函数在多项式插值和曲线设计中非常有用,因为它们可以保证在参数空间中的归一化。3.端点性质:Bernstein基函数在端点( t = 0 )和( t = 1 )具有特殊的性质。具体来说:
B 0 , n ( 0 ) = 1 和 B n , n ( 1 ) = 1 ,所有其他 B i , n ( 0 ) 和 B i , n ( 1 ) 均为 0 。 B_{0,n}(0) = 1和B_{n,n}(1) = 1,所有其他B_{i,n}(0)和B_{i,n}(1)均为0。 B0,n(0)=1和Bn,n(1)=1,所有其他Bi,n(0)和Bi,n(1)均为0。
4.对称性:Bernstein基函数具有对称性,即:
B i , n ( t ) = B n − i , n ( 1 − t ) ; 这意味着它们在参数空间中是对称的。 B_{i,n}(t) = B_{n-i,n}(1-t);这意味着它们在参数空间中是对称的。 Bi,n(t)=Bn−i,n(1−t);这意味着它们在参数空间中是对称的。
5.递归性质:Bernstein基函数可以通过德卡斯特里奥算法(De Casteljau’s algorithm)递归地求解,这是一种计算Bézier曲线上的点的高效方法。
6.凸包性质:Bernstein多项式定义的曲线或曲面始终位于其控制点的凸包内,这保证了曲线或曲面的整体形状。
7.连续性和可微性:Bernstein基函数及其导数在( t )的整个定义域内都是连续的,这保证了它们定义的曲线或曲面具有良好的光滑性。
1.3.Bezier曲线的性质
1.参数化性质:
Bezier曲线是参数化的,这意味着它的形状由一系列控制点和一个参数(t)决定,其中(t)在0到1之间变化。曲线的形状不依赖于坐标系的选择。
2.凸包性质:
Bezier曲线始终位于其控制点的凸包内。这意味着曲线不会超出由控制点形成的凸多边形之外。这个性质有助于确保曲线的形状在预期的范围内。
3.仿射不变性:
Bezier曲线的形状在仿射变换下不变。这意味着如果对曲线的控制点进行仿射变换(如平移、旋转、缩放),则曲线的形状不变,只需将变换应用于控制点即可。
4.端点插值:
Bezier曲线的起点和终点分别与第一个和最后一个控制点重合。这意味着曲线的起点和终点是固定的,它们分别位于第一个和最后一个控制点上。
5.切线性质:
在Bezier曲线的起点和终点处,曲线的切线分别与第一个和最后一个控制点形成的线段一致。这可以通过计算曲线在这些点的导数来证明。可以进一步证明,起点,终点处r阶导数只与r+1个相邻控制点有关。
6.控制点的权重:
Bezier曲线的形状受到控制点的位置影响,控制点离曲线越远,其对曲线形状的影响越小。这种影响是通过Bernstein多项式来实现的,它是Bezier曲线表达式的一部分。
7.连续性:
如果控制点被适当地选择,Bezier曲线可以具有很高的连续性,如(C0)(点连续)、(C1)(切线连续)和(C^2)(曲率连续)等。这使得Bezier曲线非常适合用于平滑的曲线和曲面设计。
1.4.Bezier曲线的几何作图法
下面详细介绍如何使用几何作图法来绘制二次和三次Bezier曲线。
二次Bezier曲线
二次Bezier曲线由三个控制点 ( P_0 ), ( P_1 ), ( P_2 ) 构成。曲线的定义如下:
B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 , 0 ≤ t ≤ 1 B(t) = (1-t)^2 P_0 + 2t(1-t) P_1 + t^2 P_2, \quad 0 \leq t \leq 1 B(t)=(1−t)2P0+2t(1−t)P1+t2P2,0≤t≤1
几何作图法的步骤:
1.连接 ( P_0 ) 和 ( P_1 ) 以及 ( P_1 ) 和 ( P_2 )。
2.在 ( P_0 ) 到 ( P_1 ) 的连线上,取一点 ( Q_0 ),使得 :
P 0 Q 0 = t ⋅ P 0 P 1 ; P_0 Q_0 = t \cdot P_0 P_1; P0Q0=t⋅P0P1;
3.在 ( P_1 ) 到 ( P_2 ) 的连线上,取一点 ( Q_1 ),使得:
P 1 Q 1 = t ⋅ P 1 P 2 ; P_1 Q_1 = t \cdot P_1 P_2; P1Q1=t⋅P1P2;
4.连接 ( Q_0 ) 和 ( Q_1 ),并在其上取一点 ( B(t) ),使得 :
Q 0 B ( t ) = t ⋅ Q 0 Q 1 ; Q_0 B(t) = t \cdot Q_0 Q_1; Q0B(t)=t⋅Q0Q1;
5.当 ( t ) 从 ( 0 ) 变化到 ( 1 ) 时,( B(t) ) 的轨迹即为二次Bezier曲线。
三次Bezier曲线
三次Bezier曲线由四个控制点 ( P_0 ), ( P_1 ), ( P_2 ), ( P_3 ) 构成。曲线的定义如下:
B ( t ) = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 , 0 ≤ t ≤ 1 ; B(t) = (1-t)^3 P_0 + 3t(1-t)^2 P_1 + 3t^2(1-t) P_2 + t^3 P_3, \quad 0 \leq t \leq 1; B(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,0≤t≤1;
几何作图法的步骤:
1.连接 ( P_0 ) 和 ( P_1 ), ( P_1 ) 和 ( P_2 ), 以及 ( P_2 ) 和 ( P_3 )。
2.在 ( P_0 ) 到 ( P_1 ) 的连线上,取一点 ( Q_0 ),使得 :
P 0 Q 0 = t ⋅ P 0 P 1 ; P_0 Q_0 = t \cdot P_0 P_1; P0Q0=t⋅P0P1;
3.在 ( P_1 ) 到 ( P_2 ) 的连线上,取一点 ( Q_1 ),使得:
P 1 Q 1 = t ⋅ P 1 P 2 ; P_1 Q_1 = t \cdot P_1 P_2; P1Q1=t⋅P1P2;
4.在 ( P_2 ) 到 ( P_3 ) 的连线上,取一点 ( Q_2 ),使得:
P 2 Q 2 = t ⋅ P 2 P 3 ; P_2 Q_2 = t \cdot P_2 P_3; P2Q2=t⋅P2P3;
5.连接 ( Q_0 ) 和 ( Q_1 ),并在其上取一点 ( R_0 ),使得:
Q 0 R 0 = t ⋅ Q 0 Q 1 ; Q_0 R_0 = t \cdot Q_0 Q_1; Q0R0=t⋅Q0Q1;
6.连接 ( Q_1 ) 和 ( Q_2 ),并在其上取一点 ( R_1 ),使得 :
Q 1 R 1 = t ⋅ Q 1 Q 2 ; Q_1 R_1 = t \cdot Q_1 Q_2; Q1R1=t⋅Q1Q2;
7.连接 ( R_0 ) 和 ( R_1 ),并在其上取一点 ( B(t) ),使得:
R 0 B ( t ) = t ⋅ R 0 R 1 ; R_0 B(t) = t \cdot R_0 R_1; R0B(t)=t⋅R0R1;
8.当 ( t ) 从 ( 0 ) 变化到 ( 1 ) 时,( B(t) ) 的轨迹即为三次Bezier曲线。
2.Bezier曲面
Bezier曲面是计算机图形学中用于描述和渲染复杂曲面的一种数学模型。它是由法国工程师皮埃尔·贝塞尔(Pierre Bézier)在20世纪60年代为汽车设计而开发的。Bezier曲面可以通过控制点来定义,这些控制点可以直观地调整曲面的形状。
基本概念
Bezier曲面通常是通过将两个Bezier曲线组合而成的。一个二维的Bezier曲面可以通过以下方式定义:
-
控制点:
一组控制点(通常称为控制网格),这些点定义了曲面的形状。 对于一个 n × m 的 B e z i e r 曲面,有 ( n + 1 ) × ( m + 1 ) 个控制点。 一组控制点(通常称为控制网格),这些点定义了曲面的形状。\\ 对于一个n \times m的Bezier曲面,有(n+1) \times (m+1)个控制点。 一组控制点(通常称为控制网格),这些点定义了曲面的形状。对于一个n×m的Bezier曲面,有(n+1)×(m+1)个控制点。 -
基函数:
使用 B e r n s t e i n 多项式作为基函数,这些函数定义了每个控制点对曲面上特定点的影响。 使用Bernstein多项式作为基函数,这些函数定义了每个控制点对曲面上特定点的影响。 使用Bernstein多项式作为基函数,这些函数定义了每个控制点对曲面上特定点的影响。 -
参数化:
曲面通过两个参数 u 和 v 进行参数化,这两个参数在 0 到 1 之间变化。 曲面通过两个参数u和v进行参数化,这两个参数在0到1之间变化。 曲面通过两个参数u和v进行参数化,这两个参数在0到1之间变化。
数学表示
一个二维的Bezier曲面可以通过以下公式表示:
S ( u , v ) = ∑ i = 0 n ∑ j = 0 m B i , n ( u ) B j , m ( v ) P i , j S(u, v) = \sum_{i=0}^n \sum_{j=0}^m B_{i, n}(u) B_{j, m}(v) P_{i, j} S(u,v)=i=0∑nj=0∑mBi,n(u)Bj,m(v)Pi,j
其中:
-
S ( u , v ) 是曲面上参数为 ( u , v ) 的点。 S(u, v) 是曲面上参数为(u, v)的点。 S(u,v)是曲面上参数为(u,v)的点。
-
B i , n ( u ) 和 B j , m ( v ) 是 B e r n s t e i n 基函数,定义为: B_{i, n}(u) 和 B_{j, m}(v) 是Bernstein基函数,定义为: Bi,n(u)和Bj,m(v)是Bernstein基函数,定义为:
B i , n ( u ) = C ( n , i ) u i ( 1 − u ) n − i B_{i, n}(u) = C(n, i) u^i (1 - u)^{n-i} Bi,n(u)=C(n,i)ui(1−u)n−i
B j , m ( v ) = C ( m , j ) v j ( 1 − v ) m − j B_{j, m}(v) = C(m, j) v^j (1 - v)^{m-j} Bj,m(v)=C(m,j)vj(1−v)m−j -
P i , j 是控制点。 P_{i, j} 是控制点。 Pi,j是控制点。
-
C ( n , i ) 是组合数,定义为: C(n, i) 是组合数,定义为: C(n,i)是组合数,定义为:
C ( n , i ) = n ! i ! ( n − i ) ! C(n, i) = \frac{n!}{i!(n-i)!} C(n,i)=i!(n−i)!n!
展开示例
假定上述n为2,m为3,则S(u, v)展开式为:
计算Bernstein基函数
对于 B i , 2 ( u ) 和 B j , 3 ( v ) ,我们有: 对于 B_{i, 2}(u) 和 B_{j, 3}(v),我们有: 对于Bi,2(u)和Bj,3(v),我们有:
-
对于 i = 0 , 1 , 2 , B i , 2 ( u ) 的表达式为: 对于 i = 0, 1, 2,B_{i, 2}(u) 的表达式为: 对于i=0,1,2,Bi,2(u)的表达式为:
B 0 , 2 ( u ) = C ( 2 , 0 ) u 0 ( 1 − u ) 2 = ( 1 − u ) 2 B_{0, 2}(u) = C(2, 0) u^0 (1 - u)^2 = (1 - u)^2 B0,2(u)=C(2,0)u0(1−u)2=(1−u)2
B 1 , 2 ( u ) = C ( 2 , 1 ) u 1 ( 1 − u ) 1 = 2 u ( 1 − u ) B_{1, 2}(u) = C(2, 1) u^1 (1 - u)^1 = 2u(1 - u) B1,2(u)=C(2,1)u1(1−u)1=2u(1−u)
B 2 , 2 ( u ) = C ( 2 , 2 ) u 2 ( 1 − u ) 0 = u 2 B_{2, 2}(u) = C(2, 2) u^2 (1 - u)^0 = u^2 B2,2(u)=C(2,2)u2(1−u)0=u2 -
对于 j = 0 , 1 , 2 , 3 , B j , 3 ( v ) 的表达式为: 对于 j = 0, 1, 2, 3,B_{j, 3}(v) 的表达式为: 对于j=0,1,2,3,Bj,3(v)的表达式为:
B 0 , 3 ( v ) = C ( 3 , 0 ) v 0 ( 1 − v ) 3 = ( 1 − v ) 3 B_{0, 3}(v) = C(3, 0) v^0 (1 - v)^3 = (1 - v)^3 B0,3(v)=C(3,0)v0(1−v)3=(1−v)3
B 1 , 3 ( v ) = C ( 3 , 1 ) v 1 ( 1 − v ) 2 = 3 v ( 1 − v ) 2 B_{1, 3}(v) = C(3, 1) v^1 (1 - v)^2 = 3v(1 - v)^2 B1,3(v)=C(3,1)v1(1−v)2=3v(1−v)2
B 2 , 3 ( v ) = C ( 3 , 2 ) v 2 ( 1 − v ) 1 = 3 v 2 ( 1 − v ) B_{2, 3}(v) = C(3, 2) v^2 (1 - v)^1 = 3v^2(1 - v) B2,3(v)=C(3,2)v2(1−v)1=3v2(1−v)
B 3 , 3 ( v ) = C ( 3 , 3 ) v 3 ( 1 − v ) 0 = v 3 B_{3, 3}(v) = C(3, 3) v^3 (1 - v)^0 = v^3 B3,3(v)=C(3,3)v3(1−v)0=v3
展开公式
将Bernstein基函数代入原公式,展开并计算:
S ( u , v ) = ∑ i = 0 2 ∑ j = 0 3 B i , 2 ( u ) B j , 3 ( v ) P i , j S(u, v) = \sum_{i=0}^2 \sum_{j=0}^3 B_{i, 2}(u) B_{j, 3}(v) P_{i, j} S(u,v)=i=0∑2j=0∑3Bi,2(u)Bj,3(v)Pi,j
$$
= B_{0, 2}(u) B_{0, 3}(v) P_{0, 0} + B_{0, 2}(u) B_{1, 3}(v) P_{0, 1} + B_{0, 2}(u) B_{2, 3}(v) P_{0, 2} + B_{0, 2}(u) B_{3, 3}(v) P_{0, 3} \
- B_{1, 2}(u) B_{0, 3}(v) P_{1, 0} + B_{1, 2}(u) B_{1, 3}(v) P_{1, 1} + B_{1, 2}(u) B_{2, 3}(v) P_{1, 2} + B_{1, 2}(u) B_{3, 3}(v) P_{1, 3} \
- B_{2, 2}(u) B_{0, 3}(v) P_{2, 0} + B_{2, 2}(u) B_{1, 3}(v) P_{2, 1} + B_{2, 2}(u) B_{2, 3}(v) P_{2, 2} + B_{2, 2}(u) B_{3, 3}(v) P_{2, 3}
$$
$$
= (1 - u)^2 (1 - v)^3 P_{0, 0} + (1 - u)^2 3v(1 - v)^2 P_{0, 1} + (1 - u)^2 3v^2(1 - v) P_{0, 2} + (1 - u)^2 v^3 P_{0, 3} \
- 2u(1 - u) (1 - v)^3 P_{1, 0} + 2u(1 - u) 3v(1 - v)^2 P_{1, 1} + 2u(1 - u) 3v^2(1 - v) P_{1, 2} + 2u(1 - u) v^3 P_{1, 3} \
- u^2 (1 - v)^3 P_{2, 0} + u^2 3v(1 - v)^2 P_{2, 1} + u^2 3v^2(1 - v) P_{2, 2} + u^2 v^3 P_{2, 3}
$$
这就是 B e z i e r 曲面公式 S ( u , v ) 的展开形式,其中 P i , j 是控制点。 这个公式描述了一个由 16 个控制点定义的 2 ∗ 3 的 B e z i e r 曲面,其中 u 和 v 在 [ 0 , 1 ] 范围内变化。 这就是Bezier曲面公式 S(u, v) 的展开形式,其中 P_{i, j} 是控制点。\\ 这个公式描述了一个由16个控制点定义的2*3的Bezier曲面,其中 u 和 v 在 [0, 1] 范围内变化。 这就是Bezier曲面公式S(u,v)的展开形式,其中Pi,j是控制点。这个公式描述了一个由16个控制点定义的2∗3的Bezier曲面,其中u和v在[0,1]范围内变化。
这篇关于Bezier曲线曲面--拟合技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!