1.什么是曲线
我们使用一系列的点去定义一条曲线。这些控制点描述了曲线的一些性质。最常见的曲线叫做贝塞尔曲线(Bézier Curve)。
1.1 贝塞尔的画法
在三个点的情况下。在二维情况下,使用三个控制点画出的贝塞尔曲线称为二次贝塞尔曲线(quadratic Bézier)。这是由Pierre Bézier 和 Paul de Casteljau 提出的算法,称为 de Casteljau 算法。
对于 b0, b1, b2 定义的贝塞尔曲线,我们将求贝塞尔曲线的过程转换成求在 𝑡 ∈ [0, 1] 时刻,对应贝塞尔曲线上的点。
在某一时刻 𝑡 对应的点可以按照以下方法求出:
- 求出线段 b0b1 和线段 b1b2 上对应 𝑡 时刻的点 b01b11这个点可以将线段分割为长度 𝑡 和 1 − 𝑡;
- 将 b01, b11 连接起来后,重复步骤 1 即可。点 b02 就是我们得到的最终点。
这是一个递归的计算过程。任何一个点都是时间 𝑡 的一个映射,因此这是显式的几何表示。
在多个点的情况下
在多个点的情况下,我们只需要仿照三个点的情况,每一次都在对应线段上找到对应时刻 𝑡 所对应的点,并将相邻的点连成线段后重复上面的过程,直到得到最后一个点
1.2 贝塞尔曲线的数学表示
通过上一节我们可以看出贝塞尔曲线的画法是类似于递归的方式画出的。我们也知道贝塞尔曲线上的点只和参数 𝑡 有关。因此我们可以得到曲线的数学表示。
其中 𝐵𝑗𝑛(𝑡) 是 Bernstein 多项式,它是 (𝑡 + (1 − 𝑡))𝑛 二项分布的第 𝑛 项展开:
在三维情况下,公式不变。所有的点变成三维空间上的点进行计算即可。
1.3 贝塞尔曲线的性质
贝塞尔曲线满足以下性质:
- 贝塞尔曲线必须过起点和终点;
- 在四个控制点的情况下,贝塞尔曲线在起点的切线是 𝑏′(0) = 3(𝑏1−𝑏0),终点的切线是 𝑏′(1) = 3(𝑏3−𝑏2);
- 对贝塞尔曲线做仿射变换生成的曲线等同于对贝塞尔曲线的控制点做仿射变换后再生成的贝塞尔曲线,这个规律不适用于投影变换;
- 凸包性质。画出的贝塞尔曲线一定在控制点所形成的凸包内。凸包是能够包围所有点的最小凸多边形。
1.4 逐段定义贝塞尔曲线
当我们使用过多的控制点定义一条曲线时,曲线会变得比较平滑,并且不便控制。因此我们一般使用逐段的方式定义贝塞尔曲线。我们每次使用 4 个控制点。我们会把前两个点和后两个点各看作一个控制杆来控制整个曲线。这和 Photoshop 中的钢笔工具是一致的。
对于逐段的贝塞尔曲线,我们需要保证其连续性,我们对连续性有以下定义:
- 如果两条分段曲线的起点和终点重合,那么称为 C0 连接;
- 在上面的情况下,如果第一条曲线终点的切线和第二条曲线起点的切线一样,那么称为 C1 连接;
- 在上面的情况下,如果这两个点的 n 阶导数相同,那么称为 Cn 连接。
一边情况下 C1 连接就显得足够光滑。在某些特殊情况下我们需要更高阶的连续。
2. 样条曲线
样条曲线(Split Curve)可以形象地理解为在定义了多个控制点后,在这些控制点上固定一个有弹性的木条形成的曲线。在任何一点上不论几阶导数都是连续的。最常见的样条曲线称为 B-样条(Basis)。
3. 曲面
我们可以通过曲线的定义扩展出曲面(Surface)的定义。
3.1 贝塞尔曲面
贝塞尔曲面的计算类似于双线性插值的过程。我们使用 4 × 4 个点形成贝塞尔曲面。首先,我们在每一行生成 4 条贝塞尔曲线,接下来在 4 条贝塞尔曲线上找到相同时刻对应的 4 个点生成一条新的贝塞尔曲线。这些贝塞尔曲线的集合形成了贝塞尔曲面。对于贝塞尔曲面,我们需要两个变量 𝑢, 𝑣 对其进行数学表示。