贝塞尔曲线原理

发布于:2025-05-19 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、 低阶贝塞尔曲线

1.一阶贝塞尔曲线

如下图所示, P 0 ​ P_0​ P0, P 1 ​ P_1​ P1 是平面中的两点,则 P ( t ) P( t ) P(t) 代表平面中的一段线段。
在这里插入图片描述
考虑这样一条曲线方程
P ( t ) = P 0 ​ + ( P 1 ​ − P 0 ​ ) t = ( 1 − t ) P 0 ​ + t P 1 \begin{aligned} P(t)=P_0​+(P_1​−P_0​)t=(1−t)P_0​+tP_1 \end{aligned} P(t)=P0+(P1P0)t=(1t)P0+tP1
一阶曲线很好理解, 就是根据 t t t来的线性插值, t t t的取值范围为 [ 0 , 1 ] [ 0 , 1 ] [0,1]

python实现

# 保存动图时用,pip install celluloid
from celluloid import Camera 
import numpy as np
import matplotlib.pyplot as plt
P0=np.array([0,0])
P1=np.array([1,1])
fig=plt.figure(1)
camera = Camera(fig)
x =[]
y=[]
for t in np.arange(0,1,0.01):
    plt.plot([P0[0],P1[0]],[P0[1],P1[1]],'r')
    p1_t=(1-t)*P0+t*P1
    x.append(p1_t[0])
    y.append(p1_t[1])
    # plt.plot(x,y,c='b')
    plt.scatter(x,y,c='b')
    # plt.pause(0.001)
    camera.snap()
animation = camera.animate()
animation.save('一阶贝塞尔.gif')

matlab实现

from celluloid import Camera  # 保存动图时用,pip install celluloid
import numpy as np
import matplotlib.pyplot as plt
P0=np.array([0,0])
P1=np.array([1,1])
fig=plt.figure(1)
camera = Camera(fig)
x =[]
y=[]
for t in np.arange(0,1,0.01):
    plt.plot([P0[0],P1[0]],[P0[1],P1[1]],'r')
    p1_t=(1-t)*P0+t*P1
    x.append(p1_t[0])
    y.append(p1_t[1])
    # plt.plot(x,y,c='b')
    plt.scatter(x,y,c='b')
    # plt.pause(0.001)
    camera.snap()
animation = camera.animate()
animation.save('一阶贝塞尔.gif')

2. 二阶贝塞尔曲线

对于二阶贝塞尔曲线,需要3个控制点,假设分别为 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2​。 P 0 P_0 P0 P 1 P_1 P1 ​构成一阶 P 1 , 1 ​ ( t ) P_{1,1}​(t) P1,1(t) P 1 P_1 P1​和 P 2 P_2 P2​​也构成一阶 P 1 , 2 ​ ( t ) P_{1,2}​(t) P1,2(t),即:
{ P 1 , 1 ​ ( t ) = ( 1 − t ) P 0 ​ + t P 1 P 1 , 2 ​ ( t ) = ( 1 − t ) P 1 + t P 2 \begin{aligned} \left\{ \begin{array}{} P_{1,1}​(t)=(1−t)P_0​+tP_1 \\[2ex] P_{1,2}​(t)=(1−t)P_1+tP_2 \\ \end{array} \right. \end{aligned} {P1,1(t)=(1t)P0+tP1P1,2(t)=(1t)P1+tP2
在生成的两个一阶点 P 1 , 1 ​ ( t ) P_{1,1}​(t) P1,1(t) P 1 , 2 ​ ( t ) P_{1,2}​(t) P1,2(t)基础上,可以生成二阶贝塞尔点 P 2 ​ ( t ) P_2​(t) P2(t):
P 2 ​ ( t ) = ( 1 − t ) P 1 , 1 ​ + t P 1 , 2 ​ = ( 1 − t ) 2 P 0 ​ + 2 t ( 1 − t ) P 1 ​ + t 2 P 2 \begin{aligned} P_2​(t)=(1−t)P_{1,1}​+tP_{1,2}​=(1−t)^2P_0​+2t(1−t)P_1​+t^2P_2 \end{aligned} P2(t)=(1t)P1,1+tP1,2=(1t)2P0+2t(1t)P1+t2P2
在这里插入图片描述

注意:最多一阶导数不为常数

python实现

from celluloid import Camera  # 保存动图时用,pip install celluloid
import numpy as np
import matplotlib.pyplot as plt
P0 = np.array([0, 0])
P1 = np.array([1,1])
P2 = np.array([2, 1])
fig = plt.figure(2)
camera = Camera(fig)

x_2 = []
y_2 = []
for t in np.arange(0, 1, 0.01):
    plt.cla()
    plt.plot([P0[0], P1[0]], [P0[1], P1[1]], 'k')
    plt.plot([P1[0], P2[0]], [P1[1], P2[1]], 'k')
    p11_t = (1-t)*P0+t*P1
    p12_t = (1-t)*P1+t*P2
    p2_t = (1-t)*p11_t+t*p12_t
    
    x_2.append(p2_t[0])
    y_2.append(p2_t[1])
    plt.scatter(x_2, y_2, c='r')
    plt.plot([p11_t[0],p12_t[0]],[p11_t[1],p12_t[1]],'g')
    plt.title("t="+str(t))
    plt.pause(0.001)
#     camera.snap()
# animation = camera.animate()
# animation.save('2阶贝塞尔.gif')

matlab实现

clc;
clear;
close all;
%% 二次贝塞尔曲线
P0=[0,0];
P1=[1,1];
P2=[2,1];
P=[P0;
    P1;
    P2];
figure(2);
plot(P(:,1),P(:,2),'k');
MakeGif('二次贝塞尔曲线.gif',1);
hold on
 
scatter(P(:,1),P(:,2),200,'.b');
for t=0:0.01:1
    P_t_1=(1-t) * P0 + t * P1;
    P_t_2=(1-t) * P1 + t * P2;
    P_t_3=(1-t) * P_t_1 + t * P_t_2;
    
    m1=scatter(P_t_1(1),P_t_1(2),300,'g');
    m2=scatter(P_t_2(1),P_t_2(2),300,'g');
    
    m3=plot([P_t_1(1),P_t_2(1)],[P_t_1(2),P_t_2(2)],'g','linewidth',2);
    
    scatter(P_t_3(1),P_t_3(2),300,'.r');  
    stringName = "二次贝塞尔曲线:t="+num2str(t);
    title(stringName);
    MakeGif('二次贝塞尔曲线.gif',t*100+1);
    delete(m1);
    delete(m2);
    delete(m3);
end

3. 三阶贝塞尔曲线

在这里插入图片描述
三阶贝塞尔曲线4个控制点,假设分别为 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2 P 3 P_3 P3 P 0 P_0 P0 P 1 P_1 P1 P 1 P_1 P1 P 2 P_2 P2 P 2 P_2 P2 P 3 P_3 P3 分别构成一阶 P 1 , 1 ​ ( t ) P_{1,1}​(t) P1,1(t) P 1 , 2 ​ ( t ) P_{1,2}​(t) P1,2(t) P 1 , 3 ​ ( t ) P_{1,3}​(t) P1,3(t),即:
{ P 1 , 1 ​ ( t ) = ( 1 − t ) P 0 ​ + t P 1 P 1 , 2 ​ ( t ) = ( 1 − t ) P 1 + t P 2 P 1 , 3 ​ ( t ) = ( 1 − t ) P 2 + t P 3 \begin{aligned} \left\{ \begin{array}{} P_{1,1}​(t)=(1−t)P_0​+tP_1 \\[2ex] P_{1,2}​(t)=(1−t)P_1+tP_2 \\[2ex] P_{1,3}​(t)=(1−t)P_2+tP_3 \\ \end{array} \right. \end{aligned} P1,1(t)=(1t)P0+tP1P1,2(t)=(1t)P1+tP2P1,3(t)=(1t)P2+tP3
在生成的三个一阶点 P 1 , 1 ​ ( t ) P_{1,1}​(t) P1,1(t) P 1 , 2 ​ ( t ) P_{1,2}​(t) P1,2(t) P 1 , 3 ​ ( t ) P_{1,3}​(t) P1,3(t)基础上,可以生成两个二阶贝塞尔点 P 2 , 1 ​ ( t ) P_{2,1}​(t) P2,1(t) P 2 , 2 ​ ( t ) P_{2,2}​(t) P2,2(t)
{ P 2 , 1 ​ ( t ) = ( 1 − t ) P 1 , 1 ​ + t P 1 , 2 ​ P 2 , 2 ​ ( t ) = ( 1 − t ) P 1 , 2 ​ + t P 1 , 3 ​ \begin{aligned} \left\{ \begin{array}{} P_{2,1}​(t)=(1−t)P_{1,1}​+tP_{1,2}​ \\[2ex] P_{2,2}​(t)=(1−t)P_{1,2}​+tP_{1,3}​ \end{array} \right. \end{aligned} {P2,1(t)=(1t)P1,1+tP1,2P2,2(t)=(1t)P1,2+tP1,3
在生成的两个二阶点 P 2 , 1 ​ ( t ) P_{2,1}​(t) P2,1(t) P 2 , 2 ​ ( t ) P_{2,2}​(t) P2,2(t)基础上,可以生成三阶贝塞尔点 P 3 ( t ) P_3(t) P3(t):
P 3 ​ ( t ) = ( 1 − t ) P 2 , 1 + t P 2 , 2 ​ = ( 1 − t ) 3 P 0 ​ + 3 t ( 1 − t ) 2 P 1 ​ + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 \begin{aligned} P_3​(t)=(1−t)P_{2,1}+tP_{2,2}​=(1−t)^3P_0​+3t(1−t)^2P_1​+3t^2(1-t)P_2+t^3P_3 \end{aligned} P3(t)=(1t)P2,1+tP2,2=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3

注意:最多二阶导数不为常数

python实现

from celluloid import Camera  # 保存动图时用,pip install celluloid
import numpy as np
import matplotlib.pyplot as plt
	
P0 = np.array([0, 0])
P1 = np.array([1, 1])
P2 = np.array([2, 1])
P3 = np.array([3, 0])
fig = plt.figure(3)
camera = Camera(fig)

x_2 = []
y_2 = []
for t in np.arange(0, 1, 0.01):
    plt.cla()
    plt.plot([P0[0], P1[0]], [P0[1], P1[1]], 'k')
    plt.plot([P1[0], P2[0]], [P1[1], P2[1]], 'k')
    plt.plot([P2[0], P3[0]], [P2[1], P3[1]], 'k')
    p11_t = (1-t)*P0+t*P1
    p12_t = (1-t)*P1+t*P2
    p13_t = (1-t)*P2+t*P3
    p21_t = (1-t)*p11_t+t*p12_t
    p22_t = (1-t)*p12_t+t*p13_t
    p3_t = (1-t)*p21_t+t*p22_t

    x_2.append(p3_t[0])
    y_2.append(p3_t[1])
    plt.scatter(x_2, y_2, c='r')

    plt.plot([p11_t[0], p12_t[0]], [p11_t[1], p12_t[1]], 'b')
    plt.plot([p12_t[0], p13_t[0]], [p12_t[1], p13_t[1]], 'b')

    plt.plot([p21_t[0], p22_t[0]], [p21_t[1], p22_t[1]], 'r')
    plt.title("t="+str(t))
    plt.pause(0.001)
#     camera.snap()
# animation = camera.animate()
# animation.save('3阶贝塞尔.gif')

matlab实现

clc;
clear;
close all;
P0=[0,0];
P1=[1,1];
P2=[2,1];
P3=[3,0];
P=[P0;
    P1;
    P2;
    P3];
figure(3);
plot(P(:,1),P(:,2),'k');
MakeGif('三次贝塞尔曲线.gif',1);
hold on
scatter(P(:,1),P(:,2),200,'.b');
 
for t=0:0.01:1
    P_t_1=(1-t) * P0 + t * P1;
    P_t_2=(1-t) * P1 + t * P2;
    P_t_3=(1-t) * P2 + t * P3;
 ss
    P_t_4=(1-t) * P_t_1 + t * P_t_2;
    P_t_5=(1-t) * P_t_2 + t * P_t_3;
    
    P_t_6=(1-t) * P_t_4 + t * P_t_5;
    
    m1=scatter(P_t_1(1),P_t_1(2),300,'g');
    m2=scatter(P_t_2(1),P_t_2(2),300,'g');
    m3=scatter(P_t_3(1),P_t_3(2),300,'g');
    
    m4=scatter(P_t_4(1),P_t_4(2),300,'m');
    m5=scatter(P_t_5(1),P_t_5(2),300,'m');
    
    m6=plot([P_t_1(1),P_t_2(1),P_t_3(1)],[P_t_1(2),P_t_2(2),P_t_3(2)],'g','linewidth',2);
    m7=plot([P_t_4(1),P_t_5(1)],[P_t_4(2),P_t_5(2)],'m','linewidth',2);
    
    scatter(P_t_6(1),P_t_6(2),300,'.r');  
    
    stringName = "三次贝塞尔曲线:t="+num2str(t);
    title(stringName);
    MakeGif('三次贝塞尔曲线.gif',t*100+1);
    delete(m1);
    delete(m2);
    delete(m3);
    delete(m4);
    delete(m5);
    delete(m6);
    delete(m7);
end

二、 N阶贝塞尔曲线

由上述可知,贝塞尔点的求解满足递归的性质, N N N阶贝塞尔曲线的求解公式如下:
假设存在 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2 … \dots P n P_n Pn,​ 共 n + 1 n+1 n+1 个控制点, N N N阶贝塞尔点定义为:
P n ( t ) = ∑ i = 0 n C n i ⋅ ( 1 − t ) n − i ⋅ t i ⋅ P i = ∑ i = 0 n B i , n ( t ) ⋅ P i \begin{aligned} P_n(t)=\sum_{i=0}^n C_n^i \cdot(1-t)^{n-i} \cdot t^i \cdot P_i=\sum_{i=0}^n B_{i, n}(t) \cdot P_i \end{aligned} Pn(t)=i=0nCni(1t)nitiPi=i=0nBi,n(t)Pi
式中, B i , n ( t ) = C n i ⋅ ( 1 − t ) n − i ⋅ t i B_{i, n}(t)=C_n^i \cdot(1-t)^{n-i} \cdot t^i Bi,n(t)=Cni(1t)niti 称为伯恩斯坦基函数。其(对 t t t求)一阶导数为:
B i , n ′ ( t ) = [ C n i ⋅ ( 1 − t ) n − i ⋅ t i ] ′ = n ! i ! ⋅ ( n − i ) ! ⋅ [ − ( n − i ) ⋅ ( 1 − t ) n − i − 1 ⋅ t i + i ⋅ t i − 1 ⋅ ( 1 − t ) n − i ] = n ! i ! ⋅ ( n − i ) ! ⋅ i ⋅ t i − 1 ⋅ ( 1 − t ) n − i − n ! i ! ⋅ ( n − i ) ! ⋅ ( n − i ) ⋅ ( 1 − t ) n − i − 1 ⋅ t i = n ( n − 1 ) ! ( i − 1 ) ! ⋅ ( n − i ) ! t i − 1 ⋅ ( 1 − t ) n − i − n ( n − 1 ) ! i ! ⋅ ( n − i − 1 ) ! ⋅ ( 1 − t ) n − i − 1 ⋅ t i = n C n − 1 i − 1 t i − 1 ⋅ ( 1 − t ) n − i − n C n − 1 i ( 1 − t ) n − i − 1 ⋅ t i = n [ B i − 1 , n − 1 ( t − B i , n − 1 ( t ) ] \begin{aligned} B_{i, n}^{\prime}(t) & =\left[C_n^i \cdot(1-t)^{n-i} \cdot t^i\right]^{\prime} \\[2ex] & =\frac{n!}{i!\cdot(n-i)!} \cdot\left[-(n-i) \cdot(1-t)^{n-i-1} \cdot t^i+i \cdot t^{i-1} \cdot(1-t)^{n-i}\right] \\[2ex] & =\frac{n!}{i!\cdot(n-i)!} \cdot i \cdot t^{i-1} \cdot(1-t)^{n-i}-\frac{n!}{i!\cdot(n-i)!} \cdot(n-i) \cdot(1-t)^{n-i-1} \cdot t^i \\[2ex] & =n \frac{(n-1)!}{(i-1)!\cdot(n-i)!} t^{i-1} \cdot(1-t)^{n-i}-n \frac{(n-1)!}{i!\cdot(n-i-1)!} \cdot(1-t)^{n-i-1} \cdot t^i \\[2ex] & =n C_{n-1}^{i-1} t^{i-1} \cdot(1-t)^{n-i}-n C_{n-1}^i(1-t)^{n-i-1} \cdot t^i \\[2ex] & =n\left[B_{i-1, n-1}\left(t-B_{i, n-1}(t)\right]\right. \end{aligned} Bi,n(t)=[Cni(1t)niti]=i!(ni)!n![(ni)(1t)ni1ti+iti1(1t)ni]=i!(ni)!n!iti1(1t)nii!(ni)!n!(ni)(1t)ni1ti=n(i1)!(ni)!(n1)!ti1(1t)nini!(ni1)!(n1)!(1t)ni1ti=nCn1i1ti1(1t)ninCn1i(1t)ni1ti=n[Bi1,n1(tBi,n1(t)]

说明:上式 i ⩾ 1 \color{red}i \geqslant1 i1
i = 0 i=0 i=0 时, B 0 , n ( t ) = C n 0 ⋅ ( 1 − t ) n − 0 ⋅ t 0 = ( 1 − t ) n B_{0, n}(t)=C_n^0 \cdot (1-t)^{n-0} \cdot t^{0}=(1-t)^n B0,n(t)=Cn0(1t)n0t0=(1t)n,因此, B 0 , n ′ ( t ) = ( ( 1 − t ) n ) ′ = − n ( 1 − t ) n − 1 = − n B 0 , n − 1 B'_{0, n}(t)=((1-t)^n)'=-n(1-t)^{n-1}=-nB_{0, n-1} B0,n(t)=((1t)n)=n(1t)n1=nB0,n1

C n i = n ! i ! ⋅ ( n − i ) ! C_n^i=\frac{n!}{i!\cdot(n-i)!} Cni=i!(ni)!n!

进一步地,贝塞尔点求导为:
P n ′ ( t ) = [ ∑ i = 0 n C n i ⋅ ( 1 − t ) n − i ⋅ t i ⋅ P i ] ′ = B 0 , n ′ P 0 + B 1 , n ′ P 1 + ⋯ + B n , n ′ ⋅ P n = − n B 0 , n − 1 P 0 + n ( B 0 , n − 1 − B 1 , n − 1 ) P 1 + n ( B 1 , n − 1 − B 2 , n − 1 ) P 2 ⋯ + n ( B n − 1 , n − 1 − B n , n − 1 ) P n = n [ B 0 , n − 1 ( P 1 − P 0 ) + B 1 , n − 1 ( P 2 − P 1 ) + ⋯ + B n − 1 , n − 1 ( P n − P n − 1 ) ] = n ∑ i = 1 n B i − 1 , n − 1 ( t ) ⋅ ( P i − P i − 1 ) \begin{aligned} P_n^{\prime}(t) & =\left[\sum_{i=0}^n C_n^i \cdot(1-t)^{n-i} \cdot t^i \cdot P_i\right]^{\prime} \\[4ex] & =B_{0, n}^{\prime} P_0+B_{1, n}^{\prime} P_1+\cdots+B_{n, n}^{\prime} \cdot P_n \\[2ex] & =-n B_{0, n-1} P_0+n\left(B_{0, n-1}-B_{1, n-1}\right) P_1+n\left(B_{1, n-1}-B_{2, n-1}\right) P_2 \cdots+n\left(B_{n-1, n-1}-B_{n, n-1}\right) P_n \\[2ex] & =n\left[B_{0, n-1}\left(P_1-P_0\right)+B_{1, n-1}\left(P_2-P_1\right)+\cdots+B_{n-1, n-1}\left(P_n-P_{n-1}\right)\right] \\[2ex] & =n \sum_{i=1}^n B_{i-1, n-1}(t) \cdot\left(P_i-P_{i-1}\right) \end{aligned} Pn(t)=[i=0nCni(1t)nitiPi]=B0,nP0+B1,nP1++Bn,nPn=nB0,n1P0+n(B0,n1B1,n1)P1+n(B1,n1B2,n1)P2+n(Bn1,n1Bn,n1)Pn=n[B0,n1(P1P0)+B1,n1(P2P1)++Bn1,n1(PnPn1)]=ni=1nBi1,n1(t)(PiPi1)

## 递归方式实现贝塞尔曲线
import numpy as np
import matplotlib.pyplot as plt
## 递归的方式实现贝塞尔曲线
def bezier(Ps,n,t):
    """递归的方式求解贝塞尔点

    Args:
        Ps (_type_): 控制点,格式为numpy数组:array([[x1,y1],[x2,y2],...,[xn,yn]])
        n (_type_): n个控制点,即Ps的第一维度
        t (_type_): 时刻t

    Returns:
        _type_: 当前t时刻的贝塞尔点
    """
    if n==1:
        return Ps[0]
    return (1-t)*bezier(Ps[0:n-1],n-1,t)+t*bezier(Ps[1:n],n-1,t)

# 画图验证
Ps = np.array([[0,0],[1,1],[2,1],[3,0],[3,1]])
x_=[]
y_=[]
for t in np.arange(0,1,0.01):
    plt.cla()
    pos = bezier(Ps,len(Ps),t)
    x_.append(pos[0])
    y_.append(pos[1])
    plt.plot(Ps[:,0],Ps[:,1])
    plt.scatter(x_,y_,c='r')
    # print(pos)
    # plt.plot(pos[0],pos[1])
    plt.pause(0.001)

三、 贝塞尔曲线性质

贝塞尔曲线有许多性质,在此,列举几个在自动驾驶运动规划中的常见性质:
性质1:几何特性不随坐标系的变换而变化;
性质2 P 0 P_0 P0​ 和 P n P_n Pn 分别位于贝塞尔曲线的起点和终点;
性质3:至少需要三阶贝塞尔曲线(四个控制点)才能生成曲率连续变化的路径;
性质4:起点和终点处的切线方向与和特征多边形的第一条边及最后一条边分别相切,即,可根据曲线的起始点和终止点的切线方向确定车辆起始点姿态和目标点姿态;
性质5:若要求两端弧线拼接在一起依然是曲率连续的,必须要求两段弧线在连接处的曲率是相等的;

曲率连续需要二阶导数连续,三阶贝塞尔曲线求两次导还有变量t,是关于t连续的
城市环境下局部路径规划,如贝塞尔曲线能够拟合直道和弯道,在曲率变化较大的地方可以选用两个贝塞尔曲线来拟合。
无人驾驶车辆的运动规划,目标轨迹曲率是连续的且轨迹的曲率不超过车辆可行驶轨迹曲率的限制。

3.1 性质1:几何特性不随坐标系的变换而变化
   因为贝塞尔曲线依据控制点生成,当各控制点相对关系确定,得到贝塞尔曲线的几何特性使唯一的,不同的是平移、旋转。

3.2 性质2: P 0 P_0 P0​ 和 P n P_n Pn 分别位于贝塞尔曲线的起点和终点
   当 t = 0 t=0 t=0时, P n ( t ) = ∑ i = 0 n C n i ⋅ ( 1 − 0 ) n − i ⋅ 0 i ⋅ P i = P 0 P_n(t)=\sum_{i=0}^n C_n^i \cdot(1-0)^{n-i} \cdot 0^i \cdot P_i= P_0 Pn(t)=i=0nCni(10)ni0iPi=P0
   当 t = 1 t=1 t=1时, P n ( t ) = ∑ i = 0 n C n i ⋅ ( 1 − 1 ) n − i ⋅ 1 i ⋅ P i = P n P_n(t)=\sum_{i=0}^n C_n^i \cdot(1-1)^{n-i} \cdot 1^i \cdot P_i= P_n Pn(t)=i=0nCni(11)ni1iPi=Pn

3.3 性质3:至少需要三阶贝塞尔曲线(四个控制点)才能生成曲率连续变化的路径
   曲率 k k k 公式如下:
k = ∣ f ′ ′ ( 1 + f ′ 2 ) 3 2 ∣ k=\left|\frac{f''}{(1+{{f'}^2)}^{\frac{3}{2}}}\right| k= (1+f2)23f′′

分析:要求 曲率 k k k 连续变化,则要求至少二阶导数连续变化,则至少需要 三阶贝塞尔曲线(四个控制点)

3.4 性质4:起点和终点处的切线方向与和特征多边形的第一条边及最后一条边分别相切
   由 贝塞尔点求导 可知: P n ′ ( t ) = n ∑ i = 1 n B i − 1 , n − 1 ( t ) ⋅ ( P i − P i − 1 ) P_n^{\prime}(t) =n \sum_{i=1}^n B_{i-1, n-1}(t) \cdot\left(P_i-P_{i-1}\right) Pn(t)=ni=1nBi1,n1(t)(PiPi1)
   当 t = 0 t=0 t=0时, P n ′ ( 0 ) = n ∑ i = 1 n B i − 1 , n − 1 ( 0 ) ⋅ ( P i − P i − 1 ) P_n'(0)=n \sum_{i=1}^n B_{i-1, n-1}(0) \cdot\left(P_i-P_{i-1}\right) Pn(0)=ni=1nBi1,n1(0)(PiPi1)

伯恩斯坦基函数: B i , n ( t ) = C n i ⋅ ( 1 − t ) n − i ⋅ t i B_{i, n}(t)=C_n^i \cdot(1-t)^{n-i} \cdot t^i Bi,n(t)=Cni(1t)niti


网站公告

今日签到

点亮在社区的每一天
去签到