【问题标题】:Process list of Delaunay triangles in Voronoi algorithmVoronoi算法中Delaunay三角形的处理列表
【发布时间】:2016-04-06 22:26:53
【问题描述】:

给定一个 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=&lt;T1,T2,...TM&gt;,那么,在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)

谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果您可以在恒定时间内执行 searchNeighbor(edge) 和 center.get(),则此算法为 O(N),如果 searchNeighbor(edge) 花费 O(log N) 时间,则此算法为 O(N log N)。

    其中任何一个都应该很容易通过制作地图来满足:edge -> (triangle,triangle) 首先,searchNeighbor() 会参考。

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

    • 构建中心会增加 O(N) 个中心并花费 O(N) 时间

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

    • 每个三角形有 3 条边

    • 在 O(N) 时间内将 O(N) 条边添加到结果中

    【讨论】:

    • 问题是我必须知道取N = #points的最坏情况,有相同数量的tangles和points?
    • 是的。 2D Delauney 三角剖分有 O(#points) 个三角形
    • 您有文件或证明吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2012-05-25
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多