Python中的快速泊松磁盘采样[Robert Bridson]

Python中的快速泊松磁盘采样[Robert Bridson],python,algorithm,disk,sampling,poisson,Python,Algorithm,Disk,Sampling,Poisson,首先,我在二维平面上实现了普通的、缓慢的泊松圆盘采样算法,效果很好。此慢速版本计算所有点之间的距离,并检查要放置的点与所有其他点之间的距离是否至少为R 罗伯特·布里德森(Robert Bridson)的快速版本建议将二维平面离散为长度为R/sqrt(2)的二次单元,因为这样每个单元最多只能包含一个有效点,并且需要检查距离计算的单元数变得恒定。它还有一个优点,就是你知道在给定的有限二维平面和距离R上可以精确放置的最大点数。我希望我已经正确地理解了这一点 然而,我用Python实现的快速泊松磁盘采样

首先,我在二维平面上实现了普通的、缓慢的泊松圆盘采样算法,效果很好。此慢速版本计算所有点之间的距离,并检查要放置的点与所有其他点之间的距离是否至少为R

罗伯特·布里德森(Robert Bridson)的快速版本建议将二维平面离散为长度为R/sqrt(2)的二次单元,因为这样每个单元最多只能包含一个有效点,并且需要检查距离计算的单元数变得恒定。它还有一个优点,就是你知道在给定的有限二维平面和距离R上可以精确放置的最大点数。我希望我已经正确地理解了这一点

然而,我用Python实现的快速泊松磁盘采样算法不起作用,我也不明白为什么。速度较慢,可能是因为我还没有对它进行矢量化,但如果我没有完全检查每个点,它也会给出错误的结果。即,生成无效点。我首先要问一些罗伯特·布林森论文中没有回答的问题

Q1:假设您希望在单元格中放置一个点X,并且每个单元格都是长度为R/sqrt(2)的正方形,那么您需要检查哪些单元格是否被点Y占用,以确定点X是否至少与所有Y相距R

在纸上画圆圈和网格,我想到了这个:

   [ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ]
   [ ][ ][ ]
有人能确认这是正确的/不正确的吗


问题2:您将如何计算点X应占据的单元格?本文中没有提到这一点,但在点X靠近单元边界的情况下,这似乎很棘手。我是否应该在细胞周围做一个一定厚度的“皮肤”,这样一个点只有在不在细胞皮肤内时才被考虑?此外,如果您要生成索引,如上图所示,从一个点X开始,为这些单元格生成索引,然后将新点Y在单元格内的位置随机化,这仍然是泊松圆盘采样算法吗?

A1:是的,如果单元格大小等于r,检查这些单元格就足够了/√二,

只要看x坐标,就可以排除另外三个单元格,同样,由于y坐标的原因,也可以排除三个单元格,但这值得付出努力吗?直到您实现了算法并可以测试性能


A2:不,我认为这不会很棘手。(x,y)处的点占据单元格(⌊√2 x/r⌋, ⌊√2年/月⌋). 如果新点位于已占用的单元格中,或者21个单元格中的任何一个单元格包含的点太近,则新点将被拒绝。

我不确定您在最后一句中的建议。首先随机选择单元格,然后在该单元格内选择随机位置?嘿,回答得好,谢谢。您如何确定o的位置f蓝色方块(用于测试空白的方块)?