我不得不承认,我对 3D 样条插值的可用代码和算法真的很困惑。 对于我的应用程序,我需要一条路径:给定一些在 3D 空间中定义的点,我需要使用样条函数(立方、贝塞尔曲线等)对它们进行插值。在互联网上的研究并没有给我一个解决方案,只有更多的困惑。
这个算法引起了我的注意algorithm .它定义了一些 3D 点(使用 MATLAB):
[X, Y, Z] = meshgrid(x, y, z);
然后调用MATLAB插值函数:
s = exp(-sqrt(X.^2 + Y.^2 + Z.^2));
sinterp = interp3(x, y, z, s, 0., 0., 0.)
函数 s 有什么用!?插值显然只需要三个点就可以了。这个功能是做什么用的?
因为我是一名 C++ 程序员,所以我尝试使用以下 alglib提供一些有用功能的库。但即使有 3 点也不够,我必须调用一个我不知道的函数。
在我的应用程序中,3D 点在空间中随机散布如下 picture .我的问题并不假定我需要一个函数来连接这些点。即使我确实需要它,我也不知道如何定义它。
我处理这个问题的方式有什么问题?我使用了错误的库函数吗?或者我应该有样条生成功能吗?如果是,我如何获得这个功能?
问候
最佳答案
interp3() 应该对体数据点(Xi、Yi、Zi、Si)进行插值,i=1~N。它将生成一个函数 S=f(X, Y, Z)。这就是为什么它需要您的帖子中提到的额外输入的原因。
当你遇到一个插值问题/算法时,首先要弄清楚你要找什么样的函数。即,函数是单变量 (y=f(x))、双变量 (z=f(x,y)) 还是多变量 (s=f(x, y, z, ....) )。对于您想要使用样条插值一系列 3D 点的特定问题,基本上它是一个单变量插值问题。然而,由于空间曲线不能表示为 y=f(x),样条函数将以参数形式表示为 S(t)=(x(t), y(t), z(t)).
通过 3D 数据点进行样条插值的方法有很多种。其中,非常容易实现的两个算法是Catmull Rom样条和Overhauser样条。两者都是三次样条,仅在如何估计数据点的一阶导数方面有所不同。您可以用谷歌搜索它们以了解详细信息。
关于c++ - 对 3D 空间中的样条插值感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27470318/