2013-02-27 2 views
2

이것은 플랫폼에 독립적 인 수학적인 질문입니다. 나는 두 개의 사각형이 겹쳐져 있습니다. 나는 "중첩 깊이 (overlap depth)"(한 모양이 얼마나 많이 다른 모양으로 옮겨 졌는지)를 알아야합니다. 나는 적절한 충돌을 허용하기 위해이 데이터가 필요하다. 더 간단한 방법이 있습니까? 아니면 나는 다음을 고수하는 것이 더 낫다.겹치는 부분의 '깊이'를 얻으시겠습니까?

rA은 직사각형이므로 ia rB입니다.

depth.x = (rA.position.x - rB.position.x); 
depth.y = (rA.position.y - rB.position.y); 

이 다소 부정확 한 정보뿐만 아니라 반환 중첩 깊이를 돌려, 그것은 rArB과 사이의 거리를 반환한다 (예상되는). 문제는 두 개체의 겹침 깊이를 찾기 위해 공식을 계산할 수 없다는 것입니다. 이미 충돌이 있다는 것을 알고 있더라도 객체 크기를 고려해야합니까?

나는 depth.x = (rA.width/2) - (rA.position.x - rB.position.x)을 할 수 있다고 제안되었습니다. 그러나 rB가 왼쪽에있는 경우 -10(example) - 50과 같이 유효하지 않으므로 (-60)이 방법은 작동하지 않습니다. 나는 길이가 긴 if 진술을 피하고, 그것들이 얼마나 겹치는지를 아는 것에 충실합니다. 그래서 이것을 해결할 수 있습니까?

답변

1

제곱 축이 정렬되어 있다고 가정하지만, 그렇지 않은 경우에도 작동하는 기술을 보여줄 것입니다.

일반 검색 결과 (볼록 다각형)

방법은 두 세트의 교차점을 발견하는 일반적인 기법의 민코프 스키 차이에 의존한다.

두 볼록 모양의 Minkowski 차이점은 볼록하고, 두 원본 세트가 모두 다각형 인 경우 결과 모양은 다각형입니다. 이것은 방정식 집합으로 나타낼 수 있다는 것을 의미합니다. n_i.x>c_i 각 n은 입니다.은 단위 표준입니다.

그래서 두 형상이 교차하는지 여부를 결정하기위한 알고리즘은 다음

  1. 두 형태의 Minkowskian 차이를 결정한다. 깊이를 측정 한 후하기 max(c_i)

    축 정렬 사각형위한

    전용 케이스

이다

  • 는 (모든 c_i<0 경우 true 인) 원점이 Minkowskian 합 내부 떨어졌는지 결정 2 축 정렬 사각형의 경우 Minkowski 합은 사각형으로 정렬 된 다른 축입니다.

    A = { (cA_x + a WA/2, cA_y + b HA/2), where -1<=a<=1, -1<=b<=1 } 
    

    유사하게 사각형 B가 될 것이다 : 같이 우리가 표현할 수있는 폭 WA 높이 HA으로 (cA_x,cA_y) 중심으로 정방형 촬영

    B = { cB_x + c WB/2, cB_y + d HB/2), where -1<=c<=1, -1<=b<=1 } 
    

    하면이어서 민코프 스키 차이

    A-B = { (cA_x - cB_x + a WA/2 - c WB/2, cA_y - cB_y + b HA/2 - d HB/2), where ... } 
        = { (cA_x - cB_x + r (WA-WB)/2, A_y - cB_y + s (HA-HB)/2), where -1<=s<=1, -1<=r<=1 } 
    

    A-B의 네 모서리는

    입니다. 이 깊이가 양수이면 교차로와

    min(
        (cA_x-cB_x) - |WA-WB|/2, 
        (cA_y-cB_y) - |HA-HB|/2, 
        -(cA_x-cB_x) - |WA-WB|/2, 
        -(cA_y-cB_y) - |HA-HB|/2) 
    

    만 발생 :

    x > -(cA_x-cB_x) - |WA-WB|/2 
    y > -(cA_y-cB_y) - |HA-HB|/2 
    

    는 따라서 우리가 교차로의 깊이입니다 찾기로

    x > (cA_x-cB_x) - |WA-WB|/2 
    y > (cA_y-cB_y) - |HA-HB|/2 
    x < (cA_x-cB_x) + |WA-WB|/2 
    y < (cA_y-cB_y) + |HA-HB|/2 
    

    마지막 두는 다시 작성할 수 있습니다.

    (참고 : 나는이 글을 쓰면서 수학적으로 작업 해 왔기 때문에 여기에 잘못된 부호가 표시되어 있습니다 ... 이러한 오류를 수정하는 것이 좋습니다 ...)

  • +0

    이것들은 객체가 충돌하는지 아닌지를 확인하는 것만을 제공하지는 않습니까? (죄송합니다, 나는 바보가 있습니다) –

    +0

    이것은 교차의 깊이와 교차 여부를 알려줍니다. 교차점의 깊이는 마지막 표현식에 의해 주어 지지만 음수이면 교차점이 없습니다. –

    관련 문제