2013-02-27 157 views
1

我在3D中有一個凸多邊形。爲了簡單起見,讓它成爲帶頂點的正方形,(0,0,0),(1,1,0),(1,1,1),(0,0,1).。我需要按逆時針順序排列這些頂點。我找到了一個解決方案here。建議確定多邊形中心的角度並對其進行分類。我不清楚這是如何工作的。有沒有人有辦法解決嗎?我需要一個解決方案,即強大的,甚至在頂點非常接近時工作。在MATLAB中逆時針方向排列三維凸多邊形平面的頂點

MATLAB代碼示例將非常感謝!

+0

我將實施導數分析,但你怎麼能由2D參數整理一些東西(即順時針方向)時,他們在三維空間中存在嗎? – tmwoods 2013-02-27 04:10:52

+0

點在3D空間中,但在飛機上。我只需要訂購 - 順時針或逆時針。 – 2013-02-27 04:13:47

+0

我的不好,在標題中沒有看到。我是白色的,我會讓你知道,如果我拿出一些不涉及旋轉矩陣的固體(這可能是屁股中最強壯但最大的痛苦)。 – tmwoods 2013-02-27 04:15:00

回答

1

以下是我遵循的步驟。

  1. 使用已知的formulas可以將3D平面多邊形旋轉到2D平面。使用軸下的旋轉矩陣和角度下的那個。

  2. 然後如@Glenn所示,需要計算內部點以找出角度。我將該內部點作爲頂點位置的mean

  3. 使用X軸作爲參考軸,角度,在一個02pi刻度,爲每個頂點可使用atan2功能所解釋here來計算。

    從矢量逆時針測量的向量b,取值範圍爲[0,2pi]的非負角度,如果a = [x1,y1]b = [x2,y2],由下式給出:

    angle = mod(atan2(y2-y1,x2-x1),2*pi);

  4. 最後,角度[~,XI] = sort(angle);排序。

1

這實際上是一個相當乏味的問題,所以不是實際做這件事,我只是想解釋我該怎麼做。首先find the equation of the plane(你只需要使用3分),然後找到你的rotation matrix。然後在你的新的旋轉空間中找到你的向量。之後,所有的說法和完成find which quadrant你的觀點是,如果n> 1在一個特定的象限,那麼你必須找到每個點的角度(theta = arctan(y/x))。然後,簡單地按照它們的角度對每個象限進行排序(可以說,你可以通過pi而不是象限來進行分離(當y分量(後旋轉)大於零時將點分類)。有時間實際測試這個,但給它一個去,並隨時發佈您的代碼,我可以幫助調試,如果你喜歡。

+0

謝謝!你的意見給了我一些想法。我的解決方案基於您對旋轉飛機的評論。畢竟這並不困難。 – 2013-02-28 06:46:14

+0

沒問題,很高興大學的所有數學幫助某人。您應該詳細說明您的答案並將其標記爲已解決:) – tmwoods 2013-02-28 14:03:45

1

幸運的是你有一個凸多邊形,所以你可以使用角度技巧:找到一個點在內部(例如,找到兩個非相鄰點的中點),並向所有頂點繪製矢量,選擇一個矢量作爲基底,計算與其他矢量的角度並對它們進行排序。點積:A·B = ABcosθ= | A || B |cosθ。

0

這是很長一段時間,因爲我用這個,所以我可能是錯的,但我相信命令convhull做你所需要的 - 它返回一組點的凸包(它,因爲你說你的點是一個凸集,應該是本身的一組點),按逆時針順序排列。

請注意,MathWorks最近發佈了一個新類DelaunayTri,該類旨在取代convhull和其他較舊的計算幾何元素的功能。我相信這更準確,尤其是當積分變得非常接近時。但是我沒有嘗試過。

希望有幫助!

+0

如果多邊形是2D,則您提到的功能將起作用。對於我的問題他們不會。 – 2013-02-28 06:44:29

0

所以這裏的另一個答案,如果你想使用convhull。通過設置一個座標零點,輕鬆地將多邊形投影到座標軸平面中。例如,在(0,0,0),(1,1,0),(1,1,1),(0,0,1)中設置y = 0得到(0,0),(1, 0),(1,1),(0,1)。現在你的問題是2D。

如果您的多邊形的平面與某個軸正交,您可能需要做一些工作才能選取正確的座標,如果是,請選擇該軸。標準是確保您的投影點不會排在最後。

相關問題