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

1

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

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



Изображение 174551



Вот код:

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

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

  • 0
    Но тогда fract это список списков ...
  • 0
    Кроме того, ваш range(L, L+1) фактически только повторяет единицы .
Теги:
fractals
vpython

1 ответ

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))
  • 0
    Спасибо за разъяснения. Я планировал превратить вторую часть в рекурсивную функцию с переменной n, представляющей глубину. Но это кажется намного более сложным, чем я первоначально думал с обновленным кодом. Есть ли у вас какие-либо советы, как мне поступить? Еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню