贝塞尔曲线由起点P0,终点Pn和控制点Pi组成,曲线上点为B点,由当前控制点到下一控制点的线段比例t确定,t∈[0,1] 。
假设B(x,y),P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3)。
常用的是三阶贝塞尔曲线,常用在无人驾驶车辆的泊车轨迹生成中。
一、三阶贝塞尔曲线
一阶贝塞尔曲线只有起点P0和终点P1,B点为按照比例t逐渐由P0到P1,此时贝塞尔曲线即为一条直线,与线段P0P1重合:
二阶贝塞尔曲线Q1与Q2仍然是按照比例t选取的点,B点是Q1Q2上比例为t的点,因此有:
三阶贝塞尔曲线的比例计算同理,沿用二阶贝塞尔曲线的轨迹点方程:
贝塞尔曲线使用比例t得出散列点的坐标,贝塞尔曲线与起点和终点处的线段是相切的(画的不标准)。可以看到上式中,控制点的系数满足二项式的展开。 因此贝塞尔曲线还有其他表示方式如下,其中i∈[0,n]。
二、使用MATLAB绘制bezier曲线
如下是一个MATLAB脚本文件,可绘制贝塞尔曲线。控制点可自行设定。
clc;
clear;
close;
%% 选取控制点
control_point = [0,0;
4,6;
6,2;
12,3;
15,5;
22,9;
27,2;
33,6;
38,3];
%% 迭代求解
index = 1;
for p = 0:0.01:1
ctrl_pnt = control_point;
[row,col] = size(ctrl_pnt);
while(row > 1)
for j = 1:row-1
ctrl_pnt(j,1) = (1-p)*ctrl_pnt(j,1) + p*ctrl_pnt(j+1,1);
ctrl_pnt(j,2) = (1-p)*ctrl_pnt(j,2) + p*ctrl_pnt(j+1,2);
end
row = row - 1;
end
bezier_points(index,:) = ctrl_pnt(1,:);
index = index + 1;
end
%% 绘制曲线
plot(bezier_points(:,1),bezier_points(:,2),'b-','LineWidth',2);
hold on
plot(control_point(:,1),control_point(:,2),'ro','LineStyle','--');
三、贝赛尔曲线的不足
Bezier曲线曲面有很多优点,可以用鼠标拖动控制顶点,改变曲线的形状,非常直观,给设计人员很大的自由度。但Bezier曲线有几点不足:
(1)一旦确定了控制点数(n+1个),则曲线阶次确定(n次),当顶点数过多时,Bezier的阶次很高。且高次Bezier的导数会有很多零点,造成曲线出现过多极值点,表现为曲线的震荡。
(2)为了克服这一现象,可以采用分段Bezier曲线拼接的方式。但Bezier曲线或曲面的拼接又比较复杂。因为拼接过程需要满足拼接点的0阶、1阶甚至更高阶连续性,条件比较复杂苛刻。
(3)Bezier曲线或曲面无法进行局部修改,因为伯恩斯坦基函数的在整个区间都有值,即整个曲线的区间都是伯恩斯坦基函数的支撑区间。
参考链接: