2011-01-27 30 views
3

考慮一個以座標原點爲中心的球體和一個內接二十面體,其方向爲兩個最遠的頂點位於Z座標軸上,另一個從任何頂點出現的邊緣都位於XZ平面中。查找矢量在二十面體或其展開表面上的投影

考慮一個給定的矢量x起源於球的中心。由該矢量給出的方向在某個點刺穿二十面體的表面。

是否有一種優雅的方式來找到穿孔的面(考慮到所有方面都列舉出來),然後找到這個面上的穿孔點?需要執行此任務將穿透點投影到平坦的未摺疊(未包裹)的二十面體表面。

+0

你能告訴我們一些關於你的座標系嗎?這可能會節省一些時間。 – 2011-01-27 20:37:07

+0

它是笛卡兒,3D。如果方便的話,我們可以在解決方案中自由轉換爲其他任何方式。 – mbaitoff 2011-01-27 20:44:33

回答

3

此解決方案特定於您的應用程序,其中矢量從原點發出,並且二十面體以原點爲中心。

使用十二面體的12個頂點定義20個三角形。當從二十面體外觀察時,訂購3以便它們按照逆時針順序排列。因此,對於每個三角形,您將擁有3個頂點的列表。對於每一個三角形構造一個3x3矩陣,其中列是三角形的verticies:

 
    [ x1 x2 x3 ] 
T = [ y1 y2 y3 ] 
    [ z1 z2 z3 ] 

你需要這個矩陣的逆(SO搜索或谷歌在您所選擇的語言快速3x3的倒數) 。 現在對於每個矢量,你想乘以所有20個matricies。因此,對於每個三角形計算:(?負)

B = V * T(逆)

如果B的所有3個元素爲正,這是相交三角形。

接下來,標準化B - 將其除以其長度以使其具有單位長度。這將使B成爲該三角形上交點的重心座標。您還可以通過乘以重心由原始的點矩陣座標計算實際的交點我:

我= B * T

這也適用於尋找2D上展開三角形交叉點的座標。因此,使用2D座標的2x3矩陣代替T.

最後一次優化。如果總結每個三角形的3個頂點,這將爲您提供該三角形的法向量。如果您計算每個法線的矢量的點積,則具有最大點積的三角形將是相交的一個。這一事實是特定於正規多面體,其中原始射線源自原點。這比完成矩陣乘法以確定哪一個命中更快。你仍然需要做1矩陣乘法以找到重心座標。

您也可以搜索光線三角形交叉點並閱讀重心座標,但這些解決方案將比這個特定問題要求更普遍。

1

好的,這不是我的領域,但沒有其他人回答,所以我會刺傷它。您可以將二十面體表示爲12個頂點 - 10個赤道頂點,再加上頂部和底部(對它們本質上沒有任何赤道,這只是將它分類爲我們的座標系的一種方式)。

那些頂點反過來可以表示爲段 - 一端是原點,另一端是頂點。鑑於此,你可以推導出赤道以上的高度。如果你知道矢量的高度(再次,在赤道上方),你可以確定矢量的二十面體的三個部分中的哪一個相交 - 北部,南部或赤道組。

從你的矢量,你也可以確定方位角。如果您從頂點向量中獲得了相應的派生方位角和高度,則這是一個相當簡單的計算,即一組兩個面(以及四個頂點)。計算給定矢量之間的角度間隔,每個頂點段將告訴你它面對的兩個面中的哪一個面,而兩個軸承總和中的較小者將是該面。

這就是我卡住的地方......我看不到一個簡單的方法來確定與臉部的交點。希望這至少對第一部分有幫助。

+0

是的,緯度'套'的想法也出現在我的腦海裏。然而,只有當赤道「帶」映射到球體上的圓而不是一組鋸齒狀弧時,它纔會起作用。 – mbaitoff 2011-01-28 05:15:06