2017-01-29 187 views
0

讓我們假設一個正方形(4分),從頂部看。 4點中的每一點都沒有相同的測高。三維座標插值

如果你從頂部(或從底部)看,你會看到一個正方形,但是如果你從側面看,你會看到4個點不在同一個水平。

所以你有一架不水平的飛機。

讓我們想象在廣場內的第五個點。我想要做的是計算第五點的高度。這個高度測量是平方內點位置和平方4點高度的函數。

我想我已經計算插值但我沒有設法做...

任何想法?

感謝

+0

除非您確定所有點都位於同一平面上,否則必須將該平方分成兩個三角形。這是你的情況嗎? – Bartvbl

+1

[Altimetry](http://www.dictionary.com/browse/altimetry)doens't意味着你的想法。你正在尋找的詞是「高度」或「高度」。 –

回答

1

所以,除非你肯定知道所有點位於一個平面上,這將是該方法的簡單化,我假設你已經劃分的平方成兩個三角形。此外,我假設有4個頂點,分別代表您的正方形的每個頂點的v_00,v_10,v_01v_11。我還會假設你的三角形被定義爲(v_00, v_10, v_11)(v_00, v_11, v_01)

vec4 v00 = vec4(...); 
vec4 v01 = vec4(...); 
vec4 v10 = vec4(...); 
vec4 v11 = vec4(---); 

vec4[2][3] triangles = {{v00, v10, v11}, {v00, v11, v01}}; 

最後,我假設你知道X和左下頂點(只減去x和從x和v_00 y座標的第五點的Y座標)Y座標相對。我會打電話給這個P點。我們想知道它的z座標。

vec4 fifthPoint = vec4(...); 
vec4 P = fifthPoint - v00; 

這意味着這兩個三角形的「共享邊框」位於廣場底部左側和右上角之間的對角線上。

由於兩個三角形可以完全不同,因此確定任意第五點的座標從確定它所在的兩個三角形中的哪一個開始。由於我們知道形狀是一個正方形,所以我們可以將我們的點P的座標相對於v_00(正如我之前假設的那樣),看看哪個大於另一個。如果P的x座標大於y座標,我們知道P在右下三角形上。否則,它位於左上方。現在

bool whichTriangle = P.x > P.y; 
int triangleIndex = whichTriangle ? 0 : 1; 

,我們知道我們是哪個三角形,我們可以估算出它們的座標,獲得三角形的表面上的任何一點。

對於三角0:

vec4 vectorX = triangles[0][1] - triangles[0][0]; 
vec4 vectorY = triangles[0][2] - triangles[0][1]; 

對於三角形1:

vec4 vectorX = triangles[1][1] - triangles[1][2]; 
vec4 vectorY = triangles[1][2] - triangles[1][0]; 

注意,每個矢量這裏沿着x和y軸前進。這很重要,所以我們可以直接使用P中的x和y座標來計算插值。

接下來,我們對我們剛創建的兩個向量進行歸一化。

vectorX = vectorX.normalize(); 
vectorY = vectorY.normalize(); 

現在我們只需要與X相乘這兩個值和P的Y座標以獲得該三角形的任何一點,並將其添加到一個基點。

對於三角0:

P = triangles[0][0] + vectorX * P.x + vectorY * P.y; 

對於三角1:

P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y); 

有你有它。對於那些實際上並不那麼困難的事情來說,這個解釋太複雜了。 P.z現在包含任意點的Z座標。

1

作爲一個梯形ABCD考慮這個直紋面: enter image description here

然後你就可以從A和B插值P1和P2從C和D.最後,你可以從插值P1和P2的高度P高度