Voronoi算法中Delaunay三角形的处理列表

时间:2016-01-03 00:00:22

标签: algorithm time-complexity computational-geometry delaunay voronoi

给定一个Delaunay三角形列表,有必要获得将成为Voronoi曲面细分一部分的边列表。

程序骨架的伪代码是:

getVoronoi(list<point> points) {
    list<triangle> triangles = delaunayTriangulation(points);
    list<edge> edges = voronoiTessellation(triangles);

    //Do something with "edges".
}

让N为points的大小,知道delaunayTriangulation(points)为O(N log N)triangles=<T1,T2,...TM>,然后,在voronoiTessellation(triangles)中,复杂性必须小于或等于O(N log N)

计算曲面细分的方法是:

voronoiTessellation (list<Triangle> triangles) {
    list<Edge> edges;
    map<Triangle, Point> centers;

    foreach(Triangle triangle in triangles) {
        centers.add(triangle,triangle.calculateCircumcircle());
    }

    foreach(<Triangle triangle,Point point> in points) {
        list<edges> triangleEdges = triangle.getEdges();
        foreach (Edge edge in triangleEdges) {
            Triangle neighbor = searchNeighbor(edge);
            Point neighborCircumcenter = centers.get(neighbor);
            Line line(point, neighborCircumcenter);
            //todo only add this edge once
            edges.add(line);
        }
    }

    return edges;
}

我的问题是:voronoiTessellation(T)的复杂性是多少?它小于或等于O(N log N)

谢谢!

1 个答案:

答案 0 :(得分:3)

如果你可以在常数时间内执行searchNeighbor(edge)和centers.get(),或者如果searchNeighbor(edge)需要O(log N)时间,则该算法为O(N)。

通过制作地图,其中任何一个都应该很容易满足:edge - &gt; (三角形,三角形)首先,searchNeighbor()会咨询。

如果您使用哈希映射,您将获得预期的O(N)时间。在N个点的Delaunay三角剖分中有O(N)个三角形,所以:

  • 建筑中心增加O(N)个中心并需要O(N)时间

  • 有O(N)三角形,点对

  • 每个三角形有3条边

  • 在O(N)时间内向结果添加O(N)边