c#圆形展平阵列

c#圆形展平阵列,c#,arrays,flatten,circular-buffer,C#,Arrays,Flatten,Circular Buffer,我正在尝试将(x,y,z)坐标的三维数组展平为展平数组 所以它基本上说解决方案是 elements[x][y][z] = Tiles[x + y*WIDTH + Z*WIDTH*DEPTH] 这对我来说都很好,除了上面的一个在迭代时优先考虑x坐标 问题是,当我迭代数组时,我主要是线性访问y值。给出一个想法,我所有的迭代都是 for (int x = -someXVal; x <= someXVal; x++) { for (int

我正在尝试将(x,y,z)坐标的三维数组展平为展平数组

所以它基本上说解决方案是

elements[x][y][z] = Tiles[x + y*WIDTH + Z*WIDTH*DEPTH]
这对我来说都很好,除了上面的一个在迭代时优先考虑x坐标

问题是,当我迭代数组时,我主要是线性访问y值。给出一个想法,我所有的迭代都是

        for (int x = -someXVal; x <=  someXVal; x++)
        {
            for (int z = -someZVal; z <= someZVal; z++)
            {
                for (int y = -someYVal; y < someYVal; y++ )
                {
for(int x=-someXVal;xSo:

对您来说是可以的,但您希望为相同的
x
z
y
值相邻分组:

elements[x][y][z] = Tiles[y + x*HEIGHT + Z*HEIGHT*DEPTH]

其中
HEIGHT=max y+1

显然我的代码没有按预期工作
请详细说明。
/// <summary>
/// Flatten offset x step to advance next block in x direction.
/// </summary>
public static readonly int XStep = CacheLenghtInBlocks*Chunk.HeightInBlocks;

/// <summary>
/// Flatten offset z step to advance next block in z direction.
/// </summary>
public static readonly int ZStep = Chunk.HeightInBlocks;

public static int BlockIndexByWorldPosition(int x, byte y, int z)
{
    var wrapX = x%CacheWidthInBlocks;
    if (wrapX < 0)
        wrapX += CacheWidthInBlocks;

    var wrapZ = z%CacheLenghtInBlocks;
    if (wrapZ < 0)
        wrapZ += CacheLenghtInBlocks;

    var flattenIndex = wrapX * XStep + wrapZ * ZStep + y;
    return flattenIndex;
}
elements[x][y][z] = Tiles[x + y*WIDTH + Z*WIDTH*DEPTH]
elements[x][y][z] = Tiles[y + x*HEIGHT + Z*HEIGHT*DEPTH]