Python 通用3d possion磁盘采样

Python 通用3d possion磁盘采样,python,poisson,sample-data,Python,Poisson,Sample Data,我想为三维网格创建泊松圆盘采样。我使用实现将其推广到3D。然而,似乎我遗漏了什么,我找不到问题所在。此实现遵循Robert Bridson的算法 我所做的是将每个2d对象变成3d,并用球坐标创建新的点 从随机导入随机 从数学导入cos、sin、floor、sqrt、pi、ceil def欧几里得距离a,b: dx=a[0]-b[0] dy=a[1]-b[1] dz=a[2]-b[2] 返回sqrtdx*dx+dy*dy+dz*dz def泊松盘样本宽度、高度、厚度、r、k=5,距离=欧几里得距离

我想为三维网格创建泊松圆盘采样。我使用实现将其推广到3D。然而,似乎我遗漏了什么,我找不到问题所在。此实现遵循Robert Bridson的算法

我所做的是将每个2d对象变成3d,并用球坐标创建新的点

从随机导入随机 从数学导入cos、sin、floor、sqrt、pi、ceil def欧几里得距离a,b: dx=a[0]-b[0] dy=a[1]-b[1] dz=a[2]-b[2] 返回sqrtdx*dx+dy*dy+dz*dz def泊松盘样本宽度、高度、厚度、r、k=5,距离=欧几里得距离,随机=随机: tau=2*pi cellsize=r/sqrt2 网格宽度=intceilwidth/cellsize 网格高度=单元高度/单元大小 网格厚度=内部厚度/单元大小 网格=[无]*网格宽度*网格高度*网格厚度 def网格协调器: 返回intfloorp[0]/cellsize、intfloorp[1]/cellsize、intfloorp[2]/cellsize def fitsp、gx、gy、gz: yrange=listrangemaxgy-2,0,mingy+3,网格高度 zrange=listrangemaxgz-2,0,mingz+3,网格厚度 对于范围为MaxGx-2、0、mingx+3的x,网格宽度: 对于y范围内的y: 对于zrange中的z: g=网格[x+y+z*网格宽度] 如果g为无: 持续
如果是distancep,g我认为你对代码的修改很好。。。我唯一关心的是调用queue.pop,当发现一个点时,不会中断循环,这看起来有点可疑。如果您关心样本的发射顺序,那么这将与已发布的算法不同,但在其他方面可能并不重要


您的主要问题是尝试生成大量点,并且该方法必须对每个点执行相当多的工作,因此需要一段时间才能完成!如果我在生成时将代码更改为屈服点,即在queue.appendp附近添加屈服点,而不是在末尾全部返回,那么我会得到看起来合理的输出

我通过谷歌搜索该算法的python 3d实现偶然发现了这段代码。发布的代码确实不起作用!至少有两个问题:

    grid[grid_x + grid_y + grid_z * grid_width] = p
在这一行和类似的行中,没有正确地索引网格,网格应该是一个3d数组或一个替换3d数组的列表。最简单的解决方案是使用一个实际的numpy 3d数组,并将索引存储到其中的一个平面点列表中,这与本文中的建议不同

d = r * sqrt(3 * random() + 1)
px = qx + d * cos(alpha) * sin(theta)
py = qy + d * sin(alpha) * sin(theta)
pz = qz + d * cos(theta)
这将使r和2r之间的样本在三维空间中保持一致,但我相信这些样本将偏向更小的距离