【问题标题】:Fast Poisson Disk Sampling [Robert Bridson] in PythonPython 中的快速泊松磁盘采样 [Robert Bridson]
【发布时间】:2017-05-04 16:03:58
【问题描述】:

首先,我在 2D 平面中实现了普通的、缓慢的泊松磁盘采样算法,它工作得很好。这个慢版本计算所有点之间的距离,并检查您希望放置的点是否与所有其他点至少距离 R。

Robert Bridson 的快速版本,可在此处获得:https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf,建议将您的 2D 平面离散化为长度 = R/sqrt(2) 的二次单元,因为每个单元最多可以包含一个有效点和数字您需要检查距离计算的单元格数量变得恒定。它还具有您知道可以精确放置在给定有限二维平面和距离 R 上的最大点数的优点。我希望我已经正确理解了这一点......

然而,我在 Python 中实现的快速泊松磁盘采样算法不起作用,我不知道为什么。它速度较慢,可能是因为我还没有对其进行矢量化,但是当我没有绝对检查每个点时,它也会给出不正确的结果。即,产生无效点。我将首先提出一些 Robert Brindson 的论文中没有回答的问题。

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

我只是在纸上画圆圈和网格我想出了这个:

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

谁能确认这是正确/不正确的?

Q2:你会如何计算一个点 X 应该占据哪个单元格?论文中没有提到这一点,但在点 X 靠近单元格边界的情况下似乎很棘手。我是否应该在细胞周围制作一定厚度的“皮肤”,以便仅在不在其细胞皮肤内时才考虑点?另外,如果您要生成索引,对于如上所示的从点 X 开始的此类单元格,然后在单元格内随机化新点 Y 的位置,它仍然是 Poisson Disk Sampling 算法吗?

【问题讨论】:

  • 我不确定你在最后一句话中的提议。首先随机选择单元格,然后在该单元格中选择随机位置?

标签: python algorithm disk sampling poisson


【解决方案1】:

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

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

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

【讨论】:

  • 嘿,很好的答案,谢谢。您将如何确定蓝色方块的位置(用于测试空性的方块)?
猜你喜欢
  • 2012-07-19
  • 2019-11-16
  • 1970-01-01
  • 2022-08-04
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多