如何在二维空间中的点之间平滑插值?

时间:2012-07-15 15:46:20

标签: math graphics interpolation curve spline

假设我有一些点,每个点由二维笛卡尔坐标系中的X和Y坐标定义。每个点的X坐标都大于它的前一个坐标,因此不能有任何循环。

如何通过这些点绘制平滑线?结果应该看起来像正弦波,但幅度和波长不同。只要它允许我计算插值点的Y坐标而不使用任何线条或样条函数库函数,它就会被简化或近似。语言没关系,我对算法感兴趣,而不是实现。为了完整披露,我计划用JavaScript实现它。

我想远离Bézier样条线或带控制点的复杂数学。我觉得必须有一个简单的解决方案,可能适用于与点之间的距离或类似的东西。

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:0)

听起来你需要一个插值多项式。您可以通过多种方式来适应它。试试看这个

http://en.wikipedia.org/wiki/Polynomial_interpolation#Constructing_the_interpolation_polynomial

如果您有大量的点数,那么您可能会考虑使用近似值,否则您可能会遇到过度拟合以及点之间数据表示不佳的问题。在这种情况下,您可以使用最小二乘多项式近似。这取决于您需要的准确程度。

http://en.wikipedia.org/wiki/Least_squares#Linear_least_squares

特别是,如果您的数据是正弦曲线,您实际上可以使用三角函数基函数(不同整数频率的正弦或余弦函数)而不是x的常规幂来近似数据。

或者,您可以使用不涉及控制点的非参数方式使用样条插值

http://en.wikipedia.org/wiki/Spline_interpolation

使用样条曲线可以防止您使用基本高次多项式插值获得潜在的狂野振荡。

与所有近似问题一样,如果没有看到数据(及其数量),很难给出确定的答案。最终,如果您有大量数据,基本多项式插值不是您的朋友,就好像您有1000个插值点,您需要一个999度多项式。

答案 1 :(得分:0)

你无法避免这里的“复杂”数学。它并没有那么复杂。

Cubic splines是解决问题的好方法。对于类似的任务,我发现this论文有简短的解释和我用于计算的矩阵。

您可以尝试使用近似方法。 “最小二乘法”及其修改是最简单,易于实现的一种。