如何在一维数组中“扁平化”或“索引” 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数组?的主要内容,如果未能解决你的问题,请参考以下文章