实现Birdson的Poisson-Disc分布时使用哪种数据结构

时间:2014-07-27 22:53:41

标签: haskell data-structures

我正在尝试使用Haskell编写一个使用Poisson-disc分布创建一组点( :: (Float,Float))的函数。我在described上使用 Birdson的算法作为Mike Bostock's blog

点保持在网格中,使得每个单元格中的点数永远不会超过一个点。通过这样做,最近邻居问题从 O(n)减少到 O(1)

我的问题是这个网格使用什么样的数据结构。 JavaScript使用可变数组和for循环,因为命令式语言倾向于这样做。我可以使用Vectors复制这种方法,但我觉得可能有更好的功能数据结构。

哪种结构可能适用于此网格?这是一个使用 Comonads 的地方吗?

1 个答案:

答案 0 :(得分:0)

对于最近邻居问题,有一种称为Voronoi图的通用结构。通过该图上的点位置,您可以在O(log n)中找到最近邻居。我认为O(1)是不可能的,除非你的问题有其他一些特定功能。对于点位置,您可以使用Edelsbrunner的链方法或Sleator和Tarjan的持久二进制搜索树。您可以在GLib中找到C实现。希望您能够在javascript中找到这些算法和数据结构:js voronoi