【问题标题】:Optimising Delaunay triangulation algorithm优化 Delaunay 三角剖分算法
【发布时间】:2017-09-01 03:30:13
【问题描述】:

尊敬的社区成员,

我最近一直致力于在 cpp 中实现 Delaunay 三角测量。虽然我有有效的算法.. 它非常慢(大约 16 秒内计算了 100 个对象)。

算法基于蛮力方法。给定一组有限的点:

  • 我将每个点迭代 3 次,检查是否可以
    从这些点创建一个三角形;
  • 根据这三个点,我正在创建一个穿过这些点的圆;
  • 我第四次遍历整个点集,检查创建的圆是否包含与这三个点不同的任何点 上面提到的。
  • 如果圆内没有其他点,我假设从这三个点创建的三角形是有效的。

就像我提到的,算法是这里描述的 Delaunay 三角剖分的直接实现:https://en.wikipedia.org/wiki/Delaunay_triangulation。它工作“完美无缺”,但速度很慢。

关于可以加快它的逻辑的任何想法/建议(如果可能,不完全改变逻辑)?

【问题讨论】:

  • 如果你想要可接受的速度,你必须改变逻辑。无论你使用什么技巧,n^4 都会非常慢,合理的算法是 n log n。
  • 您能否为某些三角形范围提供一组预定义的圆圈。然后看看你的分数是否符合其中之一
  • 我将给出一个很少有人知道的一般提示:检查点是否在圆中时,您不需要取平方根。
  • 该页面列出了四种算法。试试其中一个怎么样?
  • 瓶颈通常是错误的列表使用,过多的重新分配或插入移动......导致更糟糕的复杂性......

标签: c++ algorithm delaunay


【解决方案1】:

感谢大家的快速反馈。

我做了一些额外的研究,遗憾的是,降低时间复杂度的最佳方法似乎是完全重写现有算法。

对于可能遇到类似问题的其他人,此处描述了示例方法:https://people.eecs.berkeley.edu/~jrs/274/proj.html

【讨论】:

  • 这应该是评论而不是答案。
猜你喜欢
  • 2015-01-07
  • 2019-04-18
  • 2019-01-06
  • 2021-05-14
  • 2013-05-12
  • 1970-01-01
  • 2016-02-08
  • 2014-01-21
  • 2019-09-28
相关资源
最近更新 更多