🌟 2D 이미지 → 1D 배열 인덱스 찾기
핵심 개념
2D 이미지는 메모리에 1D 배열로 저장된다.
예를 들어 3 X 3 이미지는 이렇게 생겼지만
1 2 3
4 5 6
7 8 9
메모리에는 이렇게 한 줄로 저장된다.
인덱스: 0 1 2 3 4 5 6 7 8
값: 1 2 3 4 5 6 7 8 9
인덱스 찾는 수식
인덱스 = m_nWidth * nH + nW
- nH = 몇 번째 줄인지
- nW = 그 줄에서 몇 번째 칸인지
- m_nWidth = 가로 길이
왜 이 수식인가?
줄이 바뀔 때마다 가로 길이(m_nWidth)만큼 인덱스가 건너뛰어진다.
nH=0 줄 시작 → m_nWidth * 0 = 0
nH=1 줄 시작 → m_nWidth * 1 = 3
nH=2 줄 시작 → m_nWidth * 2 = 6
거기서 nW칸 더 가면 원하는 위치가 된다.
예시: nH=1, nW=2 (숫자 6을 찾고 싶을 때)
줄 시작 위치 = 3 * 1 = 3
거기서 2칸 더 = 3 + 2 = 5번 인덱스
🌟 상하반전
상하반전
상하반전은 nW는 그대로, nH만 뒤집는 것이다.
1 2 3 ← nH=0 줄 → nH=2 줄로
4 5 6 ← nH=1 줄 → nH=1 줄로 (그대로)
7 8 9 ← nH=2 줄 → nH=0 줄로
nH를 뒤집는 수식
m_nHeight - nH - 1
nH=0 → 3 - 0 - 1 = 2 (맨 위 → 맨 아래)
nH=1 → 3 - 1 - 1 = 1 (가운데 → 그대로)
nH=2 → 3 - 2 - 1 = 0 (맨 아래 → 맨 위)
상하반전 인덱스 수식
기본 수식 m_nWidth * nW + nW에서 nH 자리만 뒤집으면
m_nWidth * (m_Height - nH - 1) + nW
🌟 좌우반전
좌우반전
좌우반전은 nH는 그대로, nW만 뒤집는 것이다.
1 2 3 → 3 2 1
nW=0 → nW=2로
nW=1 → nW=1로 (그대로)
nW=2 → nW=0으로
nW를 뒤집는 수식
n_nWidth - nW - 1
nW=0 → 3 - 0 - 1 = 2 (맨 왼쪽 → 맨 오른쪽)
nW=1 → 3 - 1 - 1 = 1 (가운데 → 그대로)
nW=2 → 3 - 2 - 1 = 0 (맨 오른쪽 → 맨 왼쪽)
좌우반전 인덱스 수식
기본 수식 m_nWidth * nH + nW에서 nW 자리를 뒤집으면
m_nWidth * nH + (m_nWith - nW - 1)
🌟 90도 회전 (시계방향)
90도 회전
90도 회전은 가로 세로 크기가 바뀐다!
- 원본: 가로 m_Width, 세로 m_nHeight
- 결과: 가로 m_nHeight, 세로 m_nWidth
그래서 nRotateWidth = m_nHeight, nRotateHeight = m_nWidth
왜 nW가 앞, nH가 뒤?
원본 수식: m_nWidth * nH + nW
- 행(nH)으로 줄을 찾고, 열(nW)로 칸을 찾는다
90도 회전하면 행과 열이 뒤바뀌므로
- 열(nW)로 줄을 찾고, 행(nH)으로 칸을 찾는다.
그래서 nW가 앞으로, nH가 뒤로!
nH가 뒤집히는 이유
원본의 맨 윗 줄(nH = 0)이 결과인 맨 오른쪽 열로 가야 하기 때문에 nH를 뒤집어준다.
(m_nHeight - nH - 1)
90도 회전 인덱스 수식
nRotateWidth * nW + (m_nHeight - nH - 1)
🌟 180도 회전
180도 회전
180도 회전 = 상하반전 + 좌우반전을 동시에!
원본: 상하반전: 180도(+좌우반전):
1 2 3 7 8 9 9 8 7
4 5 6 4 5 6 6 5 4
7 8 9 1 2 3 3 2 1
수식 유도
상하반전: nH 뒤집기 → (m_nHeight - nH - 1) / 좌우반전: nW 뒤집기 → (m_nWidth - nw - 1)
둘 다 동시에 적용하면
180도 회전 인덱스 수식
m_width * (m_nHeight - nH - 1) + (m_nWidth - nW - 1)
🌟 270도 회전
270도 회전
270도 회전도 90도처럼 가로 세로가 버뀐다.
그리고 90도와 반대로 nW를 뒤집어서 줄을 찾고, nH로 칸을 찾는다.
원본: 270도:
1 2 3 3 6 9
4 5 6 2 5 8
7 8 9 1 4 7
패턴 찾기
nW가 1 늘어날 때마다 결과 인덱스가 nRotateWidth씩 줄어든다. → nRorateWidth * (m_nWidth- nW - 1)
nH사 늘어날때마다 결과 인덱스가 1씩 늘어난다. → + nH
90도와 비교
- 90도: nRotateWidth * nW + (m_nHeight - nH - 1) → 뒤집힌 nH로 칸 찾기
- 270도: nRotateWidth * (m_nWidth- nW - 1) + nH → 뒤집힌 nW로 줄 찾기
270도 회전 인덱스 수식
nRotateWidth * (m_nWidth - nW - 1) + nH
🌟 최종 수식
- 기본: m_nWidth * nH + nW
- 상하반전: m_nWidth * (m_nHeight - nH - 1) + nW → nH만 뒤집기
- 좌우반전: m_nWidth * nH + (m_nWidth - nW - 1) → nW만 뒤집기
- 180도: m_nWidth * (m_nHeight - nH - 1) + (m_nWidth - nW - 1) → 둘 다 뒤집기
- 90도: nRotateWidth * nW + (m_nHeight - nH - 1) → 행열 바꾸고 nH 뒤집기
- 270도: nRotateWidth * (nRotateWidth - nW - 1) + nH → 행열 바꾸고 nW 뒤집기

'MFC_C++ > Task' 카테고리의 다른 글
| MFC_C++ 스레드 (Thread) (0) | 2026.04.20 |
|---|---|
| MFC_C++ 멀티바이트 vs 유니코드 (0) | 2026.04.03 |
| MFC_C++ CallBack (0) | 2026.03.27 |
| MFC_C++ 윈도우 계산기 리펙토링 (0) | 2026.03.19 |