알고리즘
[C/C++] AABB(Axis-Aligned Bounding Box)
yozura
2022. 5. 21. 02:05
반응형
AABB(Axis-Aligned Bounding Box) 는 방향 전환에 대해서 정적인 사각형에 적용될 수 있는 아주 간단한 문제로써 각 사각형의 (x, y) 좌표와 (width, height) 크기, 높이만 알고 있다면 (혹은 x2, y2) 쉽게 구현할 수 있다. 여기서는 x, y 좌표와 width, height 크기, 높이를 이용한 코드를 사용한다.
// 충돌 상태를 확인하는 함수
public bool isCollision(const Rect& A, const Rect& B)
{
if (A.x < B.x + B.width // 1. x
&& A.x + A.width > B.x // 2. x
&& A.y < B.y + B.height // 3. y
&& A.y + A.height > B.y) // 4. y
{
return true; // 충돌 O
}
return false; // 충돌 X
}
1번의 경우 A.x 가 B.x + B.width 보다 작을 경우 true를 반환한다. 이는 B.x + B.width 식이 B의 실질적 width의 마지막 좌표를 구하는 식이기 때문에 A.x가 이보다 작을 경우 B보다 오른쪽에 있음을 인정하는 코드이다.
2번의 경우 위의 경우와 반대로 A의 width의 좌표가 B.x보다 크다면 A가 B보다 왼쪽에 있음을 인정하는 코드이다. 이렇게 1번, 2번의 경우가 True로 이행된다면 사각형 A와 B의 x축은 서로 겹쳐있다는 것을 의미한다. 하지만 y축까지 겹쳐야 완전한 충돌이 일어나기 때문에 이후 1번, 2번의 코드에서 축만 바꾼 형태로 이행한다면 y축의 검사까지도 마무리 된다. 각 축에 대한 검사가 항상 2개의 조건이 생긴다는 특징이 있고 주로 정적인 물체에 대해 적용한다. 그러나 방향 전환이 일어나는 물체의 경우 오차가 생기기 떄문에 OBB(Oriented Bounding Box) 와 같은 다른 알고리즘을 사용해야 한다.
이처럼 AABB 문제는 컴퓨터 좌표계에 대한 이해만 충족된다면 아주 간단하게 구현할수 있다.