在python上制作泊松球体分布,但无法弄清楚bug在哪里

时间:2017-07-11 18:12:30

标签: python poisson povray

我是编程新手,所以我希望我的愚蠢问题不会让你烦恼。 我现在正在尝试使用python计算泊松球体分布(泊松盘的3D版本),然后将结果插入到POV-RAY中,这样我就可以生成一些随机分布的填充岩石。 我正在关注这两个链接: [https://github.com/CodingTrain/Rainbow-Code/blob/master/CodingChallenges/CC_33_poisson_disc/sketch.js#L13] [https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph07-poissondisk.pdf] TL;博士 0.创建一个n维网格数组和单元格大小= r / sqrt(n)其中r是每个球体之间的最小距离。所有数组都设置为默认值-1,表示“无点” 1.创建初始样本。 (它应该随机放置,但我选择将它放在中间)。把它放在网格数组中。此外,初始化活动数组。将初始样本放在活动数组中。 2.当活动列表不为空时,选择一个随机索引。生成靠近它的点并确保点与附近点不重叠(仅测试附近的阵列)。如果在“随机索引”附近无法创建样本,请将“随机索引”踢出。循环过程。

这是我的代码:

import math
from random import uniform
import numpy
import random
radius = 1      #you can change the size of each sphere
mindis = 2 * radius
maxx = 10         #you can change the size of the container
maxy = 10
maxz = 10
k = 30
cellsize = mindis / math.sqrt(3)
nrofx = math.floor(maxx / cellsize)
nrofy = math.floor(maxy / cellsize)
nrofz = math.floor(maxz / cellsize)
grid = []
active = []
default = numpy.array((-1, -1, -1))
for fillindex in range(nrofx * nrofy * nrofz):
    grid.append(default)
x = uniform(0, maxx)
y = uniform(0, maxy)
z = uniform(0, maxz)
firstpos = numpy.array((x, y,  z))
firsti = maxx // 2
firstj = maxy // 2
firstk = maxz // 2
grid[firsti + nrofx * (firstj + nrofy * firstk)] = firstpos
active.append(firstpos)
while (len(active) > 0) :
    randindex = math.floor(uniform(0,len(active)))
    pos = active[randindex]
    found = False
    for attempt in range(k):
        offsetx = uniform(mindis, 2 * mindis)
        offsety = uniform(mindis, 2 * mindis)
        offsetz = uniform(mindis, 2 * mindis)
        samplex = offsetx * random.choice([1,-1])
        sampley = offsety * random.choice([1,-1])
        samplez = offsetz * random.choice([1,-1])
        sample = numpy.array((samplex, sampley, samplez))
        sample = numpy.add(sample, pos)
        xcoor = math.floor(sample.item(0) / cellsize)
        ycoor = math.floor(sample.item(1) / cellsize)
        zcoor = math.floor(sample.item(2) / cellsize)
        attemptindex = xcoor + nrofx * (ycoor + nrofy * zcoor)
        if attemptindex >= 0 and attemptindex < nrofx * nrofy * nrofz and     numpy.all([sample, default]) == True and xcoor > 0 and ycoor > 0 and zcoor > 0 :
            test = True
            for testx in range(-1,2):
                for testy in range(-1, 2):
                    for testz in range(-1, 2):
                        testindex = (xcoor + testx) + nrofx * ((ycoor + testy) + nrofy * (zcoor + testz))
                        if testindex >=0 and testindex < nrofx * nrofy * nrofz :
                            neighbour = grid[testindex]
                            if numpy.all([neighbour, sample]) == False:
                                if numpy.all([neighbour, default]) == False:
                                    distance = numpy.linalg.norm(sample - neighbour)
                                    if distance > mindis:
                                        test = False
            if test == True and len(active)<len(grid):
                found = True
                grid[attemptindex] = sample
                active.append(sample)
    if found == False:
        del active[randindex]

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

我的代码似乎永远存在。 因此我尝试在while循环的最后一个中添加一个print(len(active))。 令人惊讶的是,我认为我发现了这个错误,因为活动列表的长度不断增加! (它应该与网格的长度相同)我认为问题是由active.append()引起的,但我无法弄清楚问题出在哪里,因为代码实际上是90%与一个由希夫曼先生制作的。 我不想搭便车,但我已经一次又一次地检查,同时一次又一次地纠正这个代码:(。仍然,我不知道bug在哪里。(为什么主动[]继续追加! ?) 谢谢宝贵的时间。

0 个答案:

没有答案