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))