如何在一维数组中“扁平化”或“索引” 3D数组?

问题描述 投票:30回答:9

我正在尝试将3D阵列扁平化为游戏中“块”系统的1D阵列。这是一个3D块游戏,基本上我希望块系统与Minecraft的系统几乎相同(但是,无论如何,这都不是Minecraft的克隆)。在我以前的2D游戏中,我使用以下算法访问了展平数组:

Tiles[x + y * WIDTH]

但是,由于缺少Z轴,因此这显然不适用于3D。我不知道如何在3D空间中实现这种算法。宽度,高度和深度都是常数(宽度和高度一样大)。

只是x + y*WIDTH + Z*DEPTH吗?我对数学非常不满意,我刚开始进行3D编程,所以我很迷失:|

PS。这样做的原因是,我不断从索引中循环获取东西。我知道一维数组比多维数组要快(由于我不记得:P的原因)。尽管这可能不是必需的,但我希望获得尽可能好的性能:)

c# .net arrays 3d flatten
9个回答
36
投票

算法基本相同。如果您具有3D数组Original[HEIGHT, WIDTH, DEPTH],则可以通过[]将其转换为Flat[HEIGHT * WIDTH * DEPTH]

Flat[x + WIDTH * (y + DEPTH * z)] = Original[x, y, z]

顺便说一句,在.NET中,您应该首选数组数组而不是多维数组。性能差异很大


30
投票

这是Java中的解决方案,可为您提供两种:


24
投票

我认为以上情况需要稍作修正。假设您的HEIGHT为10,WIDTH为90,则一维数组将为900。根据上述逻辑,如果您位于数组9 + 89 * 89的最后一个元素,则显然大于900。正确的算法是:


11
投票

x + y*WIDTH + Z*WIDTH*DEPTH。将其可视化为矩形实体:首先沿x遍历,然后每个y是一条“直线” width步长,而每个z是一个“平面” WIDTH*DEPTH面积步长。


5
投票

您快到了。您需要将Z乘以WIDTH


3
投票

正确的算法是:


3
投票

TL; DR


2
投票

为了更好地理解1D数组中3D数组的描述(我想最佳答案中的深度是Y大小)


0
投票

上面Samuel Kerrien的正向和反向变换几乎是正确的。下面包括一个更简洁的(基于R的)变换图(例如“ a %% b”是表示a除以b的余数的模运算符):

© www.soinside.com 2019 - 2024. All rights reserved.