日期:2024年5月19日标签:Algorithm/Math

曲线插值之艾特肯算法 #

曲线插值是计算机图形学中使用的一种曲线近似方法,你可能在设计工具中使用过设计曲线功能,例如绘制贝塞尔曲线或者 b 样条曲线,通过调整几个控制点来绘制曲线,这些都用到曲线插值算法。所以这里介绍艾特肯插值算法(Aitken's Algorithm)。

多项式曲线插值 #

何为多项式曲线插值?你肯定知道线性插值(Linear Interpolation),就是给定两个点 (x0,y0)(x_0, y_0)(x1,y1)(x_1, y_1) 在这两点之间的连线上确定一个未知点。

线性插值

利用等比关系:

yy0xx0=y1y0x1x0\frac{y - y_0}{x - x_0} = \frac{y_1 - y_0}{x_1 - x_0}

很容易得到,线性插值的公式为:

y=y0+(xx0)y1y0x1x0=(xx0)y1+(x1x)y0x1x0\begin{aligned} y &= y_0 + (x - x_0)\frac{y_1 - y_0}{x_1 - x_0} \\ &= \frac{(x-x_0)y_1 + (x_1 - x)y_0}{x_1 - x_0} \end{aligned}

艾特肯算法 #

艾特肯算法是一种曲线近似方法,通过给定控制点,计算控制点间的插值点来模拟曲线。

在计算机图形学中,曲线一般用参数化方程表示。3D 中最常用的是三次曲线方程,形式如下:

p(t)=c0+c1t+c2t2+c3t3p(t) = c_0 + c_1t + c_2t^2 + c-3t^3

这里就不过多介绍参数化曲线方程的概念了,这并不是本节内容的目的,如果有需要可以看看这篇文章:https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/curves/curves.html

艾特肯的算法思想是递归,将复杂的问题,分为两个简单的问题,分别解决这两个简单的问题,然后合并简单问题的解决方案得到复杂问题的解决方案。

假设有 n 个控制点,艾特肯算法将复杂的插值问题拆分如下:

  • 抛弃最后一个控制点,计算前 n - 1 个控制点的插值曲线
  • 抛弃第一个控制点,计算后 n - 1 个控制点的插值曲线

最后合并(blender) 上述两段曲线。如果前 n - 1 个控制点的插值曲线的计算仍然复杂,可以继续按照上述思路递归分解合并,分解直到只有两个控制点时,使用线性插值的方式,计算插值曲线。

为了简化问题,这里我们只看 yy 分量即可,因为针对的是参数方程,xx 坐标的插值算法是与 yy 相同的。 因为分解问题后,我们在控制点间能得到很多段线段,我们用 yi1(t)y_i^1(t) 表示 yiy_iyi+1y_{i+1} 之间的线段,使用 yi2(t)y_i^2(t) 表示 yiy_iyi+2y_{i+2} 之间的二次曲线。

先看一个简单的例子,假设有三个控制点 (t1,y1),(t2,y2),(t3,y3)(t_1, y_1), (t_2,y_2),(t_3, y_3)y12(t)y_1^2(t)y1,y2,y3y_1, y_2, y_3 的插值曲线,它是由 y11(t)y_1^1(t)y21(t)y_2^1(t) 合并得到。

艾特肯曲线插值

由线性插值算法能够得到第一段和第二段线段的方程:

y11(t)=(t2t)y1+(tt1)y2t2t1y21(t)=(t3t)y2+(tt2)y3t3t2y_1^1(t) = \frac{(t_2 - t)y_1 + (t - t_1)y_2}{t_2 - t_1} \\ y_2^1(t) = \frac{(t_3 - t)y_2 + (t - t_2)y_3}{t_3 - t_2}

二次曲线 y12(t)y_1^2(t) 的公式,仅仅是在 y11(t)y_1^1(t)y21(t)y_2^1(t) 进行线性插值即可。

y12(t)=(t3t1)[y11(t)]+(tt1)[y21]t3t1y_1^2(t) = \frac{(t_3 - t_1)[y_1^1(t)] + (t - t_1)[y_2^1]}{t_3 - t_1}

艾特肯算法的通用公式如下:

yi0=yiyij(t)=(ti+jt)[yij1(t)]+(tti)[yi+1j1(t)]ti+jtiy_i^0 = y_i \\ y_i^j(t) = \frac{(t_{i + j} - t)[y_i^{j - 1}(t)] + (t - t_i)[y_{i + 1}^{j - 1}(t)]}{t_{i+j} - t_i}

不足之处 #

在本篇最后我们希望通过艾特肯算法模拟下图中的曲线,这是一个横着的 S 曲线。

艾特肯模拟曲线

通过艾特肯算法模拟后,结果如下。

艾特肯算法的缺点

艾特肯算法的缺点

可以看到通过艾特肯算法,控制点好像并不能真的能控制曲线的形状,第二个第三个控制点貌似失控了,这往往并不是我们想要的结果,所以设计工具中艾特肯插值曲线并不流行。

(完)

目录