2012-01-08 143 views
3

所以,我有這個算法來計算3D平面與法向矢量給出的平面的截面。從法向矢量給出的平面到XY平面的座標映射

但是,我目前的問題是,橫截面是由三維點組成(全部位於給定平面上)並顯示它,我需要將此座標映射到XY平面。

如果平面法線類似於(0,0,c) - 這就完美了 - 我只是複製x和y座標而丟棄z。

這裏是我的問題:由於我不知道如何轉換任何其他平原,任何人都可以給我任何暗示,我現在該怎麼辦?

+0

我懷疑你想要做的是投影從窗格(你的橫截面)到另一個(x,y)或從一個到另一個座標轉換 - 哪一個? – 2012-01-08 19:51:05

+0

目前,我在3D座標系中設置了三維點(x,y,z)(實際上(x,y,z,1))。我想要的是在XY平面匹配(x,y,z)的二維點(x',y')(例如x',y',1) )在由法向量給出的3D平面中。到目前爲止,我認爲如果我可以旋轉矢量給出的平面,我可以用這種方式來設計點:(x,y,z,1) - >(x,y,1) – stollgrin 2012-01-08 19:59:15

+0

@EugenRieck Hey Eugen,你會怎麼說是「從窗格(你的橫截面)到另一個(x,y)的投影或者從一個到另一個的座標變換」 – user1084113 2013-03-04 16:36:50

回答

7

你窗格可通過正常的矢量

n=(xn,yn,zn) 

對於座標變換定義,我們需要2個基向量和零點窗格

基向量

我們選擇那些「自然地「裝配到x/y窗格(稍後參見邊緣情況):

b1=(1,0,zb1) 
b2=(0,1,zb2) 

我們想

​​(C const的標量)

,以確保這兩個是真正立足

現在解決這個問題:

b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1) 
zb1*c=xn 
zb2*c=yn 
1*c=zn 

c=zn, 
zb2=yn/c=yn/zn 
zb1=xn/c=xn/zn 

b1=(1,0,yn/zn) 
b2=(0,1,xn/zn) 

和規範它

bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn)) 
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn)) 

An邊緣情況是,當zn = 0時:在這種情況下,法向矢量平行於x/y窗格,並且不存在自然基矢量。在這種情況下,您必須通過美觀POV選擇基底b1和b2矢量,並通過相同的解決方案流程或只選擇bv1和bv2。

零點

你不會說錨點在OQ的窗格,但它需要從平行窗格的無限族區分你的窗格。

如果你的定位點(0,0,0),這是爲座標變換一個完美的錨點和您的面板上有

x*xn+y*yn+z*zn=0, 
(y0,y0,z0)=(0,0,0) 

如果沒有,我假設你有(XA的錨點,ya,za)並且您的窗格有

x*xn+y*yn+z*zn=d 

with d const標量。自然地適合將是窗格的點,即由原始零點的正常投影所限定到窗格:

P0=(x0,y0,z0) 

(x0, y0, z0) = c * (xn,yn,zn) 

解決這個反對

x*xn+y*yn+z*zn=d 

給出

c*xn*xn+c*yn*yn+c*zn*zn=d 

c=d/(xn*xn+yn*yn+zn*zn) 

從而

P0=(x0,y0,z0)=c*(xn,yn,zn) 

被發現。

最終轉化

由代表你的窗格的每一個點(即你想顯示這些點)作爲

P0+x'*bv1+y'*bv2 

具有x「和y」是新的座標來實現的。既然我們知道P0,bv1和bv2,這是相當微不足道的。如果我們不在邊緣情況下,我們在bv1.y和bv2.x中有零點,進一步減少了問題。

x'和y'是您想要的新座標。

+0

非常好的解釋!我面臨同樣的問題,並在計算出的基向量上表示三維點,我使用點積將它們投影到基向量上。 'x'= pt3d.dot(bv1) y'= pt3d.dot(bv2)' 它是正確的嗎? – Dexter 2012-02-15 15:34:58

+0

嗨,我想這裏有一個小錯誤: 'b1 =(1,0,yn/zn) b2 =(0,1,xn/zn)' 實際上b1 * n〜= 0,減去。 (1,0,-n/zn) b2 =(0,1,-xn/zn)' – 2017-09-12 21:50:43