c#从较大的3d数组中选择较小的3d数组

时间:2015-06-23 20:42:20

标签: c#-4.0 xna

我有一个数组(object [,,]),让我们假设参数为x1000,y1000,z * 1000并且表示x,y,z平面上的点矩阵。

在位置:x50,y10,z199,例如我想从父数组中提取另一个包含较小立方体的对象[,,],比如100个立方体的子矩阵(或者任何可用的子空间,如果为空则为空?)使用参考点作为中心点,这是可能的,我希望我能在linq中做到这一点但是却无可救药地丢失了......你将如何解决这个问题...一个虽然是要做以下事情:

1.创建一个新的3d数组,其中包含我想要检索的项目数量(xyz)。

2.迭代每个轴(x,y,z)。

3.将源数组中的值复制到目标数组(offsetX + x,offsetY + y,offsetZ + z)。

4.返回新阵列。

但如果这个被大量调用,我认为它是一个瓶颈,任何人的想法?

1 个答案:

答案 0 :(得分:1)

根据您对较小阵列的使用情况,这可能适合您的需求,也可能不适合您。

要表示数组的子节(块),而不是创建新数组或进行任何复制,您可以编写自己的类,作为视图到该数组块。< / p>

请注意,此示例具有以下属性:

  • 构造函数中没有保护条款
  • 块总是立方体(x,y,z长度相等)
  • 块长度总是奇数(因为我们从参考点扩展)

public static class ArrayChunkExtensions
{
    public static ArrayChunk<T> GetChunk<T>(this T[,,] array, int x, int y, int z, int numToExpand)
    {
        return new ArrayChunk<T>(array, x, y, z, numToExpand);
    }
}

要轻松从数组中获取块,您可以声明一个扩展方法:

Action<int, Action<int, int, int>> iterate = (length, action) =>
{
    for (int x = 0; x < length; x++)
        for (int y = 0; y < length; y++)
            for (int z = 0; z < length; z++)
                action(x, y, z);
};

// Create 5x5x5 parent array.

const int size = 5;
var array = new string[size, size, size];
iterate(size, (x, y, z) => array[x, y, z] = $"x:{x} y:{y} z:{z}");

// Take 3x3x3 chunk from parent array center.

const int indexOfReference = 2;
const int numToExpand = 1;
ArrayChunk<string> chunk = array.GetChunk(indexOfReference, indexOfReference, indexOfReference, numToExpand);
iterate(chunk.Length, (x, y, z) => Console.WriteLine(chunk[x, y, z]));

以下是一个示例用法:

{{1}}