2017-02-26 10 views
1

하나의 회전 된 사각형 개체가 JavaScript에서 충돌하는지 테스트하려고합니다.2D Rotated Rectangle Collision

다음은 제가 다루는 스크린 샷입니다. 온라인 리서치의 시간 후

enter image description here

, 나는 여전히 레이저 틱 라임 객체가 파란색 사각형과 중복되는 경우 (알고리즘)을 감지하는 가장 좋은 방법은 무엇 궁금하네요.

나는 조언을 주시면 감사하겠습니다.

답변

0

분리 축 정리를 사용할 수 있습니다. 기본적으로 2 개의 볼록 다각형 (예 : 직사각형)이 교차하지 않으면 한 폴리곤의 모든 모서리가 한면에있는 최소 한 줄 (무한대로 확장 된 다각형 중 하나의 가장자리에 의해 형성됨)이 있어야합니다. 다른 다각형의 모든 모서리는 다른면에 있습니다.

내적을 사용하여 어떤 점이 선상에 있는지 테스트 할 수 있습니다. 한 벡터는 선의 법선이어야하며 다른 벡터는 선의 점에서 테스트 할 점까지의 벡터 여야합니다.

일정한 권선 순서 (예 : 항상 시계 방향 또는 항상 시계 반대 방향)로 사각형 코너 꼭지점을 지정하면 다른 사각형의 점이 측면에있을 때 점 제품이 표시되어야한다는 것을 알게됩니다 직사각형의 바깥쪽에 해당하는 선.

의사 코드 :

function hasSeparatingAxis(a, b) 
{ 
    // test each side of a in turn: 
    for(i = 0; i < a.side_count; i++) 
    { 
     normal_x = a.verts[(i+1)%a.side_count].y - a.verts[i].y; 
     normal_y = a.verts[i].x - a.verts[(i+1)%a.side_count].x; 

     for(j = 0; j < b.side_count; j++) 
     { 
      dot_product = ((b.vert[j].x - a.verts[i].x) * normal_x) + 
       ((b.vert[j].y - a.verts[i].y) * normal_y); 
      if(dot_product <= 0.0) // change sign of test based on winding order 
       break; 
      if(j == b.side_count-1) 
       return true; // all dots were +ve, we found a separating axis 
     } 
    } 
    return false; 
} 

function intersects(a, b) 
{ 
    return !hasSeparatingAxis(a, b) && !hasSeparatingAxis(b, a); 
}