簡體   English   中英

在網格中使用頂點(2D和3D)查找邊緣的算法

[英]algorithm to find edges using vertices (2D and 3D) in a mesh

我有一個網格,有某些類型的元素(例如三角形,四邊形)。 對於每個元素,我知道它的所有頂點,即三角形2D元素將具有3個頂點v1,v2和v3,其x,y,z坐標是已知的。

問題1

我正在尋找一種能夠返回所有邊緣的算法......在這種情況下:

edge(v1,v2),edge(v1,v3),edge(v2,v3)。 根據每個元素有多少個頂點,算法應該有效地確定邊緣。

問題2

我正在使用C ++,那么,存儲上述算法返回的邊緣信息的最有效方法是什么? 例如,我感興趣的是一個元組(v1,v2),我想用它進行一些計算然后忘記它。

謝謝

您可以使用半邊數據結構。


基本上你的網格也有一個邊列表,每個方向上每對頂點有一個邊緣結構。 這意味着如果你有頂點A和B,那么有兩個邊結構存儲在某處,一個用於A-> B,另一個用於B-> A. 每個邊有3個指針,一個叫做前一個,一個叫做next,一個叫做twin。 在下一個和前一個指針之后,您將繞過網格中三角形或多邊形的邊緣。 調用twin會將您帶到相鄰多邊形或三角形中的相鄰邊緣。 (看看圖中的箭頭)這是我所知道的最有用和最詳細的邊緣數據結構。 我已經用它來創建新邊並更新指針來平滑網格。 順便說一句,每個邊緣也應該指向一個頂點,因此它知道它在空間中的位置。

你的問題實際上有三個部分,而不是兩個部分:

  • 應使用哪些數據結構來表示網格?
  • 我應該使用什么算法從網格數據結構中提取邊?
  • 如何表示結果邊集?

您必須提出其他問題才能找到合適的答案。

應使用哪些數據結構來表示網格?

您需要處理哪些元素類型?

如果您只需要處理多邊形(閉環)和單純形(每個節點連接到元素中的每個其他節點,例如四面體),那么有序節點列表就足夠了,因為可以從節點列表中隱含邊。 另一方面,如果需要處理六面體,棱鏡或一般多面體等元素類型,則需要有關元素拓撲的更多信息。 一組簡單的邊緣映射通常就足夠了。 它只是元素節點列表中的索引數組[] [2],它告訴您如何連接給定元素類型的點。

Chris描述的半邊結構僅適用於2D。 在3D中,每個邊緣可以有任意數量的元素,而不僅僅是兩個。 半邊緣表示有一個3D擴展,我認為稱為風車結構。

如果你必須支持任意元素類型,我更喜歡更完整的數據結構來表示元素拓撲。 常見的選擇是使用邊和共邊。 每對連接節點都有一個邊緣結構,並且元素中每個邊緣的使用都有一個共邊緣。 它類似於風車方法,但更明確一點。

我應該使用什么算法從元素中提取邊緣?

速度或記憶有多重要? 結果是每個元素包含一個每個邊緣,還是只包含一個元素使用它的一次? 結果中邊的順序是否重要? 每個邊的節點順序是否重要?

很難想出一個只能訪問每個邊一次的任意元素類型的算法。 為了確保每個邊只出現一次,你可以過濾結果,或者你可以有點hackish並在每個邊上保持一個“訪問”位,以確保你不會在結果中堅持兩次。

我該如何表示結果?

我將使用結果的方式有什么關系?

如果您要在計算密集型計算中使用結果,那么大量坐標可能是最佳選擇。 您不希望在計算過程中反復重新獲取節點坐標。 但是,如果您要過濾結果以刪除重復邊緣,則比較坐標(節點對的6個雙精度)不是可行的方法。 如果要過濾,首先生成指向邊結構的指針列表,然后過濾掉重復項, 然后生成坐標列表。 您也可以將此方法用於節點對,但是您必須針對每個邊緣的兩個可能節點順序進行過濾,從而將過濾所需的時間加倍。

如果內存比性能更重要,那么邊緣指針列表也是可行的方法。 但是,您可以在計算過程中查找坐標,而不是將邊列表轉換為坐標列表。 獲取節點坐標的速度較慢,但​​是您避免制作大量坐標 - 每個邊存儲一個指針而不是每邊6個雙精度。

許多網格應用程序將所有坐標存儲在一個大的全局數組中,每個節點都有一個索引到數組中。 如果是這種情況,請將其轉換為全局坐標數組中的索引列表,而不是將邊列表轉換為坐標數組。 性能不應該偏離本地坐標數組,但沒有內存和人口開銷。

我沒有你的算法,但我可以告訴你在哪里看。

“Point Set Triangulation”正是您所需要的。

下面是一些開源庫,它們將為您完成此任務(了解算法代碼):

暫無
暫無

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

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