2013-01-08 72 views
2

我想将(x,y,z)坐标的3维数组展平成一个平坦的数组。c#圆形展平阵列

所以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; 
} 

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

+0

'显然我代码不能按预期工作'请阐述。 – zimdanen

回答

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