我正在做一个体素引擎,我的数据每个块都放在3D数组中。要渲染体素,我需要知道哪一个可见,因此它们周围会有Air
块(在我的数据结构中为0)。
因此,我需要找到在左,右,前,后,顶和机器人方向旁边都带有0的所有数字,但我真的不知道该怎么做。
我知道我可以使用循环来做到这一点,但我的目标是尽我所能尽快完成此任务。
例如(二维):
[[0, 0, 0, 0, 0,],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 0]]
必须给我这些索引:
(1,1) (1,2) (1,3)
(2,1) (2,3)
(3,1) (3,4)
(4,1) (4,2) (4,3)
我想获得数组边缘的数字索引,即使周围没有0,因为我可以在块旁边检查是否有
Air
数据。我不知道是否可能,如果不能,如何在不遍历所有数组的情况下渲染可见体素?
谢谢。
(对不起,我的英语,如果您听不懂,请发送评论)
编辑
阅读@Mad_Physicist注释后,我发布了我的未完成方法来循环执行任务(我没有完成任务,因为我正在寻找最快的方法):
matrix = numpy.zeros((10,10,10), dtype="uint8")
# Filling with some random data
for y in range(10):
for z in range(10):
for x in range(10):
matrix[y, z, x] = random.choice((0,1,1)
result = numpy.transpose(numpy.where(matrix == 0))
for num in result.tolist():
u = matrix.item(*num)
# TODO: Check each direction
这种方法的缺点是我有时会传递无用的数据(所有方向的0均为0)。
最佳答案
您可以使用scipy.ndimage.morphology.binary_erosion
:
from scipy.ndimage.morphology import binary_erosion
np.argwhere(arr & ~binary_erosion(arr))
输出:
array([[1, 1],
[1, 2],
[1, 3],
[2, 1],
[2, 3],
[3, 1],
[3, 4],
[4, 1],
[4, 2],
[4, 3]])
关于python - 渲染3D阵列中的可见体素而不进行全部迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48334944/