Math 点序列插值

Math 点序列插值,math,graphics,vector-graphics,bezier,splines,Math,Graphics,Vector Graphics,Bezier,Splines,给定空间中的任意点序列,如何在它们之间生成平滑的连续插值 欢迎使用2D和3D解决方案。以任意粒度生成点列表的解决方案和为贝塞尔曲线生成控制点的解决方案也值得赞赏 此外,如果看到一个迭代解决方案,它可以在曲线接收到点时近似于曲线的早期部分,这样您就可以使用它进行绘制,那将是一件非常酷的事情。您看过Unixspline命令了吗?这能强迫你做你想做的吗?一种方法是,这是一种生成多项式的方法,它将遍历所有给定的数据点 在我大学的第一年,我写了一个小工具,用2D做这个,你们可以,它叫做拉格朗日解算器。维基

给定空间中的任意点序列,如何在它们之间生成平滑的连续插值

欢迎使用2D和3D解决方案。以任意粒度生成点列表的解决方案和为贝塞尔曲线生成控制点的解决方案也值得赞赏


此外,如果看到一个迭代解决方案,它可以在曲线接收到点时近似于曲线的早期部分,这样您就可以使用它进行绘制,那将是一件非常酷的事情。

您看过Unixspline命令了吗?这能强迫你做你想做的吗?

一种方法是,这是一种生成多项式的方法,它将遍历所有给定的数据点

在我大学的第一年,我写了一个小工具,用2D做这个,你们可以,它叫做拉格朗日解算器。维基百科的页面也有一个示例实现

它的工作原理是这样的:你有一个n阶多项式,
p(x)
,其中n是你的点数。它的形式是
a_n x^n+a_(n-1)x^(n-1)+…+a_0
,其中
是下标,
^
是电源。然后将其转化为一组联立方程:

p(x_1) = y_1
p(x_2) = y_2
...
p(x_n) = y_n
你把上面的转换成增广矩阵,然后求解系数
a\u 0。。。a\n
。然后你有一个多项式,它穿过所有的点,现在你可以在点之间插值


但是请注意,这可能不适合您的目的,因为它无法调整曲率等-您只能使用无法更改的单一解决方案。

不幸的是,拉格朗日插值或其他形式的多项式插值无法在任意点集上工作。它们仅适用于一维的集合,例如x

xi 对于任意点集,例如飞机飞行路径,其中每个点都是(经度、纬度)对,您最好仅使用当前经度、纬度和速度对飞机的旅程进行建模。通过根据飞机离下一个航路点的距离调整飞机的转弯速度(其角速度),可以实现平滑曲线


生成的曲线在数学上并不重要,也不会为您提供贝塞尔控制点。然而,无论航路点的数量如何,该算法在计算上都很简单,并且可以生成任意粒度的插值点列表。它也不需要您提前提供完整的点集,您只需根据需要将航路点添加到集合的末尾。

有几种算法可用于在一组原始(但最终)点集之间进行插值(和解算)。你应该检查一下,它们还包括这些算法的C++实现。

< P>谷歌“正交回归”。 最小二乘法试图最小化拟合线和每个f(x)之间的垂直距离,而正交回归则最小化垂直距离

附录


在存在噪声数据的情况下,这种古老的算法也值得一试

在3D图形世界中,NURBS非常流行。进一步的信息很容易在谷歌上搜索。

保证通过所有的控制点。我发现这比为其他类型的样条曲线调整中间控制点更方便

这对样条曲线的数学有一个很好的简要介绍。最好的总结句是:

Catmull Rom样条曲线具有C1 连续性、本地控制和 插值,但不在 它们控制的凸包 要点

换句话说,如果点表示向右急转弯,样条曲线将在向右转弯之前向左倾斜(文档中有一个示例图片)。这些匝数的紧密度是可控的,在这种情况下,使用示例矩阵中的tau参数

下面是一些可下载的DirectX代码

你应该看看。与贝塞尔曲线相比,它们的优势在于每个部分只依赖于局部点。所以,移动一个点不会影响曲线中距离较远的部分,其中“距离”由样条曲线的参数确定


Langrange多项式的问题是,添加一个点可能会对曲线的任意部分产生极端影响;没有像上面描述的那样的“本地性”。

我提出了同样的问题,并在前几天与一些朋友一起实现了它。我想分享github上的示例项目



您可以随意使用。

这是一个寻找解决方案的有趣地方!谢谢我去看看,投赞成票。几年前,我在一个视频游戏中使用了Catmull,它很有魅力。这正是Catmull Rom设计的目的(特别是,让运动样条线穿过控制点)。