02/15 - 두 사각형의 겹침 수정

JUSTICE_DER·2023년 2월 15일
0

UNSEEN

목록 보기
5/6

수정이 필요했던 코드 부분

    //4개의 정수를 받아 자동으로 초기화
	Rectangle(int x1, int y1, int x2, int y2) {
		Vector2* Min = new Vector2(x1, y1);
		Vector2* Max = new Vector2(x2, y2);
	}

Rectangle의 생성자에서 문제가 있었고,
해당 부분에서 Vector2객체를 새로 만드는 실수를 했다는 것을 깨닫고,
기존 Rectangle의 Vector2 Min, Max지역변수객체를 매개변수를 넣어 수정하는 방식으로 고쳤다.

	Rectangle(int x1, int y1, int x2, int y2) {
		Min = { x1, y1 };
		Max = { x2, y2 };

지금 생각해보니 너무 멍청한 실수를 한 것 같다.
오전 10시부터 오후10시까지 강의를 듣고 바로 코딩을 하려니 문제였던 것일까

그래서 코드는 정상동작하는데,
과연 겹침을 판단하는 조건문이 맞을까 검증도 해봐야할 것 같다.

//겹침의 기준?
	bool Intersect(Rectangle InRectangle) {
		//원래의 왼쪽아래가 추후의 오른쪽위보다 크다면,
		if (Min.x >= InRectangle.Max.x && Min.y >= InRectangle.Max.y) {
			return false;
		}
		//원래의 오른쪽위가 추후의 왼쪽아래보다 작다면,
		else if (Max.x <= InRectangle.Min.x && Max.y <= InRectangle.Min.y) {
			return false;
		}
		return true;
	}

위처럼 작성하였다.

주석에서 원래라는 것은 기준이 되는
Intersect를 호출할 Rectangle 객체이고,

추후라는 것은, Intersect에 매개변수로 들어온 Rectangle 객체이다.

그래서 원래추후는 각각 Min, Max 벡터를 가지고 있다.
여기서 Min은, 왼쪽 아래의 점, Max는 오른쪽 위의 점이다.
그래서 해당 2개 점의 좌표를 가지고 사각형을 의미하는 것이다.

그래서 겹치지 않는 조건을 기준으로 보았을 때,
(원래를 A, 추후를 B라고 본다면,)
1. A의 왼쪽아래가 B의 오른쪽 위보다 크다면,

위처럼 절대 겹칠일이 없을 것이다.
하지만 여기서 부수적인 생각이 든다.
1-1. A의 왼쪽 아래의 x좌표만 크고, y좌표가 B의 오른쪽 위보다 작으면?
그대로 내려오므로 겹치진 않을 것이다.
1-2. 같은 형식으로, y좌표만 크고, x좌표가 B의 오른쪽 위보다 작다면?
그대로 왼쪽으로 A가 옮겨지긴하지만, 겹치진 않을 것이다.

Min.x >= InRectangle.Max.x && Min.y >= InRectangle.Max.y

그렇다면 이로써 해당 조건의 &&연산은 필요가 없다고 판단된다.
하나만 만족시켜도 겹치지 않으므로 || 연산으로 수정을 해야한다.

1-3. 좌표값이 겹치는건 상관이 없을까?
식을 보면 >=로 연산중인데,
기존 &&를 사용한 조건에서는 해당 좌표값이 서로 같아도 상관이 없었다.
그 이유는, 같아봤자 A의 왼쪽아래, B의 오른쪽위인
한 꼭짓점만 닿아있는 모양이기 때문이다.
그렇다면 ||로 수정한 논리에서의 >=는 사용해도 될까?

A의 Min.x와 B의 Max.x가 같은경우,
하지만 A의 Min.y가 B의 Max.y보다 작은경우를 생각해보면 되겠다.

이렇게 될 것이다. 겹치지 않는다.
그러므로 >=도 가능하다.


struct Rectangle {
	//겹침의 기준?
	bool Intersect(Rectangle InRectangle) {
		//원래의 왼쪽아래가 추후의 오른쪽위보다 크다면,
		if (Min.x >= InRectangle.Max.x || Min.y >= InRectangle.Max.y) {
			return false;
		}
		//원래의 오른쪽위가 추후의 왼쪽아래보다 작다면,
		else if (Max.x <= InRectangle.Min.x || Max.y <= InRectangle.Min.y) {
			return false;
		}
		return true;
	}

그렇게 위의 코드로 수정하였다.

test1)
A - (0,0)/(3,3)
B - (1,1)/(2,2)
위의 경우 무조건 포함되므로

겹쳤다는 코드가 나온다.

test2)
A - (1,1)/(3,3)
B - (3,3)/(5,5)

포함되지 않는다.

test case가 적지만..
다른 반례가 생각이 나지 않는다.
일단 완성이다?!

profile
Time Waits for No One

0개의 댓글