2012-08-22 4 views
0

3D 배열의 단면을 만드는 방법이 있습니까?3D 배열의 단면

의미 : X 축과 Y 축의 2D 평면을 얻을 수 있도록 Z 축을 따라 배열을 자릅니다.

ArrayList 또는 심지어 List에 개별 섹션으로 저장할 수 있도록이 작업을 수행해야합니다.

감사합니다. 그것은 축이 당신의 Z 무엇인지에 따라 달라집니다

+1

3d 배열을 정의하는 데 사용중인 데이터 구조를 표시하십시오. – logicnp

+1

옵션 인 경우 지그재그 형 배열을 대신 사용할 수 있습니다 (예 :'int [] [,]'). – phg

답변

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; 
} 

을, 당신 원래 배열을 쿼리하는 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]; 
     } 
    } 
} 
+0

좋아, 그게 바로 내 머리에 터진 정확히 어떻게 내가 이것을 게시 ... 바보 같은 두뇌, * 공황, 공황 * 게시물 질문 * * 브레인은 대답을 찾는다 * –

+1

하하, 나는 우리 모두가 생각했습니다. 거기 :) – Rawling

1

:

당신은

var array = new int[]{xAxiss1, yAxiss1, zAxiss1, xAxiss2, yAxiss2, zAxiss2...}가 있다고 가정합니다.

슬라이스 XY dimmension에서이 배열을 원한다면 첫 번째와 두 번째 요소를 선택하십시오.

희망이 도움이됩니다. 당신이 뭔가 자신 구현해야 할 것이다, 그래서

+0

감사합니다. 직접 해결했습니다. : D –

1

는 랭크 세 배열 SomeType[,,] 경우에 Z 축 (즉 XY 평면 토륨에 평행) 한 z (이하 "높이"원하는 고정함으로써 용이하게되어 수직 한 다음 잘라 이 있으면 자르며) xy이 범위를 통과하게합니다. 예를

를 들어

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]; 
    } 
    } 
} 

ADDITION : 대신 YZ 방향으로 절단한다면, 당신은 foreach는 다차원 배열 (§8.8의 끝을 통과하는 순서를 활용할 수 있습니다. C# 언어 사양 버전 4.0의 4) :

static IEnumerable<SomeType> CutInYZDrection(SomeType[,,] threeDimArr, int xValue) 
{ 
    int oneLayer = threeDimArr.GetLength(1) * threeDimArr.GetLength(2); 
    return threeDimArr.Skip(xValue * oneLayer).Take(oneLayer); 
} 
+0

답장을 보내 주셔서 감사합니다 이것은 다른 사람들을 돕기를 바랍니다. 왜냐하면 제 두뇌가 지체되어서 내가 그것을 게시 한 것처럼 해결할 수 있기 때문입니다! –

+0

@Jeppe 이렇게하면 조각을 단일 차원으로 병합합니다. – Rawling

+0

@ Rawling 네, 원래 포스터는 그가 "목록"(1 차원으로 보간)에 관해 이야기했기 때문에 원했을 것이라고 생각했습니다. –

관련 문제