Пусть два сегмента будут AB и CD. Их параметрические уравнения можно записать
P = A + u AB, Q = C + v CD, with u, v in [0, 1].
Вы хотите, чтобы свести к минимуму (в квадрате) расстояние
PQ² = (CA + u AB - v CD)², under the given constraints,
и вы можете отменить первые производные
(CA + u AB - v CD).AB = 0
(CA + u AB - v CD).CD = 0
После разрешения системы 2х2 вы получаете пару (u, v)
. Если обе переменные падают в [0,1]
, есть пересечение, а расстояние 0
.
В противном случае зажим u
и/v
в соответствующей области спектра [0, 1]
и рассчитайте соответствующее расстояние.
Если одна переменная была зажата, расстояние было между конечной точкой и сегментом; если два были зажаты, это между двумя конечными точками.
Аналогичный подход может быть принят для дуг (с использованием тригонометрических функций), и приводит к задаче оптимизации при линейных ограничениях. Менее простое управление, поскольку объектная функция нелинейна.
Мы также можем действовать следующим образом:
найти точки, которые делают кратчайшее расстояние между целыми кругами. Есть два случая:
затем проверьте, соответствуют ли эти точки дугам по угловому сравнению. Если да, вы закончили (расстояние равно 0 или расстоянию между пересечениями).
В противном случае рассмотрим конечные точки дуги против другого круга. Ближайшей точкой является пересечение круга с линией через точку и центр. Если пересечение принадлежит дуге, держите расстояние между точкой и пересечением. Повторите это для всех четырех комбинаций конечной точки/дуги и сохраните ближайшую пару.
Если действительная пара не найдена, сохраните кратчайшую дистанцию конечной точки/конечной точки.
На изображении показаны расстояния, которые можно рассмотреть. В зеленом, конечной точке/круге; в красном, конечной точке/конечной точке. В этом случае расстояние круга/круга равно нулю при их пересечении. Можно рассмотреть расстояние, если оно соединяет две точки внутри дуг.
Здесь линии не пересекаются. –
Я только что отредактировал свой ответ. Вы можете проверить –
Можете ли вы показать мне пример или если у вас есть один и тот же код для строк? –