贝塞尔曲线
以3阶贝塞尔曲线为例:
P(0,2)划过的轨迹即为贝塞尔曲线轨迹,满足以下比例关系:
P
0
P
0
1
P
0
1
P
1
=
P
1
2
P
2
P
1
P
1
2
=
P
0
1
P
0
2
P
0
2
P
1
2
\frac{P_0P^1_0}{P^1_0P1}=\frac{P^2_1P2}{P1P^2_1}=\frac{P^1_0P^2_0}{P^2_0P^2_1}
P01P1P0P01=P1P12P12P2=P02P12P01P02
使用线性方程展开表达式可得:
P
0
1
=
(
1
−
t
)
P
0
+
t
P
1
(
1
)
P
1
2
=
(
1
−
t
)
P
1
+
t
P
2
(
2
)
P
0
2
=
(
1
−
t
)
P
0
1
+
t
P
1
2
(
3
)
P^1_0=(1-t)P_0+tP_1 \quad (1) \\ P^2_1=(1-t)P_1+tP2 \quad (2) \\ P^2_0=(1-t)P^1_0+tP^2_1 \quad (3)
P01=(1−t)P0+tP1(1)P12=(1−t)P1+tP2(2)P02=(1−t)P01+tP12(3)
(1)(2)代入(3)得:
P
0
2
=
(
1
−
t
)
2
P
0
+
2
t
(
1
−
t
)
P
1
+
t
2
P
2
P^2_0=(1-t)^2P_0+2t(1-t)P_1+t^2P_2
P02=(1−t)2P0+2t(1−t)P1+t2P2
贝塞尔曲线表达式
n阶贝塞尔曲线表达式满足二项式展开定理:
B
(
t
)
=
∑
i
=
0
n
C
i
n
(
1
−
t
)
n
−
i
t
i
p
i
,
t
∈
[
0
,
1
]
(
1
)
C
i
n
=
n
!
(
n
−
i
)
!
i
!
(
2
)
B(t)=\sum^n_{i=0}C^n_i(1-t)^{n-i}t^ip_i, t \in [0,1] \quad (1) \\ C^n_i=\frac{n!}{(n-i)!i!} \quad (2)
B(t)=i=0∑nCin(1−t)n−itipi,t∈[0,1](1)Cin=(n−i)!i!n!(2)
将(2)带入(1)式:
B
(
t
)
=
∑
i
=
0
n
n
!
(
n
−
i
)
!
i
!
(
1
−
t
)
n
−
i
t
i
p
i
,
t
∈
[
0
,
1
]
B(t)=\sum^n_{i=0}\frac{n!}{(n-i)!i!}(1-t)^{n-i}t^ip_i, t \in [0,1]
B(t)=i=0∑n(n−i)!i!n!(1−t)n−itipi,t∈[0,1]
python实现n阶贝塞尔曲线
def beizer(points, t):
"""
points: list of points
t: t value
"""
b,n = np.zeros((2)), len(points)-1
for i,p in enumerate(points):
b += (1-t)**(n-i) * t**i * p * (math.factorial(n)/(math.factorial(i)*math.factorial(n-i)))
return b