3d数组的横断面

时间:2012-08-22 11:05:32

标签: c#

有没有办法做3D阵列的横截面?

我的意思是:沿Z轴切割阵列,以获得X轴和Y轴的2D平面。

我需要执行此操作,以便将其存储为ArrayList中的单独部分,甚至可能存储为List

感谢。

3 个答案:

答案 0 :(得分:4)

我不确定C#是否有开箱即用的方式,所以你必须自己实现一些东西:

T[,] SliceThroughZ<T>(T[,,] threeDee, int zIndex)
{
    var xLength = threeDee.GetLength(0);
    var yLength = threeDee.GetLength(1);
    var twoDee = new T[xLength, yLength];
    for (int i = 0; i < xLength; i++)
        for (int j = 0; j < yLength; j++)
            twoDee[i, j] = threeDee[i, j, zIndex];

    return twoDee;
}

或者,您可以使用二维索引器实现一个包装器类,而不是制作副本,而该二维索引器只是查询原始数组。但是,你会失去特定于阵列的方法。

class ZSliceWrapper<T>
{
    public T[, ,] Source { get; set; }
    public int ZIndex { get; set; }

    public T this[int xIndex, int yIndex]
    {
        get // you could even implement a set.
        {
            return Source[xIndex, yIndex, ZIndex];
        }
    }
}

答案 1 :(得分:1)

这取决于你的 Z 轴是什么:

如果你说有

var array = new int[]{xAxiss1, yAxiss1, zAxiss1, xAxiss2, yAxiss2, zAxiss2...}

因此,如果你想在XY dimmension上切割这个数组,只需从中选择第一个和第二个元素。

希望这有帮助。

答案 2 :(得分:1)

如果你有一个等级为3的数组SomeType[,,],那么通过固定一个{{1},可以很容易地将垂直切割到你的z轴(与xy平面平行) (你希望剪切的“高度”)并让zx遍历它们的范围。

例如

y

<强>此外: 如果您改为切入YZ方向,则可以利用foreach遍历多维数组的顺序(C#语言规范4.0版中的§8.8.4结束):

static IEnumerable<SomeType> CutInXYDrection(SomeType[,,] threeDimArr, int zValue)
{
  for (int x = 0; x < threeDimArr.GetLength(0); ++x)
  {
    for (int y = 0; y < threeDimArr.GetLength(1); ++y)
    {
      yield return threeDimArr[x, y, zValue];
    }
  }
}