2013-12-10 91 views
6

我正在寻找一种方法来插入来自某些二维分散数据的值。我有一个3d点,代表我想插入中间点的地形。对于输入(X,Y)坐标,我需要Z(高度)值。分散数据在二维值插值

This article on wikipedia也可能帮助你了解我的愿望。在matlab中有一个名为triscateredinterp的图书馆,我认为它符合我的要求。

在C++中完成这种插值的轻量级方法是什么?

+0

是您在2D输入上的数据高度?它是在一个规则的网格上,还是分散的? – Michael

+0

我散布了3D点。我的数据是高度。 – mitjap

+0

,你想给** 2D **值并插入高度? – Michael

回答

1

我不认为你需要3D插值(triscateredinterp)。你有基于2D输入的数据;第三维是你的输出。如果我理解正确,你想提供一个2D点(原点之间的东西,并插值)

轻重量?最近邻!然后双线性插值;然后双立方(和其他)。第一个是简单,有些则需要数学的量增加

双线性:对于要插入的每个点,找到最近的3点到你的X和Y:

lat long Altitude 
X1 Y1 A1 
X2 Y2 A2 
X3 Y3 A3 

让这些矩阵:

X1 Y1 1      A1 
X = X2 Y2 1     Y = A2 
    X3 Y3 1      A3 

B是插值系数,我们将针对这三个最近的点计算(并在该地区可以重新用于所有点)

B1 
B = B2 
    B3 

矩阵方程为:X*B = Y

你可以使用brut force: XT乘以两边:XT*X*B = XT*Y
取XT * X的倒数:B = (XT*X)^-1 *XT*Y

是3x3矩阵求逆。将这回归到C++问题,您可以使用Boost来进行矩阵运算。

这里是另一个类似C++的问题:Solving a system of equations programmably?

一个问题可以从双线性技术出现是因为你的插入点变得更接近于一组不同的3个值,你可以得到一些跳跃(会怎样你可以在鞍座配置中插入4个点吗?)

+0

感谢您的回答。我熟悉矩阵乘法和C++ :)我在这里有点困惑。在计算时如何处理向量B? _你如何使用插值点的坐标来获得新值?_ 您的解决方案就像在最近的3个点上拟合一个平面,然后与垂直线相交,其中交点是我们寻求的值? – mitjap

+1

B是解决方案,该公式中的系数可用于任何X和Y来查找A. A = X * B1 + Y * B2 + B3。这是飞机的公式与你原来的3点相交。 – Michael

+0

正如你所提到的,这个解决方案不是连续的,所以我不确定分散点有多好。用包含该点的三角形的3个顶点代替3个最近点,假设你有一个(例如Delaunay)点的三角剖分,那么你可以进行连续插值,并且这会打开更多选项。 –

1

散射点的一个好方法是自然邻域插值。 您可以查看CGAL中可用的实现,例如:http://doc.cgal.org/latest/Interpolation/index.html

+0

链接不是答案。 SO上的答案预计是独立的。请[查看这个元问题](http://meta.stackexchange.com/q/8231/135887),并为您的答案添加足够的细节,使其不完全依赖于外部链接。 – Charles

+0

嗯,我不介意提供更多细节,但我不认为这是问题所在。实际上,我的回答并不是链接,而是“自然邻居插值”。此外,实际的问题是找到一个提供功能的C++库,为此,我的链接是一个确切的答案。 –

+0

叹了口气,我需要记住在做评论时阅读这个问题。图书馆的建议是关于SO的话题,我已经投票结束了这个问题。如果你至少可以提供一些关于如何使用这个库来解决问题的示例代码,这将会很有帮助。 – Charles