与Voronoi图算法混淆(Fortune的扫描线)

时间:2009-06-11 18:51:32

标签: algorithm computational-geometry voronoi

我正在实施Voronoi图,以便在视觉上找出地图中最近的位置。现在我想只在画布中使用整数坐标(x,y)来做到这一点。

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

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

如果没有多线程或哈希映射,是不是可以使用Fortune算法实现Voronoi图?

6 个答案:

答案 0 :(得分:16)

I opened a github repository带有Fortune原始论文的端口。由于他处理数据结构的方式,Fortune的实施非常难以实现。

This book看起来更现代了

Fortune's original paper需要一些阅读。

Ken Wong's论文在原始论文中描述了比Fortune更清晰的算法

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

您可以观看interactive JavaScript demoArchived version)来帮助您查看算法。

pdf也描述了算法。

Steven Fortune's original implementation is on his homepage

This Stony Brook site列出了更多实现

Triangle是“一个二维质量网格生成器和Delaunay三角函数。”

Voronoi图上有entire book

答案 1 :(得分:1)

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

答案 2 :(得分:1)

看起来很复杂,因为它很复杂!您不需要散列表或线程,但是您需要一个优先级队列(通常实现为堆,并且在java和python标准库中都可用)和一个允许您在O(log n)中进行范围查询的树(标准库中的那些不太适合,因为你无法进入他们的内部;我建议实现AA tree)。算法本身仍然非常多毛。

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

答案 3 :(得分:0)

我去年看了很多Voronoi图表,我当然可以理解这种困惑。有一些Voronoi图生成算法的实现。请参阅this page了解一对,以及here。正如twic所提到的,Qhull当然值得一看--MATLAB使用它来生成Voronoi图和Delaunay三角剖分以及类似的有趣事物。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

显然,财富的算法并非易于实现。特别是如果你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邮件列表中。