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;
}
または、コピーを作成するのではなく、元の配列を単純にクエリする 2 次元インデクサーを使用してラッパー クラスを実装することもできます。ただし、配列固有のメソッドは失われます。
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次元でスライスする場合は、その中から1番目と2番目の要素を選択するだけです。
お役に立てれば。
SomeType[,,]
ランク 3の配列がある場合、z 軸に垂直な(xy 平面に平行な) カットは、1 つ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);
}