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;
}
显然我的代码不能按预期工作。任何想法欢迎。
'显然我代码不能按预期工作'请阐述。 – zimdanen