如何从相对邻居图中获取闭合多边形

时间:2013-07-29 13:57:40

标签: graph geometry computational-geometry

飞机上有许多2D点。 首先,我通过两种方法获得了图表:

  1. 执行Delaunay三角剖分,然后删除每个三角形的最长边;

  2. 通过代码NGL获取相对邻居图:http://www.ngraph.org/

  3. 上述两种方法的结果似乎相似。 Results 但现在,我有一个问题。如何从上面的相对邻居图中获取所有多边形? 也就是说,这些多边形将永远不会包含其他边缘。 我想从图中获取所有子区域,因此我可能首先找到所有多边形。

    有人知道怎么做吗?

1 个答案:

答案 0 :(得分:2)

首先,您提到的两个图表实际上是不同的图表类型:

  1. Relative Neighbourhood Graph在缺少满足ijk的其他顶点dist(i,k) < dist(i,j)的情况下包含边dist(j,k) < dist(i,j)

  2. 正如您所提到的,Urquhart Graph是通过移除Delaunay Triangulation中每个三角形的最长边而形成的。

  3. 虽然这些图表通常相似,并且在某些情况下可能相同,但它们通常是截然不同的。

    您的评论似乎表明您确实正在构建来自Delaunay三角剖分U的Urquhart图T,因此,您可以更改边缘删除算法以构建在构建U时不相交的多边形。

    请注意,从三角剖分T中删除边时,您还要合并与该边相邻的两个多边形。最初,每个内部边缘将与两个三角形相邻,但随着边缘移除的进行,边缘将与更复杂的多边形相邻。

    算法可以按如下方式进行:

    // Data-structures:
    // S: a set of polygons - each polygon is a list of triangles
    // P: a pointer to the parent polygon for each triangle
    // Triangulation should give O(1) access to edge-adjacent triangles
    
    S <- push each triangle as it's own initial polygon
    P <- mark each triangle as it's own initial parent
    
    while (removing edges)
        ij <- edge to be removed from U
    
        ti <- 1st tria adjacent to edge ij
        tj <- 2nd tria adjacent to edge ij
    
        pi <- P(ti); // poly containing ti
        pj <- P(tj); // poly containing tj
    
        // merge pi and pj into single poly
        S(pi) <- S(pj) // push triangles from pj onto pi
        P(S(pj)) = pi  // mark pi as parent for trias
                       // from pj
        S(pj) <- 0     // poly pj is now null
    endwhile
    

    结果将是一组不相交的多边形作为三角形列表。

    形成多边形区域边界的边将是图U中出现的那些边 - 这些是与不同多边形中的三角形相邻的边。

    希望这有帮助。