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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在一维数组中“扁平化”或“索引” 3D数组?相关的知识,希望对你有一定的参考价值。

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

Tiles[x + y * WIDTH]

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

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

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

答案

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

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

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

另一答案

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

另一答案

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

另一答案

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

另一答案

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

另一答案

正确的算法是:

另一答案

TL; DR

另一答案

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

另一答案

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

以上是关于如何在一维数组中“扁平化”或“索引” 3D数组?的主要内容,如果未能解决你的问题,请参考以下文章

从 3D Numpy 数组的一维切片 [重复]

扁平化数组,多维数组变一维数组

Julia:扁平化数组/元组数组

数组扁平化的五种方法

3D 阵列(1D 平面)索引

php中一维或多维数组去除重复项