Минимальное расстояние между двумя окружностями вдоль указанного вектора на декартовой плоскости - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь решить следующую проблему (я использую Matlab, хотя псевдокод / ​​решения на других языках приветствуются):

У меня есть два круга на декартовой плоскости, определяемые их центроидами (p1 , p2) и их радиусы (r1, r2). окружность 1 (c1 = [p1 r1]) считается «Dynami c»: она переводится по вектору V = [0 -1]. окружность 2 (c2 = [p2 r2]) считается 'stati c': она лежит на пути c1, но компонент x ее центроида смещен относительно компонента x c2 (в противном случае решение будет тривиальным: расстояние между центроидами круга минус сумма их радиусов).

Я пытаюсь определить расстояние (d) вдоль V, на котором круг 1 будет «сталкиваться» с кругом 2 (см. Связанное изображение). Я уверен, что я могу решить это итеративно (то есть перевести c1 в ограничивающую рамку c2, а затем сойтись / проверить на пересечение). Тем не менее, я хотел бы знать, есть ли решение этой проблемы в закрытой форме.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Поскольку заголовок вопроса не совпадает с вопросом и принятым ответом, который зависит от фиксированного вектора {0, -1} или {0, 1}, а не от произвольного вектора, я добавил другое решение, которое работает для любой единицы вектор.

Где (см. диаграмму 1)

  • dx, dy - единичный вектор перемещения по кругу c1
  • p1 , p2 центры движущихся кругов c1 и стати c круг c2
  • r1, r2 радиус каждого круга

следующее установит d на расстояние c1 должно пройти вдоль dx, dy, чтобы столкнуться с c2, если нет столкновения, d будет установлено на Infinity

Существует три случая когда нет решения

  1. Движущийся круг удаляется от круга * stati c. u < 0
  2. Движущийся круг никогда не подходит достаточно близко, чтобы столкнуться. dSq > rSq
  3. Два круга уже перекрываются. u < 0 к счастью, математика делает то же самое, что и отъезд.

    Обратите внимание , что если вы проигнорируете знак u (1 и 3), тогда d будет расстояние до первого (причинного) контакта, движущегося назад во времени 1055 *

    cpx = p1.x + dx * d;
    cpy = p1.x + dy * d;
    

    Диаграмма 1

    Diagram 1 showing variables and their relationship to the problem

1 голос
/ 17 января 2020

Сдвиг координат для упрощения выражений

px = p1.x - p2.x
py = p1.y - p2.y   

И решение квадратного c уравнения для d (ноль, одно или два решения)

px^2 + (py - d)^2 = (r1 + r2)^2
(py - d)^2 = (r1 + r2)^2 - px^2
d = py +/- Sqrt((r1 + r2)^2 - px^2) 

Вот и все.

...