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

时间:2017-05-04 16:03:58

标签: python algorithm disk sampling poisson

首先,我在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算法?

1 个答案:

答案 0 :(得分:1)

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

binned Poisson disk sampling

仅仅通过查看x坐标,可以排除另外三个单元格,同样也可以排除三个单元格,因为它们的y坐标,但值得努力吗?直到你实现了算法并且可以测试性能。

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