Добавление логического массива

Хорошо, я новичок в программировании, и это может быть то, что все знают...

Я создаю игру, и одна из функций, которые я собираюсь добавить, - это трехмерная карта комнаты, которую я планирую создать с помощью кода. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно добавить логический массив или как он там вызывается, не зная, сколько элементов он будет содержать. Вот код теста и проблема, выделенная.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import random as rd

x,y,z = np.indices((8,8,8))

Lines = []

#Random straight lines
for i in range(4):
    rd.choice([
    Lines.append((x == rd.randint(0,8)) & (y == rd.randint(0,8))),
    Lines.append((y == rd.randint(0,8)) & (z == rd.randint(0,8))),
    Lines.append((x == rd.randint(0,8)) & (z == rd.randint(0,8))),
    ])
cols.append('r')

Voxels = Lines[0] | Lines[1] | Lines[2] | Lines[3] #I need to generate this 
#not Hard code it
colors = np.empty(Voxels.shape, dtype=object)
for i in range(len(Lines)):
    colors[Lines[i]]= 'r'

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.voxels(Voxels, facecolors = colors, edgecolor='c')

plt.show()

Любая помощь будет оценена.

2 ответа

Решение

То, что вы пытаетесь сделать со своей исходной строкой, будет равно:

Voxels = Lines[0] | Lines[1]
Voxels = Voxels | Lines[2]
Voxels = Voxels | Lines[3]

Поскольку операции выполняются слева направо. Используя круглые скобки, это будет выглядеть так:

Voxels = (((Lines[0] | Lines[1]) | Lines[2]) | Lines[3])

Итак, вместо того, чтобы делать...

Voxels = Lines[0] | Lines[1] | Lines[2] | Lines[3]

Ты должен сделать...

Voxels = Lines[0]
for line in Lines[1:4]:
    Voxels = Voxels | line

И если вы хотите сделать больше, чем 4 первые строки, вы можете просто сделать for line in Lines[1:], Я сделал это вначале, и меня это не впечатлило, чтобы я не получил тот же результат, что и исходный пример с жестким кодом.

Хорошо, изначально я обошел проблему, рисуя линии индивидуально в порядке списка.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import random as rd
W = 15
H = 15
D = 15
NoPlane = 5
NoLine = 10

Lines = []
Planes = []
Cubes = []
Spheres = []

x,y,z = np.indices((W,H,D))
#Random straight lines| Lines only run up and down
for i in range(NoLine):
    Lines.append(
        (x == rd.randint(0,W)) & (y == rd.randint(0,D)) & (z >= 
    rd.randint(0,int(H/2))) & (z <= rd.randint(int(H/2),D))
        )


#random Levels| Levels run horosontaly
for i in range(NoPlane):
    Planes.append((z == rd.randint(0,H)) & (x >= rd.randint(0,int(W/2))) & 
    (z <= rd.randint(int(W/2),W)))

fig = plt.figure()
ax = fig.gca(projection='3d')
#Draw each thing individualy instead of all at once
for i in range(len(Lines)):
    ax.voxels(Lines[i], facecolors = 'r', edgecolor='c')
for i in range(len(Planes)):
    ax.voxels(Planes[i], facecolors = 'b', edgecolor='r')

ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
plt.show()

Но этот метод слишком грубый.

Другие вопросы по тегам