c++ - 对 3D 空间中的样条插值感到困惑

标签 c++ 3d computational-geometry spline sequence-points

我不得不承认,我对 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/

相关文章:

c++ - C++20前后std::atomic的初始化

c++ - 为什么 C++11 会按值移动构造函数拷贝?

python - Pandas 3D obj模型加载

java - 当我们有坐标列表时如何在 JTS 中创建多边形?

python - 在球体表面均匀分布点的万无一失的算法?

c# - .NET 互操作是来回复制数组数据,还是固定数组?

c++ - 串行端口轮询在 Beaglebone Black 上不起作用

rendering - 我应该如何处理裁剪到观察平面的 3D 点的投影?

python - 如何将 3D 散点投影到 xy 平面上?

python - 将一对二的 x-y 数据分为顶部和底部集