【发布时间】:2017-09-01 03:30:13
【问题描述】:
尊敬的社区成员,
我最近一直致力于在 cpp 中实现 Delaunay 三角测量。虽然我有有效的算法.. 它非常慢(大约 16 秒内计算了 100 个对象)。
算法基于蛮力方法。给定一组有限的点:
- 我将每个点迭代 3 次,检查是否可以
从这些点创建一个三角形; - 根据这三个点,我正在创建一个穿过这些点的圆;
- 我第四次遍历整个点集,检查创建的圆是否包含与这三个点不同的任何点 上面提到的。
- 如果圆内没有其他点,我假设从这三个点创建的三角形是有效的。
就像我提到的,算法是这里描述的 Delaunay 三角剖分的直接实现:https://en.wikipedia.org/wiki/Delaunay_triangulation。它工作“完美无缺”,但速度很慢。
关于可以加快它的逻辑的任何想法/建议(如果可能,不完全改变逻辑)?
【问题讨论】:
-
如果你想要可接受的速度,你必须改变逻辑。无论你使用什么技巧,n^4 都会非常慢,合理的算法是 n log n。
-
您能否为某些三角形范围提供一组预定义的圆圈。然后看看你的分数是否符合其中之一
-
我将给出一个很少有人知道的一般提示:检查点是否在圆中时,您不需要取平方根。
-
该页面列出了四种算法。试试其中一个怎么样?
-
瓶颈通常是错误的列表使用,过多的重新分配或插入移动......导致更糟糕的复杂性......