有没有办法做一个 3D 阵列的横截面?
我的意思是:沿 Z 轴切割阵列,以便获得 X 轴和 Y 轴的 2D 平面。
我需要这样做,以便可以将它们作为单独的部分存储ArrayList
在List
.
谢谢。
有没有办法做一个 3D 阵列的横截面?
我的意思是:沿 Z 轴切割阵列,以便获得 X 轴和 Y 轴的 2D 平面。
我需要这样做,以便可以将它们作为单独的部分存储ArrayList
在List
.
谢谢。
我不确定 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];
}
}
}
这取决于你的Z轴是什么:
如果你说有
var array = new int[]{xAxiss1, yAxiss1, zAxiss1, xAxiss2, yAxiss2, zAxiss2...}
.
因此,如果您想在 XY 维度上对该数组进行切片,只需从中选择第一个和第二个元素。
希望这可以帮助。
SomeType[,,]
如果你有一个三阶数组,那么垂直于你的 z 轴(即平行于 xy 平面)的切割很容易通过固定一个z
(你希望你的切割所在的“高度”)并让x
它们y
穿过它们范围。
例如
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];
}
}
}
补充: 如果您要切入 YZ 方向,则可以利用 foreach 遍历多维数组的顺序(C# 语言规范版本 4.0 中的第 8.8.4 节结束):
static IEnumerable<SomeType> CutInYZDrection(SomeType[,,] threeDimArr, int xValue)
{
int oneLayer = threeDimArr.GetLength(1) * threeDimArr.GetLength(2);
return threeDimArr.Skip(xValue * oneLayer).Take(oneLayer);
}