02/14 - 두 사각형 겹침의 판단

JUSTICE_DER·2023년 2월 14일
0

UNSEEN

목록 보기
4/6

두 사각형 영역 AABB의 겹침을 판정하는 함수의 작성

그래도 바로 직전에 벡터, 행렬을 봤기에,
Min/Max라는 벡터가
각각 원점으로부터 사각형의 왼쪽 아래/오른쪽 위에 해당하는 좌표값인 것을 유추할 수 있었다.

문제인것은
Vector2라는 것이 C++에 존재하는 라이브러리일까 찾아보았는데
없다는 것이다.

유니티를 기준으로 프로그램을 짜는 코드일듯 하다.
그렇지 않다면, Vector2 구조체를 정의하고,
x,y멤버를 설정해야할 것이다.

그래서 두 사각형 영역이 겹치는지를 판단해야하는데,
Intersect로 Rectangle구조체를 하나만 받는다는 것은,

Rectangle 객체 r1과 r2를 만들고,
r1.Intersect(r2);를 하는 구조인 것 같다.

해보자


#include <string>
#include <iostream>
using namespace std;

//구조체 기본 필드는 public이지만, 생성자 구분을 위해 사용
struct Vector2 {
	int x;
	int y;
public:
	Vector2() : x(1), y(1) {
		//기본생성자
		std::cout << "wht???\n";
	}

	Vector2(int tx, int ty) : x(tx), y(ty) {
		std::cout << x << "\n" << y << "\n";
	}
};

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;
	}
	Vector2 Min; //사각형 왼쪽 아래
	Vector2 Max; //사각형 오른쪽 위

public:
	Rectangle() {
		//기본생성자
	}

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



int main()
{
	Rectangle* r1 = new Rectangle(0, 0, 3, 3);
	Rectangle* r2 = new Rectangle(1, 1, 2, 2);
	if (r1->Intersect(*r2)) {
		std::cout << "Intersected!!!!!\n";
	}
	else {
		std::cout << "No_Problem.\n";
	}
		
	return 0;
}


//정말 도움이 된 사이트 
//https://qna.programmers.co.kr/questions/289/%EB%91%90-%EC%82%AC%EA%B0%81%ED%98%95%EC%9D%B4-%EA%B2%B9%EC%B9%98%EB%8A%94%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

위처럼 작성했는데 오류를 발견했다.
Rectangle객체를 생성할 때, 자동으로 Min,Max라는 Vector2객체를 생성하고,
해당 객체는 기본생성자에 의해서 1,1의 값을 가진채로 만들어지게 되는데,
만들어지고서 new를 통해 다른 자료형의 Min으로 생성한게 원인이었다.
모든 Rectangle객체의 Min, Max값에 1,1이 들어갔다.

내일 차근차근 수정해보자.

profile
Time Waits for No One

0개의 댓글