Python .append似乎永远都在运行,并且“统一”#39;值似乎不太随机(在Python中制作Poisson球体分布)

时间:2017-07-12 04:30:33

标签: python poisson povray

我现在正在尝试使用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的可视化所示。(评论中的图片)

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

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

感谢宝贵的时间。

0 个答案:

没有答案