【CAGD】Bezier 曲线

本篇作为CAGD的入门教程,详细介绍一下 Bezier 曲线。


Bezier 曲线概述

贝塞尔曲线(Bezier Curve)是一种用于生成平滑曲线的数学工具,广泛应用于计算机图形学、动画、设计等领域。

Bezier 曲线由一系列的点(称为控制点)定义,通过调整这些点的位置,可以绘制出平滑且复杂的曲线形状。

Bezier 曲线可以是线性的(一次),也可以是高阶的(二次、三次等)。一个 n 次 Bezier 曲线由 n+1 个控制点 $ P_0, P_1, …, P_n $ 定义。

控制点:分布在空间中的点。

  • 控制点确定曲线的整体形状和走势。
  • 每个控制点都对应一个基函数,所有控制点与对应的基函数的乘积求和即可得到Bezier曲线的函数表达式。

Bezier 曲线的数学表达式为: \(C(t) = \sum_{i=0}^{n} B_{i,n}(t) \cdot P_i\) 其中 $ B_{i,n}(t) $ 是 Bernstein 基多项式。

Bernstein 基函数

对于 Bezier 曲线,基函数为 Bernstein 多项式 Bernstein 基多项式定义为: \(B_{i,n}(t) = C_{n}^{i} t^i (1-t)^{n-i}\) 其中

  • $ C_{n}^{i} $ 是组合数,表示从 n 个不同元素中取 i 个元素的组合方式数量。
  • $ t $ 是参数,范围从0到1。
  • $ i $ 是多项式的索引,范围从0到 $ n $。

Bernstein 基函数性质

以下列举 Bernstein 基函数 在 Bezier 曲线的应用中比较重要的性质。

非负性

对于 $ t \in [0, 1] $,伯恩斯坦多项式 $ B_{i,n}(t) $ 非负。

因为组合数 $C_{n}^{i}$ 是正整数,而 $ t^i $ 和 $ (1-t)^{n-i} $ 在 $ t \in [0, 1] $ 时都是非负的。

归一化

所有 $ n $ 次伯恩斯坦多项式的和为1: \(\sum_{i=0}^{n} B_{i,n}(t) = 1\)

根据二项式定理,我们有: \(1 = (t + (1-t))^n = \sum_{i=0}^{n} C_{n}^{i} t^i (1-t)^{n-i}\)

这个性质确保了贝塞尔曲线的点是控制点的加权和,权重之和为1,从而保证了曲线的稳定性和一致性。

端点性质
  • 在 $ t = 0 $ 时,只有 $ B_{0,n}(0) = 1 $,其他多项式 $ B_{i,n}(0) = 0 $(对于 $ i > 0 $)。
  • 在 $ t = 1 $ 时,只有 $ B_{n,n}(1) = 1 $,其他多项式 $ B_{i,n}(1) = 0 $(对于 $ i < n $)。

这个性质使得贝塞尔曲线的起点和终点分别位于第一个和最后一个控制点上。

对称性

伯恩斯坦多项式关于 $ t = 0.5 $ 对称,即 $ t $ 和 $ 1-t $ 的多项式是镜像对称的。 \(B_{i,n}(t) = B_{n-i,n}(1-t)\)

显然,令 $ t’ = 1 - t $ 带入基函数,函数值相等。

函数递推公式

伯恩斯坦多项式的递推函数可以表示为: \(B_{i,n}(t) = ( tB_{i-1,n-1}(t) + (1-t)B_{i,n-1}(t) )\)

由 $C_{n}^{i} = C_{n-1}^{i} + C_{n-1}^{i-1}$ 直接带入即得。

导数递推公式

伯恩斯坦多项式的导数可以表示为: \(B'_{i,n}(t) = n ( B_{i-1,n-1}(t) - B_{i,n-1}(t) )\)

求导后提出n即可。

最大值

$ B_{i,n}(t) $ 在 $ t = j/n $ 达到最大值。

deCasteljau 算法

理解了 Bernstein 基函数, Bezier 曲线只是由控制点做系数,由基函数线性组合的函数罢了。 因此,由 Bernstein 基函数的性质可以直接得到 Bezier 曲线的性质。

不过,Bezier 曲线还有一个基于线性插值的视角,也称为 deCasteljau 算法。 这是一种递归算法,通过逐步计算内插点来逼近曲线。由于其数值稳定性,通常优先选择 deCasteljau 算法。

  • 对于一次贝塞尔曲线(线性插值),公式为: \(P(t) = (1-t)P_0 + tP_1\)
  • 这是一个简单的线性插值,连接两个控制点 $ P_0 $ 和 $ P_1 $ .

  • 对于更高次的贝塞尔曲线,递归定义为: \(P_i^k = (1-t) P_i^{k-1} + t P_{i+1}^{k-1}\)
  • 其中 $ P_i^0 = P_i $ 是初始控制点,最终的 $ P_0^n $ 是曲线上的点.

其实参考上面的基函数递推公式即可得到。

这个视角下产生了一个新概念,控制多边形。

控制多边形:控制点通过线段连接形成多边形。

因此进一步说,Bezier 曲线完全由控制多边形决定。

导矢

贝塞尔曲线的导矢可以通过递推公式来计算。

对于一个 $ n $ 次贝塞尔曲线,其导矢的递推公式如下:

  • 对于一次贝塞尔曲线,导矢直接由两个控制点的差乘以次数得到: \(C'(t) = P_1 - P_0\)

  • 对于 $ n $ 次贝塞尔曲线,导矢可以通过 $ n-1 $ 次贝塞尔曲线的导矢来计算。具体来说,导矢的递推公式为: \(C'(t) = n ( B_{0,n-1}(t) \cdot (P_1 - P_0) + B_{1,n-1}(t) \cdot (P_2 - P_1) + \cdots + B_{n-1,n-1}(t) \cdot (P_n - P_{n-1}) )\)
  • 定义控制多边形边矢量 $ \Delta P_i = P_{i+1} - P_i $ 有 \(C'(t) = n ( \sum_{i=0}^{n-1} B_{i,n-1}(t) \cdot \Delta P_i)\)
  • 其中 $ B_{i,n-1}(t) $ 是 $ n-1 $ 次伯恩斯坦多项式。

可以看到导矢曲线也是 Bezier 曲线,是低一次,由控制多边形边矢量作为控制点的 Bezier 曲线。

对于高阶的情况,可以由一阶导矢简单得到,这里不再赘述。

Bezier 曲线性质

由上面两个视角的讨论,可以得到 Bezier 曲线的性质:

几何不变性/仿射不变性

控制多边形具有几何不变性/仿射不变性,立刻得到 Bezier 曲线有几何不变性/仿射不变性。

端点性质

贝塞尔曲线的起点和终点分别位于第一个和最后一个控制点上。 即对于一个 $ n $ 次贝塞尔曲线,当参数 $ t = 0 $ 时,曲线点 $ C(0) = P_0 $;当参数 $ t = 1 $ 时,曲线点 $ C(1) = P_n $。

线性插值视角下比较显然。

这个性质使得曲线的端点位置与控制多边形的端点位置一致,便于确定曲线的起始和终止位置。

端点导矢

端点导矢的方向与控制多边形的第一条边和最后一条边的方向一致,大小与边长成比例.

  • 在起点 $ t = 0 $ 处,导矢为: \(C'(0) = n(P_1 - P_0)\)
  • 在终点 $ t = 1 $ 处,导矢为: \(C'(1) = n(P_n - P_{n-1})\)

    线性插值视角下比较显然。

这使得曲线在端点处的切线方向与控制多边形的端点连线方向相关联,便于控制曲线的起始和终止切线方向。

对称性

如果将控制点序列 $ P_0, P_1, \ldots, P_n $ 反转为 $ P_n, P_{n-1}, \ldots, P_0 $,则贝塞尔曲线的形状不变,只是方向相反。

显然,由基函数对称性可知。

凸包性

贝塞尔曲线完全位于其控制点构成的凸包内部。凸包是指包含所有控制点的最小凸多边形或凸多面体。

在线性插值视角下比较显然。

这个性质限制了曲线的范围,确保曲线不会超出控制多边形的边界。它为曲线的形状提供了直观的约束,便于预测和控制曲线的走向。

在计算机图形学中,凸包性可以用于快速判断曲线与某个区域或对象的相交关系,提高计算效率。

如果和凸包不相交,一定和曲线不相交。

变差减少性

贝塞尔曲线的变差(即曲线与任意直线的交点个数)不会超过其控制多边形的变差(不包括曲线所在平面)。变差是指曲线/控制多边形与某平面的交点个数。

这个性质表明贝塞尔曲线的形状变化不会比控制多边形更剧烈,曲线的“波动”程度受到控制多边形的限制。

进一步,如果控制多边形是凸的,则曲线也是凸的。

移动控制点

移动第j个控制点对 $t=j/n$ 处的点影响最大。

因为对应基函数在这一点取到最大值。

分段 Bezier 曲线

根据定义,显然 Bezier 曲线每一个点变化都会影响整条曲线。如果要改变一个很长的曲线的中间一部分,就非常困难。

最简单的方式是把曲线分成多段,每段是单独的Bezier曲线,这样就更容易调整。

因此,分段 Bezier 曲线的控制点可以较容易的控制曲线,同时控制点的个数可以决定曲线的次数,进而控制光滑程度。

分段 Bezier 曲线拼接

考虑到曲线整体的光滑性,分段 Bezier 曲线在拼接时要注意不同阶几何连续的约束。

  • $ G^0 $ 连续性(位置连续):
    • 定义:曲线在连接点处的位置相同。
    • 公式表示: \(P_{n} = Q_{0}\) 其中 $ P_{n} $ 是第一个曲线段的最后一个控制点,$ Q_{0} $ 是第二个曲线段的第一个控制点。
  • $ G^1 $ 连续性(一阶导数比例连续):
    • 定义:曲线在连接点处的切线方向和大小相同。
    • 公式表示: \(n_1 (P_{n} - P_{n-1}) = k \cdot n_2 (Q_{1} - Q_{0})\) 其中 $ n_1 $ 和 $ n_2 $ 是两个曲线段的次数,$ k $ 是比例常数。
  • $ G^2 $ 连续性(曲率连续):
    • 定义:曲线在连接点处的曲率相同。
    • 公式表示: \(\frac{n_1-1}{n_1} \frac{|\Delta P_{n-2} \times \Delta P_{n-1}|}{|\Delta P_{n-1}|^3} = \frac{n_2-1}{n_2} \frac{|\Delta Q_{0} \times \Delta Q_{1}|}{|\Delta Q_{0}|^3}\) 其中 $ n_1 $ 和 $ n_2 $ 是两个曲线段的次数。

分段 Bezier 曲线的问题

分段 Bezier 曲线有更容易调节的优势,然而分段 Bezier 曲线无法精确的表示某些二次曲线(如圆),解析式存在误差。

NURBS 曲线作为分段 Bezier 曲线的扩展,解决了这个问题。

我们将在下一篇详细讲解 B 样条曲线,进而讲解 NURBS 曲线。

注:另一种解决方案是 有理 Bezier 曲线,但其本质是仍是 NURBS 曲线,在此不展开讲了。