c#圆形展平数组

时间:2013-01-08 12:37:04

标签: c# arrays flatten circular-buffer

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

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

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++ )
                {

所以我想优先考虑展平列表中的y坐标,以便我的线性y坐标读/写性能更好。

我在这里进一步发现了一些有趣的read,其中他基本上使用圆形展平数组(是的,我也需要我的数组为圆形)。

要计算指向x,y,z坐标的指针,他使用以下函数;

Public Shared Function GetPTR(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer

    Dim bx, bz As Integer

    bx = x Mod BlockBuffWidth
    If bx < 0 Then
      bx += BlockBuffWidth
    End If
    bz = z Mod BlockBuffWidth
    If bz < 0 Then
      bz += BlockBuffWidth
    End If

    Return bx * BMX + bz * BMZ + y

  End Function

我真的不确定他如何计算BlockBuffWidth,BMX和BMZ。

以下代码是我提出的;

/// <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;
}

显然我的代码没有按预期工作。欢迎任何想法。

1 个答案:

答案 0 :(得分:0)

所以:

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

您可以,但是您希望将y值彼此相邻,并xz

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

HEIGHT = max y + 1