Я пытаюсь создать губчатую губку, используя 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())
Любая помощь будет оценена по достоинству.
Заранее спасибо.
Проблема в том, что вы написали 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))
fract
это список списков ...range(L, L+1)
фактически только повторяет единицы .