하나의 회전 된 사각형 개체가 JavaScript에서 충돌하는지 테스트하려고합니다.2D Rotated Rectangle Collision
다음은 제가 다루는 스크린 샷입니다. 온라인 리서치의 시간 후
, 나는 여전히 레이저 틱 라임 객체가 파란색 사각형과 중복되는 경우 (알고리즘)을 감지하는 가장 좋은 방법은 무엇 궁금하네요.
나는 조언을 주시면 감사하겠습니다.
하나의 회전 된 사각형 개체가 JavaScript에서 충돌하는지 테스트하려고합니다.2D Rotated Rectangle Collision
다음은 제가 다루는 스크린 샷입니다. 온라인 리서치의 시간 후
, 나는 여전히 레이저 틱 라임 객체가 파란색 사각형과 중복되는 경우 (알고리즘)을 감지하는 가장 좋은 방법은 무엇 궁금하네요.
나는 조언을 주시면 감사하겠습니다.
분리 축 정리를 사용할 수 있습니다. 기본적으로 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);
}