首先,我在2D平面上实现了普通的,慢的, Poisson Disk Sampling 算法,它运行得很好。这个慢速版本计算所有点之间的距离,并检查您要放置的点是否至少远离所有其他点。
Robert Bridson的快速版本,可在此处获取:https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf建议将2D平面离散为长度= R / sqrt(2)的二次单元格,因为每个单元格最多只能包含一个有效点,并且您需要检查距离计算的单元格数量将保持不变。它还具有以下优势:您可以知道可以精确放置在给定的有限2D平面和距离R上的最大点数。我希望我已经正确地理解了这一点......
我在Python中实现的快速Poisson磁盘采样算法不起作用,我无法弄清楚原因。它速度较慢,可能是因为我还没有对它进行矢量化,但是当我不完全检查每个点时它也会给出不正确的结果。也就是说,生成无效点。我将首先提出罗伯特·布林德森的论文中没有回答的一些问题。
Q1:鉴于您希望在单元格中放置一个点X,并且每个单元格是一个长度为R / sqrt(2)的正方形,您需要检查哪些单元格是否被点Y占用以确定是否X点距离所有Y?至少为R?
只是在纸上画圆圈和网格我想出了这个:
[ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ]
任何人都可以确认这是正确/不正确吗?
Q2:你将如何计算X点应占据的单元格?在论文中没有提到这一点,但在X点靠近细胞边界的情况下似乎很棘手。我应该做一个'皮肤'细胞周围有一定厚度,只有在细胞皮肤内部才能被认为是一个点?另外,如果您要生成索引,对于上面从X点开始显示的单元格,则随机化新单元格Y在单元格内的位置,它是否仍然是Poisson Disk Sampling算法?