簡體   English   中英

將邊緣集合轉換為三角形集合的算法

[英]Algorithm to convert a collection of edges into collection of triangles

我已經在程序中實現了多邊形三角剖分算法。 該算法首先獲取一個簡單的多邊形 (描述為2D點/頂點),然后將其分割為y個單調的片段 完成此操作后,該算法將獲取每個單調多邊形片段並將其拆分為三角形片段。

我需要幫助的算法的輸入是一組頂點,這些頂點按順時針或逆時針順序概述了y單調多邊形。 輸出是所有邊的集合,這些邊既來自原始多邊形,也來自三角剖分算法添加的新邊,以將y單調塊分割成三角形塊。 如果我只想繪制結果,則效果很好,因為可以只繪制每個邊緣。

但是,此邊緣集合沒有特定的順序,我需要輸出為三角形帶狀數組每個三角形均由其3個頂點簡單描述的數組(示例: [a1,a2,a3,b1 ,b2,b3],因為我們有三角形a和三角形b )。

是否有任何常規算法或其他方法可以幫助我解決此問題? 速度不是很重要,但我希望有一個快速的解決方案。

這是為了更好地理解我的問題而使用的程序的偽代碼示例:

class Vertex {
 var point;
 var index;
 init(x,y,index){
   point = (x,y)
   self.index = index
 }
}

class Edge {
 var from; // of type Vertex
 var to; // of type Vertex
 init(from, to){
  self.from = from
  self.to = to
 }
}

調用函數getMonotonePiecesOfPolygon(polygon)可能會生成許多具有這些頂點和邊的單調多邊形塊之一:

var vertex0 = Vertex(x0,y0,0)
var vertex1 = Vertex(x1,y1,1)
var vertex2 = Vertex(x2,y2,2)
var vertex3 = Vertex(x3,y3,3)

var edge0 = Edge(vertex0, vertex1)
var edge1 = Edge(vertex1, vertex2)
var edge2 = Edge(vertex2, vertex3)
var edge3 = Edge(vertex3, vertex4)

這可能對應於這樣的矩形:

         edge0
       0------1
       |      |
 edge3 |      | edge1
       |      |
       3------2 
         edge2

然后,我們可以在數組中提供這些邊緣,並使用三角測量方法“ makeMonotonePolygonIntoTrianglePieces()”將多邊形划分為三角形。

var edgesArray = [edge0,edge1,edge2,edge3]  
var edgesArray = makePolygonIntoTrianglePieces(edgesArray)

現在, edgesArray可能如下所示:

edgesArray == [edge0,edge1,edge2,edge3,newEdge1]

哪里

newEdge1.from == vertex0
newEdge1.to == vertex2

如果我們要繪制每條邊,則對應於這樣的多邊形:

         edge0
       0------1
       |\     |
 edge3 |  \   | edge1
       |    \ |
       3------2 
         edge2

現在這是我的問題要解決的部分。 我需要一個看起來像這樣的數組:

var triangles = [
                 vertex0,vertex3,vertex2, 
                 vertex0,vertex2,vertex1
                ]

或使用三角形條紋(每個三角形由一個新頂點和前一個三角形的兩個頂點描述):

var triangles = [
                 vertex3, vertex2, vertex0,
                 vertex1
                ]  

在本書的第2章中,您在其中的一條注釋中引用了它們,它們提出了一種稱為雙連接邊緣列表(DCEL)的數據結構。 DCEL:s用於存儲平面細分,例如三角剖分。 從您寫的內容來看,我認為這可能是您想要的。

https://en.wikipedia.org/wiki/Doubly_connected_edge_list

暫無
暫無

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

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