您可以通过从 Catmull-Rom 样条构造补丁来做到这一点。这些样条线将撞击每个控制点,并且它们在一阶导数中是连续的(尽管不是二阶导数)。我还发现它们非常容易使用。数学很简单,它们的行为很直观,控制点略有变化。
在最高级别,每个补丁需要 16 个点(在数据集的边缘,您可以在同一样条曲线中使用角点和边缘点两次)。
首先,您需要在 4x4 矩阵的每一行中的点p[i][j]上进行插值,以创建一组四个中间控制点q[i]。这是我的意思的粗略 ASCII 草图。
p00 p01 q0 p02 p03
p10 p11 q1 p12 p13
p20 p21 q2 p22 p23
p30 p31 q3 p32 p33
现在,您可以在这四个中间控制点中的每一个之间进行插值,以找到曲面上的最终样条点。
这是跨四个点的 Catmull-Rom 样条构造。在此示例中,您使用p[i-2]和p[i+1]两侧的控制点在点p[i-1]和p[i]之间进行插值。 u是从零到一的插值因子。 τ定义为样条上的张力,将影响样条曲面与控制点的紧密程度。
| 0 1 0 0 | | p[i−2] |
|−τ 0 τ 0 | | p[i−1] |
p(u) = 1 u u2 u3 | 2τ τ−3 3−2τ −τ | | p[i] |
|−τ 2−τ τ−2 τ | | p[i+1] |
注意:如何在 Stackoverflow 的 gui 中进行布局并不是很明显,但u2和u3应该分别代表u squared和u cubed。