본문 바로가기
개발/android

사각형 말고 원형 충돌검사

by 매몰 2016. 1. 25.

게임상에서 가장 기본적인 충돌검사는 사각, 원, 선 검사라고 생각한다

왜냐하면 이 세가지의 개념을 조합하면 좀더 정밀한 다각형, 픽셀 검사를 할수 있기 때문이다

 

여기서는 단순하게 원형끼리의 검사를 살펴보겠다

 

원은 한점에서 일정거리 만큼의 영역을 가지는 도형이다

그래서 두 원의 영역이 겹치는 조건은 중심점끼리의 거리로 판단한다.

 

 

 

위와 같이 중심점 사이의 거리가 두 반지름의 합보다 크면 서로 떨어져 있는 것이다.

두점 사이의 거리는 중3때 배우는 공식을 사용하면 된다 (http://mathbang.net/138)

 

 

 

 

반대의 경우로 중심점 거리가 반지름의 합보다 작아지면 겹치게 된다.

즉, 이때가 충돌한 것이다.

 

 

 

 

충돌이긴 한데.. 

완전히 겹치는, 다시 말해 한 원에 완전히 포함되는 경우는 반지름의 차로 계산한다.

거리가 반지름의 차보다 작으면 그런 경우이다.

이때, 당연히 반지름이 더 큰 원이 작은 원을 포함하게 되는것이다.

 

 

지금까지 살펴본 개념을 소스로 표현해 보자.

 

public static final int RESULT_FALSE = 0;
public static final int RESULT_TURE = 1;
public static final int RESULT_PERFECT_1 = 2;
public static final int RESULT_PERFECT_2 = 3;

public int checkCircles(float x1, float y1, float r1, float x2, float y2, float r2) {
    //두 원의 중심점 사이의 거리를 구함
    float dx = x2 - x1;
    float dy = y2 - y1;
    float distance = (float)Math.sqrt((dx * dx) + (dy * dy));

    //중심점 사이의 거리와 두 원의 반지름 길이 비교
    if(distance <= r1 - r2)         //반지름 차보다 작고 원1이 더 클때
        return RESULT_PERFECT_1;    //원1 안에 원2가 있음
    else if(distance <= r2 - r1)    //반지름 차보다 작고 원2가 더 클때
        return RESULT_PERFECT_2;    //원2 안에 원1이 있음
    else if(distance <= r1 + r2)    //반지름 합보다 작을때
        return RESULT_TURE;         //일부가 겹침

    return RESULT_FALSE;    //반지름 합보다 클때 겹치지 않음
}

 

 

 

 

 

 

도움이 되셨다면~ 정성으로 빚은 저희 앱!  많은 이용 바래요:)

 

https://meorimal.com/index.html?tab=spaceship

 

우주선 - 방치형 인공지능 투자 체험기

미리 맛보는 인공지능 투자!

(주)머리말 meorimal.com

 

https://meorimal.com/subway.html

 

지하철어디있니

더이상 고민하지 마세요. 뛸지 말지 딱 보면 알죠.

(주)머리말 meorimal.com

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기