Вычисление положения движущегося круга, когда он касается прямоугольника

#geometry #collision

#геометрия #столкновение

Вопрос:

у меня следующая ситуация: круг движется линейно к неподвижному прямоугольнику. Есть ли эффективный способ вычислить положение круга, когда он касается прямоугольника?

Мне это нужно для обработки столкновений. Круги должны двигаться как можно ближе к прямоугольнику, а не просто останавливаться, если движение приведет к пересечению. Я смог решить проблему с кругом, движущимся к другому кругу, поскольку вы можете просто использовать уравнение перемещения плюс радиусы. Но с прямоугольниками я на данный момент не имею ни малейшего представления о том, как его (эффективно) вычислить без двоичного поиска по траектории круга.

Комментарии:

1. Траектория наклонная?

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

3. Есть и другие случаи, см. Мой ответ.

Ответ №1:

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

введите описание изображения здесь

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

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