Влево / вправо и сверху / снизу относительно 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
}