2013-07-12 2 views
5

Я хочу использовать сумму Минковского, чтобы предсказать точную точку столкновения между двумя выпуклыми фигурами. По моему мнению, точка, в которой вектор скорости пересекается с суммой Минковского, - это сумма, которую мне приходится перемещать по объекту вдоль вектора, поэтому они просто касаются (я уже знаю, что они будут сталкиваться). Вот пример того, что я имею в виду (по соображениям простоты я использовал только прямоугольники):предсказание столкновения с использованием суммы Минковского

enter image description here

Я имею в виду, я мог бы просто вычислить пересечение с каждой линией выпуклой оболочки и использовать только ближайший, но это кажется ужасно неэффективен. Моя идея состояла в том, чтобы вычислить симплекс, ближайший к вектору, но я понятия не имею, как лучше всего это сделать. Я нашел алгоритм, который вычисляет наименьшее расстояние между объектами или, точнее, самое маленькое расстояние от суммы Минковского до начала координат (http://www.codezealot.org/archives/153). Одна часть алгоритма пытается найти симплекс, ближайший к происхождению, который является тем, что я хочу делать. Я попытался изменить его на свои нужды, но я не был успешным. Мне кажется, что должно быть очень простое решение, но я не настолько хорош с векторной математикой.

Я надеюсь, что я мог бы сделать мою проблему ясно, так как мой английский не так хорошо: D

+0

А, я не пытался эту проблему в то время. Проблема нахождения ближайшего симплекса заключается в том, что он не учитывает вектор движения. Решение, которое я пытаюсь использовать, состоит в том, чтобы вычислить пересечение луча (описывающего движение) и сумму Минковского (которая, поскольку это выпуклая оболочка, может быть представлена ​​пересечением полупространств - задача тогда вычисляя эти полупространства). –

+0

Хм, похоже, есть что-то еще, что мне нужно прочитать: D – user1566228

ответ

0

Вы можете превратить эту проблему следующим образом:

1) вращают плоскость так, что вектор скорости становится горизонтальным

2) рассмотрите части контуров многоугольника, обращенных друг к другу (это две выпуклые полилинии); теперь вам нужно найти кратчайшее горизонтальное расстояние между этими двумя полилиниями

3) через каждую вершину одной из полилиний нарисуйте горизонтальную линию; это будет парировать плоскость в набор горизонтальных срезов

4) преобразовать каждый срез с помощью сдвигового преобразования, которое приносит две вершины, определяющие его на ось Y горизонтальными перемещениями; это преобразование сохраняет горизонтальные расстояния

5) в то время как первая полилиния преобразуется в прямую линию (ось Y), другая полилиния преобразуется в другую полилинию; найдите вершину (е), ближайшую к оси Y. Это дает длину вектора столкновения.

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