【问题标题】:VPython fractal: Can't create an array of shapesVPython分形:无法创建形状数组
【发布时间】:2018-07-08 15:30:46
【问题描述】:

我正在尝试使用 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())

任何帮助将不胜感激。
提前致谢。

【问题讨论】:

  • 但是fract 是一个列表列表...
  • 此外,您的 range(L, L+1) 实际上只迭代 ones

标签: python fractals vpython


【解决方案1】:

问题是你写了range(L, L+1),这意味着迭代器只取一个值(L),而它应该是range(<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))

【讨论】:

  • 感谢您的澄清。我打算把第二部分变成一个递归函数,变量 n 代表深度。但它似乎比我最初认为的更新代码要复杂得多。你对我怎么做有什么建议吗?再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多