VPython fractal: невозможно создать массив фигур

Я пытаюсь создать губку Менгера, используя VPython.

Я без проблем построил базовый элемент (изображение ниже) и пытаюсь создать массив, заполненный базовым элементом в той же конфигурации. Тем не менее, я не могу заставить его работать. Дисплей не меняется и по-прежнему показывает только одну базовую часть.





Вот код:

from vpython import *

l,w,h = 1,1,1

cubes = []
def basePiece():
    L = 1
    for i in range(-L,L+1):
        for j in range(-L,L+1):
            for k in range(-L,L+1):
                sum = abs(i) + abs(j) + abs(k)
                if sum > 1:
                    cube=box(color=vector(1,1,1), opacity=0.9,
                            pos=vector(i,j,k),
                            length=l, height=h, width=w)
                    cubes.append(cube)
    return cubes

fract = []
L = 1
for x in range(L,L+1):
    for y in range(L,L+1):
        for z in range(L,L+1):
            sum = abs(x) + abs(y) + abs(z)
            if sum > 1:
                fract.append(basePiece())

Любая помощь будет оценена.
Заранее спасибо.

1 ответ

Решение

Проблема в том, что вы написали range(L, L+1), что означает, что итератор принимает только одно значение (L), тогда как это должно быть range(-L, L+1), Другая проблема заключается в том, что вы должны расширять список, а не добавлять, так как в противном случае вы создаете списки списков (хотя это, вероятно, менее проблемно):

fract = []
L = 1
for x in range(-L,L+1):
    for y in range(-L,L+1):
        for z in range(-L,L+1):
            sum = abs(x) + abs(y) + abs(z)
            if sum > 1:
                fract.extends(basePiece())

Так что нет, это будет работать для:

x=-1, y=-1, z=-1
x=-1, y=-1, z= 0
x=-1, y=-1, z=+1

x=-1, y= 0, z=-1
x=-1, y= 0, z=+1

x=-1, y=+1, z=-1
x=-1, y=+1, z= 0
x=-1, y=+1, z=+1

x= 0, y=-1, z=-1
x= 0, y=-1, z=+1

x= 0, y=+1, z=-1
x= 0, y=+1, z=+1

x=+1, y=-1, z=-1
x=+1, y=-1, z= 0
x=+1, y=-1, z=+1

x=+1, y= 0, z=-1
x=+1, y= 0, z=+1

x=+1, y=+1, z=-1
x=+1, y=+1, z= 0
x=+1, y=+1, z=+1

Если вы используете range(1, 1+1)Хватит x = y = z = 1и, следовательно, он будет напечатан один раз.

Однако этого по- прежнему недостаточно: вам нужно уметь перемещать кубы. Так что параметризируйте basePiece:

из импорта vpython *

l,w,h = 1,1,1

cubes = []
def basePiece(x0, y0, z0):
    L = 1
    for i in range(-L,L+1):
        for j in range(-L,L+1):
            for k in range(-L,L+1):
                sum = abs(i) + abs(j) + abs(k)
                if sum > 1:
                    cube=box(color=vector(1,1,1), opacity=0.9,
                            pos=vector(x0+i,y0+j,z0+k),
                            length=l, height=h, width=w)
                    cubes.append(cube)
    return cubes

а также:

fract = []
L = 1
for x in range(-L,L+1):
    for y in range(-L,L+1):
        for z in range(-L,L+1):
            sum = abs(x) + abs(y) + abs(z)
            if sum > 1:
                fract.extends(basePiece(3*x, 3*y, 3*z))
Другие вопросы по тегам