Алгоритм обнаружения столкновений прямоугольника / прямоугольника - PullRequest
0 голосов
/ 24 сентября 2019

http://jeffreythompson.org/collision-detection/rect-rect.php

Я пытаюсь выяснить алгоритм обнаружения столкновения прямоугольника / прямоугольника с рисунком и кодом прямоугольников.Согласно статье об обнаружении столкновений Джеффа Томпсона, r1RightEdge - это r1x + r1w.

float r1RightEdge = r1x + r1w;
if (r1RightEdge >= r2x) {
// right edge of r1 is past left edge of r2
}

Является ли r1RightEdge вертикальной линией дош синего прямоугольника на картинке?Если так, то почему r1RightEdge это r1x + r1w вместо r1x + r1h?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Общее и более простое решение может быть:

// If one rectangle is on left side of other 
if (r1x > r2x + r2w || r2x > r1x + r1w) 
    return false; 

// If one rectangle is above other 
if (r1y > r2y + r2h || r2y > r1y + r1h) 
    return false; 

// If none of the above meet then there will be a intersection
return true;

Это также будет обрабатывать особый случай, когда прямоугольники пересекаются, но ни один из углов любого прямоугольника не лежит внутри другого.

1 голос
/ 24 сентября 2019

Исходя из примера кода

if (r1x + r1w >= r2x &&     // r1 right edge past r2 left
  r1x <= r2x + r2w &&       // r1 left edge past r2 right
  r1y + r1h >= r2y &&       // r1 top edge past r2 bottom
  r1y <= r2y + r2h) {       // r1 bottom edge past r2 top
    return true;
}
return false;

Я понимаю, что x (в вашем случае: r1x) означает горизонтальное положение верхней левой точки r1 - или R1LeftEdge, имеет смысл только если мы добавимr1w (который является шириной) для него, поскольку они оба горизонтальны, результатом является горизонтальная верхняя правая точка r1 - или R1RightEdge.«r1x + r1h» не имеет смысла, потому что один горизонтальный, а другой вертикальный.

...