столкновение с прямоугольником

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

У меня есть два прямоугольника: rectangle1 а также rectangle2.

Оба определяются четырьмя значениями с плавающей точкой:

float left;
float right;
float top;
float bottom;

Ради этого примера, скажем, что каждый прямоугольник имеет размер 100 x 100 и что rectangle1 имеет вид:

float left = 100.0;
float right = 200.0;
float top = 500.0;
float bottom = 600.0;

И прямоугольник2 это:

float left = 150.0;
float right = 250.0;
float top = 550.0;
float bottom = 650.0;

Когда происходит столкновение, я пытаюсь определить, какая сторона rectangle1 ударилась в какую сторону rectangle2, используя восемь значений с плавающей запятой.

Если бы на мой вопрос был дан ответ, я мог бы определить что-то вроде следующего при столкновении:

Правая сторона rectangle1 поражает левую сторону rectangle2

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

float distance1 = rectangle2.left - rectangle1.right;
float distance2 = rectangle2.top - rectangle1.bottom;
float distance3 = rectangle2.right - rectangle1.left;
float distance4 = rectangle2.bottom - rectangle1.top;

А затем взять минимум этих значений, чтобы определить, какая сторона каждого прямоугольника была вовлечена в столкновение. Хотя это не так просто. Были две основные проблемы с этой попыткой:

1) Прямоугольники уже будут перекрываться к тому времени, когда будет достигнут код столкновения.

2) Если несколько прямоугольников наложены друг на друга, вычисления приведут к странным результатам (т. Е. Даже если rectangle1 движется в верхнем правом направлении и должен ударить оба прямоугольника с левой стороны, он может фактически попасть в один прямоугольник снизу и другой слева.)

(Это потому, что прямоугольники перекрываются при достижении кода столкновения И потому, что расстояния 1 и 4 в этом случае будут близки или равны.)

Есть ли лучший способ ответить на этот вопрос с помощью простой математики? Любая помощь будет оценена.

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

0

Решение

Если вы можете правильно определить столкновение, то для определения граней нарисуйте линию, соединяющую центр двух прямоугольников, и проверьте на пересечение с гранями каждого прямоугольника. В любой момент времени линия будет пересекать 2 грани, если 2 прямоугольника не перекрываются или, если быть точным, если центр 1 не находится внутри другого.

Когда они перекрываются, вы можете получить 1 или 0 пересечение.
прямоугольник case 0: 1 полностью внутри другого, так что вы можете решить, как вы хотите решить, какие стороны бьют, может быть, выбрать ближайший к каждому центру.

Случай 1: прямоугольник полностью или частично находится внутри другого. В любом случае продолжайте расширять линию, соединяющую центры, пока не пересечете внешний (содержащий) прямоугольник. Если вы снова пересечете содержащийся прямоугольник, просто измените ударную грань на вновь пересеченную грань.

Надеюсь, это не слишком смущает 🙂

1

Другие решения

Других решений пока нет …