2012-12-01 26 views
3

我有隨機排列的任意數量的多邊形(在這種情況下是六邊形),但它們都接觸另一個十六進制。將任意數量的多邊形組合在一起

enter image description here

每個單獨的十六進制有6的x,y的頂點。所有頂點的頂點都是已知的。

任何人都可以指向一個算法的方向,將所有的六邊形合併成一個單一的多邊形?基本上,我只是在尋找一個函數,吐出一系列頂點位置,這些頂點位置的排列方式是,當從一個線條繪製線條到另一個線條時,它會形成多邊形。

這是我的方法至今:

  1. 所有的不吉利的東西創建所有頂點數組。
  2. 確定數組頂點出現的次數
  3. 如果頂點在數組中的數目超過3+,則從數組中刪除頂點。
  4. 如果頂點在數組中,則刪除其中的一個。

雖然下一步很棘手。我使用畫布繪製出這些多邊形,這主要涉及從一個頂點繪製一條線到下一個頂點。所以最終數組中頂點的順序很重要。它不能任意排序。

此外,我不是在尋找一個「凸包」算法,因爲它不會正確繪製多邊形。

有沒有這樣的功能呢?我在正確的軌道上還是有更好的更有效的方法?

+1

你想對一個有孔的大多邊形做什麼?兩個(或更多)頂點列表是否足夠? – Beta

+0

假設所有的格子都在觸碰。沒有洞。 –

回答

5

我會做這樣的事情:

  1. 列出所有的邊。一邊由兩對座標定義。
  2. 如果任何一方顯示不止一次,則刪除該端的所有實例。
  3. 選擇一個任意的一面,並從那邊選擇一個點。
  4. 將該點放入數組中。
  5. 按照當前的一面,把另一個點放在數組中。
  6. 刪除剛纔的一面。
  7. 然後找到具有與數組中最後一個點相同點的另一側。只會有一個這樣的一面。如果沒有,你就完成了。
  8. 回到步驟5

您現在應該有了點組成,爲了數組,你想要的形狀。

請注意,這不會處理漏洞。形狀必須由單一路徑定義。

+0

我應該如何確定一個邊是否不是邊界的一部分? –

+0

這是第二步。 –

+0

我最初的想法是使用頂點數組,並通過它們排序,找出哪些是哪些並刪除重複等等。但是使用邊而不是頂點更容易。謝謝! –

0

不保持座標對組成線的軌道,這將是無法確定其形狀

的外邊框,如果你知道座標對組成行,則

  1. 創建2名列表,vertexs(表1)中的一個,其中一條線(列表2)
  2. 從頂點列表中刪除所有重複的頂點
  3. 建立一個新的列表所有具有頂點(表3)連接到他們的3條線
  4. 使用列表3,刪除所有具有列表3 2個頂點作爲他們的兩個座標對行
  5. 是時候穿越形狀,剩下的應該形成你想要 形狀線條的名單剛開始用任意如果(x1,y1)=當前座標然後添加(x2,y2)堆棧並從列表中刪除該行 中斷 elseif(x2,y2)=當前座標然後添加座標 對於所有行 (x1,y1)堆疊並從列表中刪除該行 中斷
0

對於每個十六進制,您有一個包含6個頂點的列表。如有必要,對列表進行排序,以便逆時針順序排列頂點(這是數學慣例)。

現在你有一組多邊形(最初是六邊形)。想法是將多邊形合併,直到只有一個(或儘可能少)。

選取多邊形的一條邊,然後在其他多邊形之間尋找相同的邊(即同一對頂點)。如果存在兩個實例,則在該邊緣結合兩個多邊形,例如, (a,b,c,i,j,g,h,d,e,f)(a,b,c,d,e,f)+(g,h,d,c, 。 (如果兩個頂點在兩個多邊形中的順序相同,或者有三個或更多個邊的實例,則報告錯誤並中止。)遍歷所有邊。如果這些正方形確實形成了一個連續的組,則只剩下一個多邊形。

多邊形可能有重複的邊緣。如果邊緣多次出現,則通過將列表分成兩部分來消除它。 (a,b,c,d,b,a,e,f,g)=>(b,c,d)+(a,e,f,g)。或者,如果邊緣相鄰,請將它們移除:(a,b,c,b,d,e)=>(a,b,d,e)。或者如果該列表僅具有該邊緣,則刪除該列表:(a,b)=>無。

一旦消除了重複的邊界,多邊形的逆時針外邊將會有一個列表,並且可能會有一個或多個列表用於順時針內部的孔邊界。