我是编程新手,所以我希望我的愚蠢问题不会让你烦恼。 我现在正在尝试使用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在哪里。(为什么主动[]继续追加! ?) 谢谢宝贵的时间。