2011-01-25 37 views
1

我想繪製一個由等式給出的平面:Ax + By + Cz + D = 0。 我第一次試圖通過設置x,y來繪製他,然後從等式中得到z。這是行不通的,因爲有一些飛機,如0x + 0y + z + 0 = 0等...繪製飛機

我目前的解決方案是這樣的: - 在ZY平面上繪製平面,無窮。 - 找出爲了使給定平面(a,b,c)的法線位於z軸上的 應該完成的旋轉。 - 找到應該完成的翻譯,以便該平面位於x軸上。 - 對這些旋轉和翻譯進行完全相反的轉換,因此我將獲得
飛機在他的位置。

確定

這是一個偉大的事情,但我可以作出適當的數學計算(次嘗試了很多...)與點積和等等....

有人可以幫助我在理解它應該完成的確切方式,或者給我一些公式,在這個公式中我將把ABCD放在正確的位置上?

任何幫助將有所幫助!

+0

它是什麼你想要的是什麼?你想要飛機上的一個點和正常嗎?你想在飛機上有三個點嗎?你想要關於Z = 0飛機的飛機角度嗎? – wich 2011-01-25 14:33:23

+0

嗨, 感謝您的快速響應。 我想能夠繪製飛機。 因爲我需要4點在飛機上,但是這個任務是更難的,然後做出更早的建議。 我想要的是YX平面到我的平面(Ax + By + Cz + D = 0)之間的仿射變換。經過這個轉變後,我可以用她來繪製我的飛機,將飛機的倒置變形應用到飛機上,我將在YX飛機上滑翔。 – talel 2011-01-25 14:47:16

+0

那麼,a,b,c,d並沒有給你足夠的信息來獲得固定的仿射變換。投影仍然可以在平面內的任何原點以及原始XY平面的X和Y矢量到新平面的任何映射中,即任何旋轉或偏斜。 – wich 2011-01-25 14:55:18

回答

0

這是你在問什麼?

轉換一個簡單的平面狀xy平面到你的飛機是相當簡單:

你的飛機是AX + +鋯+ d = 0

xy平面簡直就是Z = 0。即A = B = D = 0,而C =無論你想要什麼。爲了簡單起見,我們會說1。

當以這種形式具有一個平面,正常的平面的由矢量(A,B,C)

所以要旋轉,將帶你從定義(0,0,1 )到(A,B,C)*

*請注意,如果{A,B,C}是單一的,這將僅適用。因此您可能必須將A B和C分別按sqrt(A^2 + B^2 + C^2)進行劃分。

圍繞兩個軸旋轉可以讓你從任何方向到任何其他方向,所以我們會選擇x和y;

這裏是圍繞x軸旋轉的旋轉矩陣,以及圍繞y軸的旋轉矩陣。

接收:= {{1,0,0},{0,COS [A],仙並[a]},{0,-Sin並[a],COS [α]}}

RY := {{Cos [b],0,-Sin [b]},{0,1,0},{Sin [b],0,Cos [b]}}

如果我們做一個旋轉(0,0,1)法向量x的旋轉,接着是關於y的旋轉,我們得到:

Ry.Rx. {0,0,1} = {-Cos [a ] Sin [b],Sin [a],Cos [a] Cos [b]}

這是您的ABC值。

A = -cos [α]仙並[b]

B =仙並[a]

C =的Cos [A]的Cos並[b]

從這裏,它的簡單。

一個= ASIN [B]

所以現在A = -cos [ASIN [B]]仙並[b]

的Cos [ASIN [X]] = SQRT(1-X^2) 這樣:

A = -sqrt [1-b^2] *仙並[b]

b = ASIN [-A/SQRT [1-b^2]]

一個= ASIN [B](圍繞x軸旋轉)

b = aSin [-A/sqrt [1-B^2]](圍繞y軸旋轉)

因此,我們現在需要旋轉的x和y軸的角度。

在此之後,您只需將飛機向上或向下移動,直到它與您已有的飛機相匹配。

你現在的飛機(在這兩次旋轉之後)將是Ax + By + Cz = 0。

你想要的平面是Ax + Bx + Cz + D = 0。要找出d,我們會看到z軸在哪裏穿過您的飛機。

即鋯石+ d = 0 - > Z = -D/C

所以我們改變你的Z AX + +鋯= 0通過-D/C給:

AX + + C(z + D/C)= Ax + By + Cz + D = 0。哦,你會看看那個!

事實證明,一旦你有角度旋轉,你不必做任何額外的數學!

這兩個角度會給你A,B和C.爲了得到D,你只需要從你的東西中複製它。

希望這是一些幫助,我不完全相信你計劃如何實際繪製飛機雖然...

編輯,以解決一些可怕的格式。希望現在好一點。

1

你都需要下面的轉換矩陣:

[ x0_x y0_x z0_x o_x ] 
M = [ x0_y y0_y z0_y o_y ] 
    [ x0_z y0_z z0_z o_z ] 
    [ 0 0 0 1 ] 

這裏,Z0是正常的平面,o是你的飛機的起源,以及x0和y0是你的平面垂直於內兩個向量z0定義投影的旋轉和傾斜。

然後在您的XY平面上任意點(x,y)的可以投影到一個點(p_x,p_y,p_z)具有以下新的飛機:

(p_x, p_y, p_z, w) = M * (x, y, 0, 1) 

現在,Z0在變換矩陣很容易,這是你的飛機的正常狀態,那簡直就是n = normalize(a,b,c)

在選擇休息時,你有明顯更多的自由。對於原點,您可以將平面與Z軸相交,除非平面平行於Z軸,在這種情況下,您需要其他東西。

因此,例如,

if (c != 0) { //plane intersects Z axis 
    o_x = 0; 
    o_y = 0; 
    o_z = -d/c; 
} 
else if (b != 0) { // plane intersects Y axis 
    o_x = 0; 
    o_y = -d/b; 
    o_z = 0; 
} 
else { // plane must intersect the X axis 
    o_x = -d/a; 
    o_y = 0; 
    o_z = 0; 
} 

在實踐中,你可能要更喜歡不同的測試比(c != 0),因爲與測試甚至會成功是C是非常非常小的,但是從零隻是不同的,導致你的起源是在說,x=0, y=0, z=10e100這可能不會令人滿意。所以像(abs(c) > threshold)這樣的測試可能更可取。然而,你當然可以採取一種完全不同的點在平面放的起源,或許最接近原始的座標系的原點的點,這將是:

o = n * (d/sqrt(a^2 + b^2 + c^2)) 

然後最後我們需要弄清楚的x0和y0。這可能是任何兩個與z0正交的線性獨立向量。

因此,首先,我們選擇在XY平面上的向量我們X0向量:

x0 = normalize(z0_y, -z0_x, 0) 

現在,這個失敗,如果你的Z0恰好是形式(0,0,z0_z)的,所以我們需要對於一個特殊情況:

if (z0_x == 0 && z0_y == 0) { 
    x0 = (1, 0, 0) 
} 
else { 
    x0 = normalize(z0_y, -z0_x, 0) 
} 

最後讓我們說,我們不希望歪斜和選擇Y0爲垂直於兩X0,Y0和,然後,使用雙重交叉

y0 = normalize(x0_y*y0_z-x0_z*y0_y, x0_z*y0_x-x0_z*y0_z, x0_x*y0_y-x0_y*y0_x) 

現在您已經全部填充您的轉換矩陣。

免責聲明:在使用浮點數表示您的數字時應該小心,在這些情況下,簡單(foo == 0)測試是不夠的。在開始實施東西之前,先閱讀浮點數學。

編輯︰重命名一些變量的清晰度