我正在尝试使用Haskell编写一个使用Poisson-disc分布创建一组点( :: (Float,Float))
的函数。我在described上使用 Birdson的算法作为Mike Bostock's blog。
点保持在网格中,使得每个单元格中的点数永远不会超过一个点。通过这样做,最近邻居问题从 O(n)减少到 O(1)。
我的问题是这个网格使用什么样的数据结构。 JavaScript使用可变数组和for循环,因为命令式语言倾向于这样做。我可以使用Vectors复制这种方法,但我觉得可能有更好的功能数据结构。
哪种结构可能适用于此网格?这是一个使用 Comonads 的地方吗?
答案 0 :(得分:0)
对于最近邻居问题,有一种称为Voronoi图的通用结构。通过该图上的点位置,您可以在O(log n)中找到最近邻居。我认为O(1)是不可能的,除非你的问题有其他一些特定功能。对于点位置,您可以使用Edelsbrunner的链方法或Sleator和Tarjan的持久二进制搜索树。您可以在GLib中找到C实现。希望您能够在javascript中找到这些算法和数据结构:js voronoi。