在计算机图形学中,我们经常需要在屏幕上绘制各种类型的对象。这些对象并不总是平坦的,很多时候我们需要绘制曲线来描绘一个物体。
在深入 Hermite 曲线之前,让我们先来探讨一下曲线的基本概念。样条曲线主要分为两种类型:
1. 逼近样条曲线: 在这种情况下,曲线并不经过控制点,而是从控制点附近通过。正如下图所示,Bezier 曲线和 B 样条曲线就是典型的例子。
2. 插值样条曲线: 在这种情况下,曲线会穿过所有的控制点。Hermite 曲线就是一个典型的例子。
Hermite 曲线是以法国数学家 Charles Hermite 的名字命名的,它是一种插值分段三次多项式曲线。它在每个控制点处都有指定的切线。Hermite 样条曲线可以进行局部调整,因为每一段曲线仅取决于其端点的约束条件。
如果 P(k) 表示控制点 Pk 和 P 之间曲线段的参数三次点函数,那么定义 Hermite 曲线段的边界条件如下:
P(0)= Pk
P(1)= P_k+1
P‘(0)= DPk (P(0) 的导数)
P‘(1)= DP_k+1 (P(1) 的导数)
其中 DPk 和 DPk+1 指定了控制点 Pk 和 Pk+1 处的参数导数值(即曲线的斜率)。生成的 Hermite 曲线如下图所示:
我们要知道 Hermite 曲线是一个三次多项式。所以我们可以这样写:
P(u)= au^3 +bu^2 +cu+d, 其中 0<=u<=1
Px(u)= axu^3+ bxu^2+ cxu+ dx
Py(u)= ayu^3+ byu^2+ cyu+ dy
Pz(u)= azu^3+ bzu^2+ cz^u+ dz
现在让我们对三次多项式 P(u) 进行求导。求导后,我们得到:
P‘(u)= 3au^2+ 2bu+ c
接下来,我们将把边界条件 u=0 和 u=1 应用到 P(u) 上。
我们首先应用 u=0
Pk=P(0)= a0+ b0+ c0+ d1 —-(1)
第二个边界条件 u=1,
Pk=P(1)= a1+ b1+ c1+ d1 ——(2)
对于 P 的导数,我们现在应用边界条件。首先,应用 u=0
P‘(0)= 3a0+ 2b0+ c1+ d0 ——(3)
现在应用 u=1
P‘(1)= 3a1+ 2b1+ c1+ d1 ——(4)
这些就是我们将边界条件应用于 P(u) 和 P‘(u) 后得到的四个线性方程。现在我们将把这四个方程写成矩阵的形式,如下图所示。
\begin{bmatrix} P(0)\\ P(1)\\ P‘(0)\\ P‘(1)\\ \end{bmatrix} or \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix} = \begin{bmatrix} 0 & 0& 0 & 1\\ 1 & 1& 1 & 1\\ 0& 0 & 1& 0\\ 3& 2& 1 & 0 \end{bmatrix} \begin{bmatrix} a\\ b\\ c\\ d\\ \end{bmatrix}
我们可以通过执行所需的矩阵运算来计算 a, b, c 和 d 的值,如下所示。
\begin{bmatrix} a\\ b\\ c\\ d\\ \end{bmatrix}\begin{bmatrix} 0 & 0& 0 & 1\\ 1 & 1& 1 & 1\\ 0& 0 & 1& 0\\ 3& 2& 1 & 0 \end{bmatrix} = \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix}
\begin{bmatrix} a\\ b\\ c\\ d\\ \end {bmatrix} = \begin{bmatrix} 0 & 0& 0 & 1\\ 1 & 1& 1 & 1\\ 0& 0 & 1& 0\\ 3& 2& 1 & 0 \end{bmatrix}^{-1} \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix}
\begin{bmatrix} a\\ b\\ c\\ d\\ \end {bmatrix} = \begin{bmatrix} 2 & -2& 1& 1\\ -3 & 3 & -2 & -1\\ 0& 0 & 1 & 0\\ 1& 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix}
上面计算出的矩阵被称为 Hermite 矩阵,记为 MH。所以我们可以将方程写成如下形式。
\begin{bmatrix} a\\ b\\ c\\ d\\ \end {bmatrix} = MH . \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix}
我们要知道 P(u)= au^{3}+bu^3+cu+d
P(u)= u^{3}+u^2+u+1 \begin{bmatrix} a\\ b\\ c\\ d\\ \end {bmatrix} = u+u+u+1 . MH \begin{bmatrix} P{k}\\ P{k+1}\\ DP{k}\\ DP{K+1}\\ \end{bmatrix}
在上图中将右侧的矩阵相乘后,我们将得到:
P(u)= Pk (2u3 – 3u2 + 1) + Pk+1(-2u3+3u2) + DPk(u3-2u2+u) + DPk+1(u3-u2)
P(u)= PkH0(u) + Pk+1H1(u) + DPkH2(u) + DPk+1H3(u)
其中 H0, H1, H2, H3 是 Hermite 混合函数。
Hermite 混合函数
- 概念重新对齐
- 曲线是点/向量的加权平均值。
- 混合函数指定了权重。
应用
Hermite 曲线用于在二维平面上对采样点进行插值,从而产生一条光滑的曲线,但它不是自由形式的曲线,这与 Bezier 曲线和 B 样条曲线不同。最常用的三次样条是 3-D 平面曲线。
优点
Hermite 曲线易于计算。它们用于平滑地穿过控制点进行插值。理解 Hermite 曲线的数学背景将有助于我们理解整个样条曲线家族。
缺点
- 需要一阶导数;对于设计师来说,提供一阶导数并不合适。