Python .append, кажется, работает вечно, и "равномерное" значение кажется не слишком случайным (создание распределения пуассоновской сферы в Python)

Сейчас я пытаюсь вычислить распределение сферы Пуассона (3D-версию диска Пуассона), используя python, а затем подключить результат к 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(), но я не могу понять, в чем проблема, поскольку код буквально на 90% совпадает с кодом, созданным мистером Шиффманом.

Я не хочу бесплатно ездить на этом, но я уже проверял снова и снова, исправляя снова и снова этот код:(. Тем не менее, я не знаю, где ошибка. (Почему active[] продолжает добавляться!?)

Спасибо за драгоценное время.

0 ответов

Другие вопросы по тегам