什么是贝塞尔曲线?

贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发。1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier)将其应用于汽车的主体设计,并广泛发表。

众所周知:

  • 线段(一次贝塞尔曲线):给定起点与终点的坐标,就能确定唯一的一条线段;
  • 圆(椭圆):给定圆心坐标和半径大小,就可以通过方程计算出圆周上每一点的坐标;
  • 矩形:给定对角点的坐标,也可以顺利求出四条边上的所有点。

随着计算机日益普及,常常需要在电脑绘制图形,如果采用鼠绘的方式无疑很难绘制出满意的图形。那么,除了抛物线等规则的曲线,普通的曲线该如何在电脑上描述呢?答案便是贝塞尔曲线。

如何绘制一条贝塞尔曲线?

$n$次贝塞尔曲线由三类点来描述:

  • 一个 起点 $P_0$
  • $n-1$个 控制点 $P_1,\cdots,P_{n-1}$
  • 一个 终点 $P_n$
二次贝塞尔曲线 三次贝塞尔曲线 四次贝塞尔曲线
bazier2 bazier3 bazier4

如图所示,可将所有点依次组成一个坐标向量 $P=[P_0,P_1,\cdots,P_n]^T$。

通过下述方法即可绘制一个精度为$t$的贝塞尔曲线:

  1. 将坐标向量$P$($P^*$)中两两相邻点确定的线段$t$等分;
  2. 取第$i$个等分点,构成新的坐标向量$P^*$;
  3. 重复步骤1~2,直到$P^*$中仅含一个点,该点便是贝塞尔曲线上的点;
  4. 重复步骤1~3,将贝塞尔曲线上的点用光滑的线连接起来。
如何计算贝塞尔曲线上的点?

以三次贝塞尔曲线为例,其坐标向量为

根据矢量运算法则,得到第$i$个等分点的坐标(第一次迭代)为

整理即

同理,第二次迭代得到

整理即

经过最终迭代后,得到曲线上的第$i$点坐标

记$k=\frac{i}{t}$。显然,$k\in[0,1]$。

因此,$n$次贝塞尔曲线可以简记为

matlab 程序示例

自定义m函数bezi2()可以求取任意精度(默认为100)与任意阶(由坐标向量中的点数确定)的贝塞尔曲线,结果为以复数形式表示的贝塞尔曲线上点的坐标。其源码如下:

>> plot(bezi2([1,1;1,3;9,1;9,3])), grid

function [B] = bezi2(Pt)
% P = [起点,坐标;...;控制点,坐标;...;终点,坐标]
% t = 曲线精度(默认100)
% B = [(t+1)×2]
    if nargin < 2, t = 100; end
    n = size(P,1);
    k = (0:t)'/t;
    b = zeros(t+1,n);
    for i=1:n,
        b(:,i) = nchoosek(n-1,i-1)*(1-k).^(n-i).*k.^(i-1);
    end
    B = b*P*[1;1j];
end

运行结果如图:

bazier0

与缺少其中一个控制点的二次贝塞尔曲线对比图如下:

bazier

从图中可以看到,控制点有点类似于“拉扯”的效果。因此,通过控制控制点的个数与位置,就能轻松在电脑上绘制出理想的曲线。

如果您喜欢这篇文章,欢迎转载、演绎或用于商业目的,但请务必保留作者署名以及本文链接!
Copyright © Pandaman