簡體   English   中英

從三角形帶轉換為多邊形

[英]Converting from triangle strip to polygon

我有一些區域包含 1 個或多個多邊形。 每個多邊形以 GL_TRIANGLE_STRIP 格式表示,其中每個頂點是一對 (lat, long)。 有什么辦法可以得到該區域的輪廓?

一些規格:

  • 輪廓必須按逆時針順序排列。
  • 任何 2 個多邊形都可以有一個公共邊。
  • 多邊形可以是凹的
  • 一個多邊形內部最多可以有 1 個“間隙”,它將由另一個輪廓按順時針順序表示。

我正在尋找一種復雜度約為 O(N*logN) 的算法,其中 N = 頂點數。

編輯:我嘗試了像 2 x 2 這樣的解決方案,直到我到達數據集的末尾然后向后移動,但是這個算法在有間隙的多邊形上效果不好,例如這個多邊形的輸入是: AB C DEFGHIJ ,其中 I = A 和J = B,這樣做,output 將是A C EGIJHFDB並且應該是A C EGBHFG (因為它更容易像倒置那樣繪制)。

另一種解決方案是考慮點一個無向圖和它們之間的邊(根據 GL_TRIANGLE_STRIP 格式),我在其中應用了 DFS 以取出連接的組件。 之后,我計算了每個組件的面積,並將最大面積多邊形視為逆時針輪廓,將 rest 視為順時針輪廓。 這不起作用,因為鄰接表需要一些排序,這會使算法效率低下。

我嘗試的另一個解決方案是一些調整過的凸包,但凸包仍然是凸包,並且不適用於凹多邊形。

我還閱讀了有關凹殼的信息,但這似乎並不總是給出准確的結果。

謝謝您的回答!

讓我們首先將三角形帶轉換為多邊形。 我們以下面的條帶為例:

三角帶 (由維基共享資源提供)

您的條帶定義為:

A B C D E F

將其轉換為多邊形非常簡單。 只需 go 通過列表並使用每個第二個頂點。 當你到達終點時,向后返回並使用其他頂點。 在這種情況下:

A C E (reached the end, now return) F D B

這可以在O(N)中完成,其中N是條帶的頂點數。 這是順時針還是逆時針取決於條帶的方向。

所以,我們可以把每個條帶變成一個多邊形。 剩下的就是刪除共享邊。 假設我們有兩個多邊形

A C E F D B
W X E C Y Z

請注意,任何共享的邊(在本例中C E )將出現在相反的方向上(第一個多邊形中的C E ,第二個多邊形中的E C )。 要找到區域輪廓,我們只需要找到匹配的邊並合並兩個多邊形。

要找到匹配的邊,只需將所有多邊形邊寫入 hash map(存儲它們所屬的多邊形以及它們在多邊形中的位置)就足夠了。 這可以在O(E)中完成,其中E是多邊形邊的總數。

要最終合並多邊形,創建新多邊形實際上更簡單。 修改絕對是可能的,但更微妙一些。 為此,我們只需要沿着多邊形邊緣走。 只要我們在一條逆不在 hash map 中的邊上,然后將這條邊寫入 output 多邊形。 如果是,請忽略它並繼續處理另一個多邊形。 標記您訪問過的邊緣,並在您回到之前訪問過的邊緣時立即停止。 這樣做直到所有邊都被訪問(或兩個方向都在 hash 映射中)。 整個過程可以在O(E)中完成,其中E是多邊形邊的總數。

這是我們示例中的樣子:

Start at polygon 1
Start at edge (A, C)
(A, C) is neither visited nor is its inverse in the hash map
Create new output area = [A, C]
the inverse of (C, E) is in the hash map, continue to polygon 2
(C, Y) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y]
(Y, Z) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z]
(Z, W) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W]
(W, X) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X]
(X, E) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X, E]
the inverse of (E, C) is in the hash map, continue to polygon 1
(E, F) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X, E, F]
(F, D) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X, E, F, D]
(D, B) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X, E, F, D, B]
(B, A) is neither visited nor is its inverse in the hash map
Append it to the area = [A, C, Y, Z, W, X, E, F, D, B, A]
(A, C) is already visited
Close the area contour, continue to check other unvisited edges

如果需要,您還可以按創建輪廓的多邊形對生成的輪廓進行分組,以查找由多個輪廓界定的連接區域。 多邊形上的不相交集將有助於該任務。 如果需要,您還可以嘗試將輪廓分類為孔和外輪廓。 但請注意,這個概念在球體上是高度模糊的(想象一個球體和一個沿赤道帶的區域 - 兩個輪廓中的哪一個是洞,哪個在外面?)對於相對較小的區域,您可以使用此分類的區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM