Как я могу определить, с какой стороны произошло столкновение (Java) - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть два прямоугольника.В моем коде я могу проверить, когда происходит столкновение с помощью метода Rect.intersects(), но не могу определить, с какой стороны это происходит.Я попробовал это ниже, и это работает для оси X, но не для оси Y.

if(R1.getTranslateX() + R1.getWidth() < R2.getTranslateX() + (R2.getWidth() / 2) ) {
                //Collision from left side
            }
if(R1.getTranslateX() > R2.getTranslateX() + (R2.getWidth() / 2) ) {
                //Collision from right side
            }
if(R1.getTranslateY() + R1.getHeight() < R2.getTranslateY() + (R2.getHeight() / 2)) {
                //Collision from top side
            }
if(R1.getTranslateY() > R2.getTranslateY() + (R2.getHeight() / 2)) {
                //Collision from bottom side
            }

Код не проходит мимо оси X, чтобы проверить сторону оси Y ...Есть идеи?

1 Ответ

0 голосов
/ 07 декабря 2018

Влево / вправо и сверху / снизу относительно R1.Невозможно точно знать во всех случаях, в каком направлении произошло столкновение, не зная направлений движения объектов.Следующее было бы наилучшим, на мой взгляд, способом определения направления столкновения с помощью имеющейся информации.Рассмотрим прямоугольник R1.Мы сделаем оценку того, сколько сталкивающихся прямоугольников будет максимально пересекаться до того, как столкновение будет обнаружено.Мы назовем этот запас м.Давайте обнаружим столкновения после этой иллюстрации .Мы видим, что чем меньше поле, тем меньше области на углах, в которых мы точно не знаем направление столкновения.Проблема с уменьшением поля состоит в том, что если прямоугольники пересекаются больше, чем позволяет поле, мы вообще не определяем направление столкновения.Смотрите код ниже.

int m = [an estimate on how much the rectangles will intersect at most];  //margin

//x-direction
if(R1.getTranslateX() + m > R2.getTranslateX() + R2.getWidth()){
    //Collision from left side
}else if(R1.getTranslateX() + R1.getWidth() - m < R2.getTranslateX()){
    //Collision from right side
}

//y-direction
if(R1.getTranslateY() + m > R2.getTranslateY() + R2.getHeight()){
    //Collision from top side
}else if(R1.getTranslateY() + R1.getHeight() - m < R2.getTranslateY()){
    //Collision from bottom side
}
...