본문 바로가기
백엔드/C#

배열의 처음과 끝을 연결하기

by 1005ptr 2018. 6. 6.
반응형

배열에 담아놓고 현재 위치의 값과 그 다음값 또는 이전값을 사용해서 뭔가 하는 일이 자주 있다.


한쪽 방향으로만 가면 평소처럼 하면 되는데 방향이 변하는 경우가 있어서 방향에 상관없이 사용할 수 있는 문장을 만들었다.


상황

- 배열에는 다각형의 점들이 들어있다

- 다각형의 두 점을 선택하여 직선(baseLine)을 만들고

- 해당 직선에 인접한 비교할 직선(compareLine)을 만든다.

- 비교할 직선은 조건(p 변수의 값)에 따라 시계방향, 반시계방향의 인접한 직선이 선택된다(direction 값, 1 또는 -1)



            if (p == Position.Start)

            {

                standardIdx = cargoQuad.GetStartIndex(qNum);

                nextIdx = midIdx != points.Count - 1 ? midIdx + 1 : 0;

                direction = -1;

                baseLine = new Line(points[midIdx], points[nextIdx]);

            }

            else if(p == Position.End)

            {

                standardIdx = cargoQuad.GetEndIndex(qNum);

                nextIdx = midIdx != 0 ? midIdx - 1 : points.Count - 1;

                direction = 1;

                baseLine = new Line(points[midIdx], points[nextIdx]);

            }


여기서 direction 값에 따라 배열 index 값이 0미만이 될 수도 있고, 배열의 범위를 초과할 수도 있다.

그래서 0보다 작으면 배열크기만큼 더해주고(0미만 처리)

0보다 클때는 배열크기로 나머지 연산을 한다.(범위 초과 처리)


            for (int i = 0; i < points.Count; i++ )

            { 

            int p1Idx = midIdx + direction * i;

            int p2Idx = midIdx + direction * (i + 1);

            p1Idx = p1Idx < 0 ? p1Idx + points.Count : p1Idx % points.Count;

            p2Idx = p2Idx < 0 ? p2Idx + points.Count : p2Idx % points.Count;


            compareLine = new Line(points[p1Idx], points[p2Idx]);


반응형

댓글