gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:58 25 4
gpt4 key购买 nike

给定 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)

谢谢!

最佳答案

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

其中任何一个都应该很容易通过制作 map 来满足:边 -> (三角形,三角形) 首先,searchNeighbor() 会引用。

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

  • Building centers 增加 O(N) 个中心,花费 O(N) 时间

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

  • 每个三角形有3条边

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

关于algorithm - Voronoi算法中Delaunay三角形的处理列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34572001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com