VPython 分形:无法创建形状数组
VPython fractal: Can't create an array of shapes
我正在尝试使用 VPython 创建 menger 海绵。
我毫无问题地构建了基础部分(下图),我正在尝试创建一个阵列,其中填充了相同配置的基础部分。
但是,我无法让它工作。显示没有改变,仍然只显示一件基础件。
代码如下:
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
),而它应该是范围(<b>-L</b>, 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))
我正在尝试使用 VPython 创建 menger 海绵。
我毫无问题地构建了基础部分(下图),我正在尝试创建一个阵列,其中填充了相同配置的基础部分。 但是,我无法让它工作。显示没有改变,仍然只显示一件基础件。
代码如下:
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
),而它应该是范围(<b>-L</b>, 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))