2

我现在正在尝试使用 python 计算泊松球分布(泊松盘的 3D 版本),然后将结果插入 POV-RAY 以便我可以生成一些随机分布的填充岩石。我正在关注这两个链接:

0.创建一个 n 维网格数组,单元格大小 = r/sqrt(n),其中 r 是每个球体之间的最小距离。所有数组都设置为默认 -1 代表“无点”

1.创建一个初始样本。(它应该是随机放置的,但我选择放在中间)。把它放在网格数组中。此外,初始化一个活动数组。将初始样本放入活动数组中。

2.当活动列表不为空时,选择一个随机索引。在它附近生成点并确保这些点不与附近的点重叠(仅使用附近的数组进行测试)。如果在“随机索引”附近无法创建样本,则将“随机索引”踢出。循环这个过程。

这是我的代码:

import math
import numpy
from random import uniform
import random
from math import floor
r = 1
k = 30
grid = []
w = r / math.sqrt(2)
active = []
width = 100
height = 100
depth = 100
cols = floor(width / w)
rows = floor(height / w)
deps = floor(depth / w)
default = numpy.array((-1,-1,-1))
for i in range(cols * rows * deps):
    grid.append(default)

x = width / 2
y = height / 2
z = depth / 2
i = floor(x / w)
j = floor(y / w)
k = floor(z / w)
pos = numpy.array((x,y,z))
grid[i + cols * (j + rows * k)] = pos
active.append(pos)
while (len(active) > 0) and (len(grid[grid == -1]) > 0):
    randIndex = floor(uniform(0, len(active)))
    pos = active[randIndex]
    found = False
    for n in range(k):
        m1 = uniform(-2 * r, 2 * r)
        m2 = uniform(-2 * r, 2 * r)
        m3 = uniform(-2 * r, 2 * r)
        m = numpy.array((m1,m2,m3))
        sample = numpy.add(pos, m)

        col = floor(sample[0] / w)
        row = floor(sample[1] / w)
        dep = floor(sample[2] / w)

        if (col > -1 and row > -1 and dep > -1 and col < cols and row < rows and dep < deps and numpy.all([grid[col + cols * (row + rows * dep)],default])==True):
            ok = True
            for i in range(-1,2):
                for j in range(-1, 2):
                    for k in range(-1, 2):
                        index = (col + i) +  cols * ((row + j) + rows * (dep + k))
                        if col + i > -1 and row + j > -1 and dep + k > -1 and col + i < cols and row + j < rows and dep + k < deps:
                            neighbor = grid[index]
                            if numpy.all([neighbor, default]) == False:
                                d = numpy.linalg.norm(sample - neighbor)
                                if (d < r):
                                    ok = False
            if ok == True:
                found = True
                grid[col + cols * (row + rows * dep)] = sample
                active.append(sample)
    if found == False:
        del active[randIndex]
    print(len(active))


for printout in range(len(grid)):
    print("<" + str(active[printout][0]) + "," + str(active[printout][1]) + "," + str(active[printout][2]) + ">")
print(len(grid))

我的代码似乎永远运行并且不遵守我的条件(两个球体的距离必须大于 2 * 半径),如 POV-RAY 的可视化所示。(评论中的图片)

因此,我尝试print(len(active))在 while 循环的最后添加一个。令人惊讶的是,我想我发现了这个错误,因为活动列表的长度不断增加!(它应该与网格的长度相同)我认为问题是由 引起的active.append(),但我不知道问题出在哪里,因为代码实际上与 Mr.希夫曼。

我不想搭便车,但我已经一次又一次地检查,同时一次又一次地纠正这段代码:(。不过,我不知道错误在哪里。(为什么 active[] 继续追加! ?)

感谢您宝贵的时间。

4

0 回答 0