【问题标题】:Confused with Voronoi diagram algorithm (Fortune's sweepline)对 Voronoi 图算法感到困惑(财富的扫描线)
【发布时间】:2009-06-11 18:51:31
【问题描述】:

我正在实施 Voronoi 图以直观地找出地图中最近的位置。现在我只想在画布中使用整数坐标 (x,y)。

问题是-我对这个算法真的很困惑。我读了计算几何书,关于财富算法的更多理论。我现在真的很困惑。当我要进行编码时,这对我来说似乎很复杂。

请告诉我非常简单的 voronoi 图实现(给定坐标)。请建议我使用简单的 java 或 python 或方案代码,最好不要使用哈希、多线程、Delaunay Traingulation、花哨的颜色等。

不使用多线程或散列映射就不能用Fortune算法实现Voronoi图吗?

【问题讨论】:

    标签: algorithm computational-geometry voronoi


    【解决方案1】:

    I opened a github repository 与财富的原始论文端口。 Fortune 的实现非常难以遵循,主要是因为他处理数据结构的方式。

    This book 看起来更现代

    Fortune's original paper 需要几次读取。

    Ken Wong's 论文对算法的描述可以说比原始论文中的财富更清晰

    Ken Wong's presentation 有很棒的幻灯片 (10, 11) 关于如何处理站点和顶点

    您可以观看interactive JavaScript demo (Archived version) 来帮助您可视化算法。

    pdf (Archived version) 也描述了该算法。

    Steven Fortune's original implementation is on his homepage.

    This Stony Brook site 列出更多实现

    Triangle 是“二维质量网格生成器和 Delaunay 三角剖分器。”

    Voronoi 图上有一个entire book called "Spatial Tesselations Concepts and Applications of Voronoi Diagrams" by Atsuyuki Okabe, Barry Boots et al

    【讨论】:

      【解决方案2】:

      Voronoi 图只是一个图:不是数据结构或算法。我认为它不适合在集合中找到最近的点。构建图表不会改变您的问题的渐近复杂性,尽管它会使您的问题更复杂且内存效率更低。你最好把你的点放在四叉树或类似的东西上。如果您正在寻找算法,那么您要解决的问题的名称是“空间索引”。 “最近点”是四叉树等空间索引解决的问题之一。

      【讨论】:

      • 他试图直观地描绘最近的邻居——在地图上叠加一个 Voronoi 图,这样人们就可以一眼看出哪个 X 离兴趣点最近。
      • Voronoi 图用于解决最近邻问题:en.wikipedia.org/wiki/Voronoi_diagram#Applications
      • Voronoi 图不仅仅是一个图。它是一个平面图(边不交叉),有顶点和双向边。
      【解决方案3】:

      看起来很复杂,因为它很复杂!您不需要哈希表或线程,但您将需要一个优先级队列(通常实现为堆,并且在 java 和 python 标准库中都可用)和一个树,它可以让您在 O(log n) 中进行范围查询(标准库中的那些并不适合,因为您无法了解它们的内部结构;我建议实施AA tree)。而且算法本身还是很麻烦的。

      您可以运行外部程序吗?如果是这样,我真的建议您将繁重的工作留给QHull,它非常擅长 Voronoi 图。可悲的是,比我们任何一个人都要好得多。

      【讨论】:

      • 我明白你的意思。但是我必须自己做才能评估。所以,我一直在寻找一些简单的实现,我可以研究和修改/添加到我的设计中。
      【解决方案4】:

      去年我看了很多 Voronoi 图,我当然可以理解其中的困惑。周围有一些 Voronoi 图生成算法的实现。一对夫妇见this page,也见here。正如两次提到的,Qhull 确实值得一看 - MATLAB 使用它来生成 Voronoi 图和 Delaunay 三角剖分以及类似的有趣的东西。

      【讨论】:

        【解决方案5】:

        这是 Ruby 和 C 中的另一个实现,包括可视化:

        http://github.com/abscondment/rubyvor/

        【讨论】:

        • 如果您能解释实现的工作原理或会有所帮助,那就太好了,因为最初的问题提到了 Java 或 Python 的使用,而这个实现是在 Ruby 中实现的。
        【解决方案6】:

        显然,Fortune 的算法实现起来并不简单。特别是如果你 consider numerical robustness issues 时间线。你没有说你想用什么编程语言来实现它。如果是 C++,您可以找到 Andriy Sydorchuk 为 Boost in frame of GSoC 2010 项目所做的工作:Sweepline Algorithm。 Andriy 的实现基于Boost.Polygon 库。 Voronoi 实现和 Boost.Polygon 都依赖整数坐标来提供数值稳健性。

        Sweep-Line Algorithm for Voronoi Diagrams of Points, Line Segments and Medial Axis of Polygons in the Plane 上的 BoostCon 视频讲座很好地解释了这个想法、问题和陷阱。

        关于这个 Voronoi 项目的讨论很多。 2010/2011 年发生在 Boost 邮件列表中。

        【讨论】:

          猜你喜欢
          • 2015-01-21
          • 2018-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多