贝塞尔曲线原理、推导及Matlab实现

贝塞尔曲线原理、推导及Matlab实现

一、简介

贝塞尔曲线提出

在数学的数值分析领域中,贝塞尔曲线(English:Bézier curve)是计算机图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝兹曲面,其中贝兹三角是一种特殊的实例。

贝塞尔曲线于1962年,由法国工程师皮埃尔·贝兹Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由保尔·德·卡斯特里奥于1959年运用德卡斯特里奥算法开发,以稳定数值的方法求出贝塞尔曲线。

贝塞尔曲线与F1的渊源

说到皮埃尔·贝兹,就不得不提他作为雷诺公司的一名工程师,曾引领了设计和制造业的转型,将它们从单纯使用数学和计算工具带向了计算机辅助设计和三维模型,同时是实体造型、几何模型和物理模型领域的奠定者之一。

而雷诺公司早期于1977年开始,作为车队和发动机供应商在不同时期里参加了F1(一级方程式赛事)。在1977年的最后五站比赛中,雷诺以厂队的身份踏进了F1比赛,并且将涡轮增压器引入其第一款赛车雷诺 RS01中却遭众人嘲笑,然而在法国的分站赢得胜利之后,不到两年时间,所有一流车队都改用涡轮发动机。在1992年雷诺凭英国车手文素和威廉士车队拿下史上第一个年度车队冠军,而接下来五年的年度车队冠军也都是使用雷诺发动机(除1995年是班尼顿,其余皆为威廉士),不过随着其在98年退出F1,雷诺在F1的霸业也宣告结束。雷诺在2000年接手贝纳通车队重返一级方程式赛车。在2002年,车队改名为雷诺一级方程式车队,更在2005年和2006年赛季中同时夺得车队和车手世界冠军。

现今雷诺公司旗下的F1车队为AlpineF1车队(法语:Alpine F1 Team),全名倍世AlpineF1车队(法语:BWT Alpine F1 Team)。本赛季Alpine车队的新赛车A524在赛季伊始便严重缺乏竞争力;赛季揭幕战巴林大奖赛上,排位赛中双车排名垫底在第一节即被淘汰,正赛17、18名带回。在沙特大奖赛,双车17、18位发车,正赛加斯利因变速箱问题退赛,奥康带回13名。位列厂队垫底,心疼他们的两名车手。

跑题了,赶紧回归正题。

二、原理

特性

贝塞尔曲线有如下特性:

  • 通过 n n n个控制点 P 1 , P 2 , P 3 , . . . , P n P_1, P_2, P_3, ..., P_n P1,P2,P3,...,Pn控制曲线形状。
  • 曲线只经过起点 P 1 P_1 P1和终点 P n P_n Pn.

构建贝塞尔曲线

  1. 一次曲线(线性):
    一次贝塞尔曲线由两个端点 P 0 P_0 P0 P 1 P_1 P1组成,曲线由线段直接连接这两个点, B ( t ) B(t) B(t)描述一条由 P 0 P_0 P0 P 1 P_1 P1的直线,可以视为一个 P 0 P_0 P0 P 1 P_1 P1的连续中间点 Q 0 Q_0 Q0


一次贝塞尔曲线演示

线性贝塞尔曲线演示动画,t在[0,1]区间
  1. 二次曲线
    二次贝塞尔曲线由定点 P 0 , P 1 , P 2 P_0, P_1, P_2 P0,P1,P2的函数 B ( t ) B(t) B(t)描述。为构建贝塞尔曲线,引入中间点 Q 0 , Q 1 Q_0, Q_1 Q0,Q1
    • P 0 , P 1 P_0, P_1 P0,P1之间的连续点 Q 0 Q_0 Q0,描述一条线性贝塞尔曲线;
    • P 1 , P 2 P_1, P_2 P1,P2之间的连续点 Q 1 Q_1 Q1,描述一条线性贝塞尔曲线;
    • Q 0 , Q 1 Q_0, Q_1 Q0,Q1之间的连续点 B ( t ) B(t) B(t),描述一条二次贝塞尔曲线。


在这里插入图片描述

二次贝塞尔曲线的结构


在这里插入图片描述

二次贝塞尔曲线演示动画,t在[0,1]区间
  1. 三次曲线
    对于三次曲线,由定点 P 0 , P 1 , P 2 , P 3 P_0, P_1, P_2, P_3 P0,P1,P2,P3的函数 B ( t ) B(t) B(t)描述。可以加入三个可由线性贝塞尔曲线描述的中间点 Q 0 , Q 1 , Q 2 Q_0, Q_1, Q_2 Q0,Q1,Q2,和两个由二次贝塞尔曲线描述的点 R 0 , R 1 R_0, R_1 R0,R1来描述:
    • P 0 , P 1 P_0, P_1 P0,P1之间的连续点 Q 0 Q_0 Q0,描述一条线性贝塞尔曲线;
    • P 1 , P 2 P_1, P_2 P1,P2之间的连续点 Q 1 Q_1 Q1,描述一条线性贝塞尔曲线;
    • P 2 , P 3 P_2, P_3 P2,P3之间的连续点 Q 2 Q_2 Q2,描述一条线性贝塞尔曲线;
    • Q 0 , Q 1 Q_0, Q_1 Q0,Q1之间的连续点 R 0 R_0 R0,描述一条二次贝塞尔曲线;
    • Q 1 , Q 2 Q_1, Q_2 Q1,Q2之间的连续点 R 1 R_1 R1,描述一条二次贝塞尔曲线;
    • R 0 , R 1 R_0, R_1 R0,R1之间的连续点 B ( t ) B(t) B(t),描述一条三次贝塞尔曲线。


在这里插入图片描述

三次贝塞尔曲线的结构


在这里插入图片描述

三次贝塞尔曲线演示动画,t在[0,1]区间
  1. 四次曲线
    对于四次曲线,由定点 P 0 , P 1 , P 2 , P 3 , P 4 P_0, P_1, P_2, P_3, P_4 P0,P1,P2,P3,P4的函数 B ( t ) B(t) B(t)描述。可以加入四个可由线性贝塞尔曲线描述的中间点 Q 0 , Q 1 , Q 2 , Q 3 Q_0, Q_1, Q_2, Q_3 Q0,Q1,Q2,Q3,三个由二次贝塞尔曲线描述的点 R 0 , R 1 , R 2 R_0, R_1, R_2 R0,R1,R2,和两个由三次贝塞尔曲线描述的点 S 0 , S 1 S_0, S_1 S0,S1来描述:
    • P 0 , P 1 P_0, P_1 P0,P1之间的连续点 Q 0 Q_0 Q0,描述一条线性贝塞尔曲线;
    • P 1 , P 2 P_1, P_2 P1,P2之间的连续点 Q 1 Q_1 Q1,描述一条线性贝塞尔曲线;
    • P 2 , P 3 P_2, P_3 P2,P3之间的连续点 Q 2 Q_2 Q2,描述一条线性贝塞尔曲线;
    • P 3 , P 4 P_3, P_4 P3,P4之间的连续点 Q 3 Q_3 Q3,描述一条线性贝塞尔曲线;
    • Q 0 , Q 1 Q_0, Q_1 Q0,Q1之间的连续点 R 0 R_0 R0,描述一条二次贝塞尔曲线;
    • Q 1 , Q 2 Q_1, Q_2 Q1,Q2之间的连续点 R 1 R_1 R1,描述一条二次贝塞尔曲线;
    • Q 2 , Q 3 Q_2, Q_3 Q2,Q3之间的连续点 R 2 R_2 R2,描述一条二次贝塞尔曲线;
    • R 0 , R 1 R_0, R_1 R0,R1之间的连续点 S 0 S_0 S0,描述一条三次贝塞尔曲线;
    • R 1 , R 2 R_1, R_2 R1,R2之间的连续点 S 1 S_1 S1,描述一条三次贝塞尔曲线;
    • S 0 , S 1 S_0, S_1 S0,S1之间的连续点 B ( t ) B(t) B(t),描述一条四次贝塞尔曲线。


在这里插入图片描述

四次贝塞尔曲线的结构


在这里插入图片描述

四次贝塞尔曲线演示动画,t在[0,1]区间
  1. 高阶曲线
    由上文可知,为构建更高阶的曲线,需要引入更多的中间点。同理可推得五次曲线:


在这里插入图片描述

五次贝塞尔曲线演示动画,t在[0,1]区间

构建贝塞尔曲线公式

  1. 一次曲线(线性):
    P 0 P_0 P0的坐标为 ( α , β ) (\alpha, \beta) (α,β) P 1 P_1 P1的坐标为 ( λ , μ ) (\lambda, \mu) (λ,μ),引入中间点 Q 0 Q_0 Q0的坐标为 ( x , y ) (x, y) (x,y),则有:
    x − α λ − x = t 1 − t \frac{x - \alpha}{\lambda - x} = \frac{t}{1 - t} λxxα=1tt
    可推得:
    x = ( 1 − t ) α + t λ (1) x = (1 - t)\alpha + t\lambda \tag1 x=(1t)α+tλ(1)
    同理,可得:
    y − β μ − y = t 1 − t \frac{y - \beta}{\mu - y} = \frac{t}{1 - t} μyyβ=1tt
    可推得:
    y = ( 1 − t ) β + t μ (2) y = (1 - t)\beta + t\mu \tag2 y=(1t)β+tμ(2)
    整理可得:
    ( x y ) = ( 1 − t ) ( α β ) + t ( λ μ ) (3) \left( \begin{matrix} x \\ y \end{matrix} \right) =(1 - t) \left( \begin{matrix} \alpha \\ \beta \end{matrix} \right) + t \left( \begin{matrix} \lambda \\ \mu \end{matrix} \right) \tag3 (xy)=(1t)(αβ)+t(λμ)(3)
    可将式 ( 3 ) (3) (3)简写为:
    B ( t ) = ( 1 − t ) P 0 + t P 1 , t ∈ [ 0 , 1 ] (4) B(t) = (1 - t) P_0 + t P_1, t \in [0, 1] \tag4 B(t)=(1t)P0+tP1,t[0,1](4)
    得到一次贝塞尔曲线公式。
  2. 二次曲线
    P 0 , P 1 P_0, P_1 P0,P1上的中间点为 Q 0 Q_0 Q0 P 1 , P 2 P_1, P_2 P1,P2上的中间点为 Q 1 Q_1 Q1 Q 0 , Q 1 Q_0, Q_1 Q0,Q1上的中间点为 R 0 R_0 R0 R 0 R_0 R0即构建曲线的连续点。
    带入式 ( 4 ) (4) (4)可得:
    Q 0 = ( 1 − t ) P 0 + t P 1 Q 1 = ( 1 − t ) P 1 + t P 2 R 0 = ( 1 − t ) Q 0 + t Q 1 (5) \begin{matrix} Q_0 = (1 - t) P_0 + t P_1 \\ Q_1 = (1 - t) P_1 + t P_2 \\ R_0 = (1 - t) Q_0 + t Q_1 \end{matrix} \tag5 Q0=(1t)P0+tP1Q1=(1t)P1+tP2R0=(1t)Q0+tQ1(5)
    将式 ( 5 ) (5) (5)中的 Q 0 Q_0 Q0 Q 1 Q_1 Q1代入 R 0 R_0 R0中,可得二次贝塞尔曲线公式:
    B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 , t ∈ [ 0 , 1 ] (6) B(t) = (1 - t) ^ 2 P_0 + 2 t (1 - t) P_1 + t ^ 2 P_2, t \in [0, 1] \tag6 B(t)=(1t)2P0+2t(1t)P1+t2P2,t[0,1](6)
  3. 三次曲线
    同理,通过引入中间点 Q 0 , Q 1 , Q 2 , R 0 , R 1 , S 0 Q_0, Q_1, Q_2, R_0, R_1, S_0 Q0,Q1,Q2,R0,R1,S0,代入使用式 ( 6 ) (6) (6),可得三次贝塞尔曲线公式:
    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 ] (7) 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 \in [0, 1] \tag7 B(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3,t[0,1](7)
  4. 高阶曲线
    可以迭代得到四次、五次贝塞尔曲线的公式:
    B ( t ) = ( 1 − t ) 4 P 0 + 4 t ( 1 − t ) 3 P 1 + 6 t 2 ( 1 − t ) 2 P 2 + 4 t 3 ( 1 − t ) P 3 + t 4 P 4 , t ∈ [ 0 , 1 ] (8) B(t) = (1 - t) ^ 4 P_0 + 4 t (1 - t) ^ 3 P_1 + 6 t ^ 2 (1 - t) ^ 2 P_2 + 4 t ^ 3 (1 - t) P_3 + t ^ 4 P_4, t \in [0, 1] \tag8 B(t)=(1t)4P0+4t(1t)3P1+6t2(1t)2P2+4t3(1t)P3+t4P4,t[0,1](8)

B ( t ) = ( 1 − t ) 5 P 0 + 5 t ( 1 − t ) 4 P 1 + 10 t 2 ( 1 − t ) 3 P 2 + 10 t 3 ( 1 − t ) 2 P 3 + 5 t 4 ( 1 − t ) P 4 + t 5 P 5 , t ∈ [ 0 , 1 ] (9) B(t) = (1 - t) ^ 5 P_0 + 5 t (1 - t) ^ 4 P_1 + 10 t ^ 2 ( 1 - t) ^ 3 P_2 + 10 t ^ 3 (1 - t) ^ 2 P_3 + 5 t ^ 4 (1 - t) P_4 + t ^ 5 P_5, t \in [0, 1] \tag9 B(t)=(1t)5P0+5t(1t)4P1+10t2(1t)3P2+10t3(1t)2P3+5t4(1t)P4+t5P5,t[0,1](9)

三、推导

一般化

观察上文中 1 1 1 5 5 5阶贝塞尔曲线,发现其各项中的常数系数满足组合数规律,故对于 n n n阶贝塞尔曲线,给出定点 P 0 , P 1 , P 2 , . . . , P n P_0, P_1, P_2, ..., P_n P0,P1,P2,...,Pn,其贝塞尔曲线可用下式表示:
B ( t ) = ( n 0 ) ( 1 − t ) n t 0 P 0 + ( n 1 ) ( 1 − t ) n − 1 t 1 P 1 + ⋯ + ( n n − 1 ) ( 1 − t ) 1 t n − 1 P n − 1 + ( n n ) ( 1 − t ) 0 t n P n , t ∈ [ 0 , 1 ] (10) B(t) = \left( \begin{matrix} n \\ 0 \end{matrix} \right) (1 - t) ^ n t ^ 0 P_0 + \left( \begin{matrix} n \\ 1 \end{matrix} \right) (1 - t) ^ {n - 1} t ^ 1 P_1 + \cdots + \left( \begin{matrix} n \\ n - 1 \end{matrix} \right) (1 - t) ^ 1 t ^ {n - 1} P_{n - 1} + \left( \begin{matrix} n \\ n \end{matrix} \right) (1 - t) ^ 0 t ^ n P_n, t \in [0, 1] \tag{10} B(t)=(n0)(1t)nt0P0+(n1)(1t)n1t1P1++(nn1)(1t)1tn1Pn1+(nn)(1t)0tnPn,t[0,1](10)
可化简为:
B ( t ) = ∑ i = 0 ∞ ( n i ) ( 1 − t ) n − i t i P i , t ∈ [ 0 , 1 ] (11) B(t) = \sum_{i = 0}^\infty \left( \begin{matrix} n \\ i \end{matrix} \right) (1 - t) ^ {n - i} t ^ i P_i, t \in [0, 1] \tag{11} B(t)=i=0(ni)(1t)nitiPi,t[0,1](11)
式中组合数:
( n i ) = n ! i ! ⋅ ( n − i ) ! \left( \begin{matrix} n \\ i \end{matrix} \right) = \frac{n !}{i ! \cdot (n - i) !} (ni)=i!(ni)!n!

多项式表达

同时,式 ( 11 ) (11) (11)也可表示为:
B ( t ) = ∑ i = 0 ∞ b i , n ( t ) P i , t ∈ [ 0 , 1 ] (12) B(t) = \sum_{i = 0}^\infty b_{i, n}(t) P_i, t \in [0, 1] \tag{12} B(t)=i=0bi,n(t)Pi,t[0,1](12)
其中多项式:
b i , n ( t ) = ( n i ) ( 1 − t ) n − i t i , i = 0 , 1 , 2 , ⋯   , n (13) b_{i, n}(t) = \left( \begin{matrix} n \\ i \end{matrix} \right) (1 - t) ^ {n - i} t ^ i, i = 0, 1, 2, \cdots, n \tag{13} bi,n(t)=(ni)(1t)niti,i=0,1,2,,n(13)
( 13 ) (13) (13)被称作 n n nBernsteain多项式

Bernsteain多项式
假设开展一个实验,其成功的概率为 u u u。若连续进行这个实验 n n n次,成功的次数恰好为 i i i次,那么其成功概率是多少呢?
能够确定成功概率为: b i , n ( t ) = ( n i ) ( 1 − t ) n − i t i , i = 0 , 1 , 2 , ⋯   , n b_{i, n}(t) = \left( \begin{matrix} n \\ i \end{matrix} \right) (1 - t) ^ {n - i} t ^ i, i = 0, 1, 2, \cdots, n bi,n(t)=(ni)(1t)niti,i=0,1,2,,n.
这便是Bernsteain多项式。

四、应用(Matlab实现)

实现目标

  1. 能够进行控制点坐标的输入。
  2. 计算贝塞尔曲线。
  3. 绘制贝塞尔曲线及其控制点。

脚本编写

main.m(主函数,调用输入函数、贝塞尔曲线计算函数及绘制贝塞尔曲线)

%% 初始化
clc
clear

%% 输入
n = input("请输入控制点个数:\n");
P = pos_input(n);

%% 调用贝塞尔曲线计算函数
P = P';  % 坐标矩阵转置,便于曲线运算及绘图
[t, p] = bezier_curve(P, n - 1);  % 阶数为控制点个数 - 1

%% 绘制贝塞尔曲线
plot(t, p, '-b');  % 绘制贝塞尔曲线
hold on;
plot(P(1,:), P(2,:), '-ro');  % 绘制控制点
title(sprintf('贝塞尔曲线 (阶数: %d)', n - 1));
xlabel('X');
ylabel('Y');
grid on;
legend('贝塞尔曲线', '控制点');
hold off;

bezier_curve.m(贝塞尔曲线函数,计算n阶贝塞尔曲线)

function [Px, Py] = bezier_curve(control_points, order)
    % 计算贝塞尔曲线上的点
    t = linspace(0, 1, 1000);  % 在[0, 1]范围内生成点
    curve = zeros(2, numel(t));  % 初始化曲线矩阵,numel函数用于获取数组元素的数目
    for i = 0 : order
        curve = curve + nchoosek(order, i) * ((1 - t) .^ (order - i)) .* ...
        (t .^ i) .* control_points(:, i + 1);  % 该计算公式即上文中式(11),nchoosek函数用于计算组合数
    end
    Px = curve(1, :);
    Py = curve(2, :);
end

pos_input.m(输入函数,输入控制点坐标)

function P = pos_input(I)
   % 输入贝塞尔曲线控制点 
    P = ones(I, 2);  % 初始化坐标矩阵 
        for i = 1 : I
            P(i, :) = input("请输入输入坐标点P" + num2str(i - 1) + "(以一维矩阵形式输入): \n");
        end
end

图像结果

六阶贝塞尔曲线

在这里插入图片描述

十四阶贝塞尔曲线

在这里插入图片描述

五、参考

  1. 维基百科_贝塞尔曲线
  • 36
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
贝塞尔曲线是一种应用于二维图形应用程序的数学曲线,由线段和节点组成。节点是可拖动的支点,线段像可伸缩的皮筋。贝塞尔曲线可以通过控制点的个数和位置来决定最终曲线的形状。一阶贝塞尔曲线是直线,而其他多阶贝塞尔曲线都是抛物线。贝塞尔曲线在矢量图形软件中被广泛使用,如Photoshop等。\[1\]\[3\] 贝塞尔曲线的数学原理涉及到贝塞尔曲线的参数方程和控制点的计算。具体来说,对于n阶贝塞尔曲线,其参数方程可以表示为: B(t) = Σ(i=0 to n) (nCi) * (1-t)^(n-i) * t^i * Pi 其中,B(t)是曲线上的点,t是参数,取值范围为0到1,n是曲线的阶数,nCi是组合数,Pi是控制点的坐标。通过调整控制点的位置和个数,可以得到不同形状的贝塞尔曲线。 在Matlab中,可以使用bezier函数来绘制贝塞尔曲线。该函数接受一个控制点矩阵作为输入,并返回曲线上的点坐标。例如,使用以下代码可以绘制一个三阶贝塞尔曲线: ```matlab P = \[0 0; 1 2; 3 -1; 4 0\]; % 控制点矩阵 t = linspace(0, 1, 100); % 参数t的取值范围 B = bezier(P, t); % 计算曲线上的点坐标 plot(B(:,1), B(:,2)); % 绘制曲线 ``` 这段代码中,P是一个4行2列的矩阵,每一行代表一个控制点的坐标。t是参数t的取值范围,可以根据需要进行调整。bezier函数会返回一个100行2列的矩阵B,其中每一行代表曲线上的一个点的坐标。最后使用plot函数将曲线绘制出来。 总结起来,贝塞尔曲线是一种由线段和节点组成的数学曲线,可以通过调整控制点的位置和个数来控制曲线的形状。在Matlab中,可以使用bezier函数来绘制贝塞尔曲线。 #### 引用[.reference_title] - *1* *2* [贝塞尔曲线的数学原理](https://blog.csdn.net/weixin_34270606/article/details/89082935)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [贝塞尔曲线(Bezier Curve)原理、公式推导matlab代码实现](https://blog.csdn.net/sinat_35676815/article/details/120884682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值