2D 게임 에서 원형 과 사각형 충돌 검출

3180 단어 android충돌 검출
주로 두 가지 상황 으로 나 뉜 다. 첫 번 째 는 원형 과 사각형 테두리 의 충돌 검 측 이다. Y 축 원심 에서 사각형 중심 까지 의 거리 가 반지름 + 사각형 X 축 1 / 2 너비 검 측 X 축 원심 에서 사각형 중심 까지 의 거리 가 반지름 + 사각형 Y 축 1 / 2 높이 보다 작 는 지 두 번 째 는 특수 한 사각형 네 개의 각 에서 네 개의 사각형 꼭대기 에서 원심 까지 의 거리 가 반지름 보다 작 는 지 여 부 를 검 측 한 후에 믿 는 것 이다.이 글 은 기본 적 인 사각형 과 원형 간 의 충돌 검출 알고리즘 을 설명 한다.지난번 에 나 는 사각형 과 사각형 사이 의 충돌 검 사 를 소 개 했 는데, 이번 에는 지난번 보다 조금 번 거 로 웠 다.양자 충돌 의 가장 주요 한 것 은 역시 직사각형의 네 개의 각도 에 있다.간결 함 을 위해 저 는 지난번 함수 프레임 워 크 를 사 용 했 습 니 다. 비록 편리 하 지 는 않 지만 아래 에 코드 를 직접 올 립 니 다.
 
 
  • 2.bool OverLap(RECT round, RECT rect) 
    3.{ 
    
    4.int cr = (round.right - round.left)/2; 
    
    5.int cx = round.left + cr; 
    
    6.int cy = round.top + cr; 
    
    7.int distanceX = abs(cx - rect.left - (rect.right-rect.left)/2); 
    
    8.int distanceY = abs(cy - rect.top - (rect.bottom-rect.top)/2); 
    
    9.if(distanceX > ((rect.right-rect.left)/2 + cr)) return false; 
    
    10.if(distanceY > ((rect.bottom-rect.top)/2 + cr)) return false; 
    
    11.if(distanceX <= (rect.right-rect.left)/2) return true; 
    
    12.if(distanceY <= (rect.bottom-rect.top)/2) return true; 
    
    13.int sq = (distanceX-(rect.right-rect.left)/2)*(distanceX-(rect.right-rect.left)/2) + 
    
    14.(distanceY-(rect.bottom-rect.top)/2)*(distanceY-(rect.bottom-rect.top)/2); 
    
    15.return (sq <= cr*cr); 
    
    16.} 
    
    

  • 쉽게 알 수 있 을 것 이다. 함수 가 입력 한 것 은 두 개의 사각형 이 고 전 자 는 원 을 그 리 는 외 접 사각형 이 며 후 자 는 부 딪 히 는 사각형 이다.
    코드 를 간단하게 분석 해 보 세 요.
    2.int cr = (round.right - round.left)/2; 
    
    3.int cx = round.left + cr; 
    
    4.int cy = round.top + cr; 
    
    

    면 의 몇 줄 코드 는 원 의 반지름 과 원심 을 구하 기 위해 서 이다.
    1.int distanceX = abs(cx - rect.left - (rect.right-rect.left)/2); int distanceY = abs(cy - rect.top - (rect.bottom-rect.top)/2); 

    다음 두 줄 의 코드 는 사실 원심 과 사각형 중심의 거 리 를 구 하 는 것 이다.첫 번 째 줄 은 가로 좌표 의 거리 이 고, 두 번 째 줄 은 세로 좌표 의 거리 이다.
    2.if(distanceX > ((rect.right-rect.left)/2 + cr)) return false; 
    
    3.if(distanceY > ((rect.bottom-rect.top)/2 + cr)) return false; 
    
    

    이 두 줄 은 눈 에 띄 는 상황 을 제외 하고 사실은 그림 의 중간 에 큰 사각형 외부의 모든 범위 이다.첫 번 째 문장 은 원형 에서 직사각형 X 좌표 까지 의 거리 가 양자 반경의 누적 보다 크다 는 것 을 나타 내 고 그림 의 회색 선 양쪽 의 범 위 를 배제한다.두 번 째 말 은 두 개의 파란색 선 이외 의 범 위 를 배출 하고 두 가 지 를 결합 하면 중간 에 큰 사각형 범위 가 남는다.
    1.if(distanceX <= (rect.right-rect.left)/2+r) return true; 
    
    2.if(distanceY <= (rect.bottom-rect.top)/2+r) return true; 
    
    

    다음은 뻔 한 충돌 상황 이다.직사각형 상하 좌우 의 충돌 을 측정 하기 위해 서다.구 성 된 도형 은 그림 의 분홍색 선 으로 둘러싸 인 십자 형 이다.이 두 문장 을 여기에 두 는 것 은 필수 적 이다.위의 두 마디 말 을 결합 하여 구 성 된 것 은 작은 십자 형 으로 직사각형 상하 좌우 의 충돌 상황 을 검사 할 수 있다.충돌 검출 모양 이 이 모양 입 니 다:
    마지막 두 마디 코드:
    1.
    
    2.int sq = (distanceX-(rect.right-rect.left)/2)*(distanceX-(rect.right-rect.left)/2) + (distanceY-(rect.bottom-rect.top)/2)*(distanceY-(rect.bottom-rect.top)/2); 
    
    3.return (sq <= cr*cr); 
    
    

    아주 단순 하 게 사각형 의 네 구석 이 부 딪 히 는 것 을 검사 하 는 것 이다.방법 은 직사각형 과 원형의 거리의 제곱 과 원 의 반지름 의 제곱 의 크기 관 계 를 검사 하 는 것 이다.
    만약 에 위 에 있 는 네가 잘 모 르 면 괜찮아. 내 가 이 알고리즘 으로 DEMO 를 썼 으 니 테스트 를 다운로드 한 다음 에 알고리즘 의 모든 문 구 를 주석 하여 검 측 하고 문장의 역할 을 보면 그때 알 게 될 거 야.

    좋은 웹페이지 즐겨찾기