我已经在程序中实现了多边形三角剖分算法。该算法首先获取一个simple polygon(描述为2D点/顶点),然后将其拆分为y-monotone pieces。 完成此操作后,该算法将获取每个单调多边形片段并将其拆分为三角形片段。
我需要帮助的算法的输入是一组顶点,这些顶点按顺时针或逆时针顺序概述了y单调多边形。输出是所有边的集合,这些边既来自原始多边形,也来自三角剖分算法添加的新边,以将y单调块分割成三角形块。如果我只想绘制结果,则效果很好,因为可以只绘制每个边缘。
但是,此边缘集合没有特定的顺序,我需要输出为triangle strip类型的数组或,其中每个三角形都由其简单描述的数组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
]
答案 0 :(得分:1)
在本书的第2章中,您在其中的一条注释中引用了它们,它们提出了一种称为双连接边缘列表(DCEL)的数据结构。 DCEL:s用于存储平面细分,例如三角剖分。从您写的内容来看,我认为这可能是您想要的。