我正在尋找一種方法來插入來自某些二維分散數據的值。我有一個3d點,代表我想插入中間點的地形。對於輸入(X,Y)座標,我需要Z(高度)值。分散數據在二維值插值
This article on wikipedia也可能幫助你瞭解我的願望。在matlab中有一個名爲triscateredinterp的圖書館,我認爲它符合我的要求。
在C++中完成這種插值的輕量級方法是什麼?
我正在尋找一種方法來插入來自某些二維分散數據的值。我有一個3d點,代表我想插入中間點的地形。對於輸入(X,Y)座標,我需要Z(高度)值。分散數據在二維值插值
This article on wikipedia也可能幫助你瞭解我的願望。在matlab中有一個名爲triscateredinterp的圖書館,我認爲它符合我的要求。
在C++中完成這種插值的輕量級方法是什麼?
我不認爲你需要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個點嗎?)
感謝您的回答。我熟悉矩陣乘法和C++ :)我在這裏有點困惑。在計算時如何處理向量B? _你如何使用插值點的座標來獲得新值?_ 您的解決方案就像在最近的3個點上擬合一個平面,然後與垂直線相交,其中交點是我們尋求的值? – mitjap
B是解決方案,該公式中的係數可用於任何X和Y來查找A. A = X * B1 + Y * B2 + B3。這是飛機的公式與你原來的3點相交。 – Michael
正如你所提到的,這個解決方案不是連續的,所以我不確定分散點有多好。用包含該點的三角形的3個頂點代替3個最近點,假設你有一個(例如Delaunay)點的三角剖分,那麼你可以進行連續插值,並且這會打開更多選項。 –
散射點的一個好方法是自然鄰域插值。 您可以查看CGAL中可用的實現,例如:http://doc.cgal.org/latest/Interpolation/index.html
鏈接不是答案。 SO上的答案預計是獨立的。請[查看這個元問題](http://meta.stackexchange.com/q/8231/135887),併爲您的答案添加足夠的細節,使其不完全依賴於外部鏈接。 – Charles
嗯,我不介意提供更多細節,但我不認爲這是問題所在。實際上,我的回答並不是鏈接,而是「自然鄰居插值」。此外,實際的問題是找到一個提供功能的C++庫,爲此,我的鏈接是一個確切的答案。 –
嘆了口氣,我需要記住在做評論時閱讀這個問題。圖書館的建議是關於SO的話題,我已經投票結束了這個問題。如果你至少可以提供一些關於如何使用這個庫來解決問題的示例代碼,這將會很有幫助。 – Charles
是您在2D輸入上的數據高度?它是在一個規則的網格上,還是分散的? – Michael
我散佈了3D點。我的數據是高度。 – mitjap
,你想給** 2D **值並插入高度? – Michael