배열에 담아놓고 현재 위치의 값과 그 다음값 또는 이전값을 사용해서 뭔가 하는 일이 자주 있다.
한쪽 방향으로만 가면 평소처럼 하면 되는데 방향이 변하는 경우가 있어서 방향에 상관없이 사용할 수 있는 문장을 만들었다.
상황
- 배열에는 다각형의 점들이 들어있다
- 다각형의 두 점을 선택하여 직선(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]);
'백엔드 > C#' 카테고리의 다른 글
Arrays.asList UnsupportedOperationException (0) | 2018.06.10 |
---|---|
'312e8a59-2712-48a1-863e-0ef4e67961fc' 페이지가 없습니다. (0) | 2018.06.08 |
자주 쓰는 단축키 (0) | 2018.06.04 |
엑셀파일 읽기 (0) | 2018.05.13 |
파일 경로 찾기 - OpenFileDialog (0) | 2018.05.13 |
댓글