2013-02-12 4 views
2

볼이나 퍽과 같은 둥근 객체를 비롯하여 충돌을 처리하는 자바 게임을 개발하고 있습니다 (개발자 언어는 별 문제가 아닙니다). 타이머를 사용하므로 모든 프레임마다 충돌이 있는지 확인합니다.충돌 감지 : 둥근 객체

다음은 개체의 오른쪽 상단 부분을 나타내는 그래프입니다.

enter image description here

물체의 중심이 지점 [0,0]로 표시되며, 그 반경 10px이며 단위는 픽셀이다. 또 다른 하나 (obj_2가) 난 그냥 자신의 좌표를 얻을 수 있고 Math.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radius을 확인하여 내가 알고 것이다 그것을 충돌하는 경우

이제 내 객체 (예를 들어, obj_1) 인 광장/다이아몬드 모양 (파란 선), 찾을 경우 충돌이 있습니다.

그러나 문제는 원 모양 (빨간색 선)이 더 많은 공간을 차지하며 차지하는 공간이 직선으로 묶이지 않기 때문에 더 까다로운 문제입니다. 물론 나는 어떤 값을 반올림해야 할 것입니다 (예를 들어 이전 그래프에서 x = 2에서 충돌을 확인하려면 9.5에서 10과 같이 보이는 y 값을 반올림해야합니다). 그러나 나는이 수식을 얻는 방법을 모른다. 어떤 도움을 주시면 감사하겠습니다.

답변

2

구현 언어가 중요하지 않다고 언급 했으므로 원형 객체의 충돌을 감지하는 일반적인 솔루션을 제공 할 것입니다.

또한 내가 수집 한 것으로부터 장면의 모든 개체가 원입니다. 아래 해결책은 원과 다른 모양 사이의 충돌을 감지하는 데는 적용되지 않습니다.

두 개의 동그라미가 있다고 가정하십시오. c1c2 해당 반경은 c1.r 및 c2.r이며, 중심이 가정 (c1.x, c1.y)(c2.x, c2.y), 다음 함수 것 C1과 C2이 의사 코드 기능이 사실 원이 충돌하는 경우, 그렇지 않은 경우는 false 반환됩니다 충돌

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = sqrt((x1-x2)^2 +(y1-y2)^2); //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r) < center_distance) 
      return false; 
    else 
      return true; 

} 

에 있는지 알려줍니다.

기본적으로 기능은 원의 중심 사이의 거리가 각 반지름의 합보다 큰지 확인하는 것입니다[email protected] ANKIT의 솔루션에

+1

완벽하고, 아주 잘 해결되었습니다. 고마워요! – Rob

2

Java의 경우 java.awt.Polygon입니다.

Polygon 클래스에는 여러 개의 contains 메소드와 intersect 메소드가 있습니다.

원을 정확히 정의하려면 원을 정확하게하려는 경우에 따라 Polygon으로 원을 정의하면됩니다. 그러나 모든 객체를 Polygon으로 정의하면 정의 된 메소드를 사용하여 충돌을 감지 할 수 있습니다.

1

경계 상자에서 둥근 모양을 설정할 수 있습니다. 이것은 정확도가 떨어지는 충돌을 발생 시키지만 다른 방법에 비해 큰 성능 이점을 얻습니다.

1

가산이 그냥 제곱 거리를 비교

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = (x1-x2)^2 +(y1-y2)^2; //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r)^2 < center_distance) 
     return false; 
    else 
     return true; 
} 

. 결과는 동일하지만 제곱근이없고 성능면에서 큰 이점이 있습니다.