MFC_C++ 배열
2026. 3. 3. 00:13

 

 

 

 

 

 

 

 

 

 

 

 

 

🌟 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