首先,我在二维平面上实现了普通的、慢的Poisson盘采样算法,它工作得很好此慢速版本计算所有点之间的距离,并检查要放置的点是否至少与所有其他点保持R距离。
robert bridson的快速版本(在这里提供:https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf)建议将二维平面离散为长度为r/sqrt(2)的二次单元,因为这样每个单元最多只能包含一个有效点,并且需要检查距离计算的单元数变为常数。它还有一个优点,你知道在一个给定的有限2D平面和一个距离R上可以精确放置的点的最大数量。我希望我已经正确地理解了这一点…
我在python中实现的快速poisson磁盘采样算法却不起作用,我也不知道为什么。它比较慢,可能是因为我还没有对它进行矢量化,但是当我没有完全检查每个点时,它也会给出错误的结果即生成无效点。我先问一些罗伯特布林森的论文没有回答的问题。
问题1:假设您希望在一个单元格中放置一个点X,并且每个单元格都是一个长度为R/sqrt(2)的正方形,那么您需要检查哪些单元格是否被一个点Y占用,以确定该点X是否至少与所有Y相距R?
只是在纸上画个圈和网格我想到了这个:

   [ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ]
   [ ][ ][ ]

有人能确认这是正确的/不正确的吗?
问题2:如何计算X点应该占据哪个单元格?本文中没有提到这一点,但在x点靠近单元边界的情况下,这似乎很棘手。我是否应该在细胞周围做一个一定厚度的“皮肤”,这样一个点只有在不在细胞皮肤内时才被考虑另外,如果您要生成索引,对于如上面所示的从点x开始的单元格,然后在单元格中随机化新点y的位置,它仍然是poisson磁盘采样算法吗?

最佳答案

A1:是的,如果单元格大小等于r/√2,检查这些单元格就足够了。
python - Python中的快速泊松磁盘采样[Robert Bridson]-LMLPHP
仅仅通过查看x坐标,就可以排除另外三个单元格,同样地,由于它们的y坐标,也可以排除三个单元格,但是这样做值得吗直到你实现了算法并且可以测试性能。
A2:不,我不认为这会很棘手。(x,y)处的点占据单元格(√2x/r,√2y/r)。如果新点位于占用的单元格中,或者21个单元格中的任何一个单元格包含的点太近,则新点将被拒绝。

关于python - Python中的快速泊松磁盘采样[Robert Bridson],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43787847/

10-12 17:03