본문 바로가기

C++/API | MFC

07. API 응용 - 소팅과 컬링 + 마름모 피킹

※ 소팅

소팅이란 일반적으로 정렬을 실행하는 작업을 말합니다.

이 포스팅에서는 연산 순서 혹은 출력 순서를 목적에 맞게 지정하는 작업을 뜻합니다. 

소팅 시 퍼포먼스가 뛰어난 퀵 소트를 자주 이용합니다.

 

함수 객체를 지정해 주고 정렬을 실행하여 y축 기준으로 렌더링 순서를 지정하는 모습을 볼 수 있습니다.

 

 

※ 컬링

화면 밖의 필요없는 연산을 줄이기 위해 연산을 시행할 오브젝트를 지정하는 작업을 오브젝트 컬링이라 합니다.

컬링은 구역을 나누어 섹터단위로 지정하는 등 그룹화하여 관리하면 편합니다.

(위 렌더 그룹 리스트 컨테이너(m_listRenderGroup)는 화면 근처의 오브젝트를 넣어 출력하는 중입니다.) 

 

타일의 경우 렌더링 범위 주변 타일만 그리도록 좌표를 통해 비교하여 설정할 수 있습니다.

위 소스의 경우 X좌표에 대해서만 좌표를 뽑아 컬링을 실행한 모습을 볼 수 있습니다.

 

위 그림은 마름모 타일에 대해 렌더링한 모습입니다.

마름모를 배치할 때 마우스 위치에 대해 모든 타일을 순회하여 영역 검사를 시행할 수도 있지만,

마우스 좌표에 인접한 마름모를 뽑아내어 영역 검사를 시행한다면 연산량이 상당히 줄어듭니다.

검은색 사각 영역 안에 있는 좌표에 대해서는 위 마름모 5개에 대해서만 검사를 시행하면 됩니다.

 

영역이 가장 넓은 3번 좌표를 먼저 검사하고 1, 2, 3, 4 순으로 검사를 합니다.

컬링을 하여 수많은 타일을 일일히 순회할 필요성이 사라졌습니다.

 

 

※ 마름모 타일 검사

 

중점으로부터 마우스좌표의 거리 / 마름모의 반지름 의 범위가 1인 경우 마름모 선 위에 점이 존재하게 됩니다.

절대값은 중점으로 부터의 거리와 비례하므로 작을 경우 내부에 위치, 클 경우 외부에 위치함을 알 수 있습니다.

(마름모 방정식은 |x|/a + |y|/b = 1, a는 가로 반지름, b는 세로반지름)

 

 

위 방법은 내적을 이용하여 마름모 검사를 한 것입니다.

(참고용, DirectX9 환경입니다! )