태그 보관물: collision-detection

collision-detection

사각형이 충돌하는면을 결정하는 간단한 2D 사각형 충돌 알고리즘? 평행 직사각형 측면 사이의

처음에는 사각형 교차를 구현하려고 시도했지만 제대로 작동했습니다. 그러나 속도, 가속도 및 방향 벡터와 같은 물리 시스템을 적용해야 할 때 직사각형의 어느 쪽이 충돌하는지 결정하는 방법을 찾아야했습니다. 이제 내 시스템에는 회전 된 사각형이 없으므로 문제가 단순화되었습니다. 그러나 충돌 한 사각형면을 결정하는 쉬운 방법을 찾지 못했습니다. 한 번도이 문제를 다루었지만 비참하게 실패했습니다.

과거에 한 것은 각 평행 직사각형 측면 사이의 거리를 결정하고 거리가 0에 가깝거나 (초기 정의 된 거리 범위를 사용) 0인지 확인하는 것입니다. 그러나 부동 소수점 산술의 경우 불안정하기 때문에 알 수없는 시간 경과. 때로는 사각형이 정의 된 범위를 충족하기 전에 실제로 서로 교차합니다.

다른 한편으로, 나는 여러 직사각형, 각면마다 직사각형을 생성하는 것에 대해 생각하고있었습니다. 그러나 다시 생각한 후에는 거리 범위를 확인하는 평행면을 갖는 것과 동일한 것이 될 것입니다. 거리 범위는 각 미니 직사각형의 너비입니다.

따라서이 문제에 대한 제안?



답변

에 내 대답에서 적응 “어느 쪽이 맞았다?” :

나는 새로운 사각형 인 B와 A 의 Minkowski 합계 를 계산하고 사각형 A의 중심이 그 새로운 사각형 ( 충돌이 발생 하는지 여부 를 알기 위해)과 대각선 ( 충돌 위치 를 알기 위해)에 상대적으로 어디에 있는지 확인하는 것이 좋습니다 이 일어나고있다):

float w = 0.5 * (A.width() + B.width());
float h = 0.5 * (A.height() + B.height());
float dx = A.centerX() - B.centerX();
float dy = A.centerY() - B.centerY();

if (abs(dx) <= w && abs(dy) <= h)
{
    /* collision! */
    float wy = w * dy;
    float hx = h * dx;

    if (wy > hx)
        if (wy > -hx)
            /* collision at the top */
        else
            /* on the left */
    else
        if (wy > -hx)
            /* on the right */
        else
            /* at the bottom */
}

답변