SoftWare_API_MFC

MFC CRect 클래스의 IntersectRect 함수에 대해서

건실한청년 2021. 2. 5. 15:28

MFC의 CRect 클래스는 Left, Top, Right, Bottom 등의 네 개 포인트 좌표점을 멤버로 가진다.

네 개의 포인트 좌표점은 사각 영역을 구성하기 위한 요소이다.

Left와 Right는 X좌표축에 대한 위치값이고, Top, Bottom은 Y좌표축에 대한 위치값이다.

 

IntersectRect 함수는 두 개의 CRect 클래스형 인스턴스에 대해서 동작한다.
IntersectRect 함수는 두 개의 파라미터를 필요로 하는데, 이 중 앞의 파라미터로 전달된 CRect 영역과 뒤의 파라미터로 전달된 CRect 영역이 교차되는 영역을 구한다.
CRect::IntersectRect @import url(MS-ITS:dsmsdn.chm::/html/msdn_ie4.css);

CRect::IntersectRect

BOOL IntersectRect( LPCRECT lpRect1, LPCRECT lpRect2 );

intersect 는 사전적 의미로 <선, 면 등이> 교차하다, 엇갈리다 라는 뜻을 가지고 있다.

다음 세 가지 케이스는 IntersectRect 의 동작을 확인하기 위한 케이스이다.

 

 

각 케이스마다 두 개의 사각 영역이 사용된다. 각 케이스는

① 큰 영역이 작은 영역을 완전히 포함하고 있는 경우,
② 큰 영역과 작은 영역의 일부가 겹치는 경우,
③ 큰 영역과 작은 영역이 전혀 겹치지 않는 경우
이다.

 

세 가지 케이스에 대해서 IntersectRect 함수를 사용한 예제코드는 다음과 같다.

① 큰 영역이 작은 영역을 완전히 포함하고 있는 경우,

 

CRect rectWindow(0,0,100,100); 
CRect rectTest1(20,20,80,80); 

CRect rectDiff; 
BOOL bResult = rectDiff.IntersectRect(&rectWindow, &rectTest1); 

 

② 큰 영역과 작은 영역의 일부가 겹치는 경우,

 

CRect rectWindow(0,0,100,100);
CRect rectTest2(20,80,80,120);

CRect rectDiff;
BOOL bResult = rectDiff.IntersectRect(&rectWindow, &rectTest2);

 

③ 큰 영역과 작은 영역이 전혀 겹치지 않는 경우

 

CRect rectWindow(0,0,100,100);
CRect rectTest3(20,120,80,180);

CRect rectDiff;
BOOL bResult = rectDiff.IntersectRect(&rectWindow, &rectTest3);

 

 

각 케이스에서 눈여겨봐야 할 결과값은 bResultrectDiff 의 값이다.

첫 번째 케이스의 경우 큰 영역이 작은 영역을 포함한다.
이 경우 IntersectRect 함수의 리턴값 bResult 는 TRUE이다. 즉, 함수 실행이 성공하였음을 의미한다.
rectDiff 의 값은 left, top, right, bottom 의 순서대로 20, 20, 80, 80 이다. 이 값은 두 번째 파라미터로 전달된 작은 사각 영역의 좌표값과 같은 값이다.

 

즉 첫 번째 파라미터로 전달된 큰 범위의 영역과 두 번째 파라미터로 전달된 작은 범위의 영역이 서로 교차된 영역인 작은 범위의 사각 영역이 구해지는 것이다.

 

두 번째 케이스는 두 사각 영역의 일부만이 겹쳐진 형태이다.
이 경우 IntersectRect 함수의 리턴값은 TRUE이다. 역시 함수 실행이 성공하였음을 의미한다.
rectDiff 의 값은 left, top, right, bottom 의 순서대로 20, 80, 80, 100 이다. 이 값은 아래 그림에서 확인할 수 있듯이 겹친 영역이다.

 

세 번째 케이스는 두 사각 영역이 전혀 겹치지 않는 경우이다.
이 경우 IntersectRect 함수의 리턴값은 FALSE 이다. 즉 함수 실행이 실패하였음을 의미한다.
rectDiff 의 값은 0, 0, 0, 0 이다. 이 경우 rectDiff.IsRectEmpty() 또는 rectDiff.IsRectNull() 함수의 리턴값은 TRUE 이다.
세 번째 케이스에서와 같이 겹치는 영역이 존재하지 않는 경우를 확인할 수 있는 방법은
IntersectRect 함수의 리턴값이 FALSE 인 경우를 확인하거나
IsRectEmpty 또는 IsRectNull 함수를 사용하여 IntersectRect 함수의 실행으로 구해진 사각 영역이 비어있음을 확인하는 것이다.

 

참고링크 : ~☆~ 우하하!!~ 개발블로그 :: MFC CRect 클래스의 IntersectRect 함수에 대해서 (tistory.com)