Этот вопрос включает в себя алгебру уровня начальной школы: Есть только три варианта ближайшей точки:
- одна из точек (x1, y1) (x2, y2)
- еще точка между ними на отрезке
Это легко найти расстояние между (х3, у3) к двум точкам с использованием Пифагора:
d1 = d(<x1,y1>,<x3,y3>) = sqrt((x1-x3)^2 + (y1-y3)^2)
и
d2 = d(<x2,y2>,<x3,y3>) = sqrt((x2-x3)^2 + (y2-y3)^2)
и теперь для «более сложной» части: если есть еще одна точка на сегменте, который находится ближе к (x3, y3) - если соединить эти точки - мы будем есть новый сегмент, который будет диагональным для исходного сегмента - мы должны использовать это вместе с уравнением первой степени (для линии), чтобы найти эту третью точку и посмотреть, находится ли она на сегменте или снаружи (если она находится вне сегмента то мы возьмем минимальное расстояние между (x3, y3) до двух других точек.
уравнение линии (простите мой английский - я узнал его на своем родном языке так, медведь со мной) является:
(I) y = mx + d
где т легко вычислить:
m = (y1-y2)/(x1-x2)
и теперь, мы знаем значение m
для того, чтобы найти d
, мы будем использовать значения одной из первых двух точек, например:
y1 = mx1 +d => d = y1 - mx1
Диагональная линия будет иметь m'
, которая равна -1/m
, и если мы будем использовать значения (x3, y3), мы найдем d'
.Итак, теперь мы знаем, как значения (I), а также уравнение для диагональной линии:
(II) y=m'x + d'
, и если мы будем использовать эти два уравнения можно найти точку на линии, по которой первоначальный сегмент проходит через который является самым близким к (x3, y3) - если эта точка лежит на сегменте - мы закончили, в противном случае, как и раньше, мы возьмем минимум между d1
и d2
Это нужно делать с полярными координатами. – FabianCook
@SmartLemon затем преобразует полярные координаты в декартовую :) – alfasin
Большое спасибо! Вы в значительной степени подтвердили, что я знал ... Я думаю, мой код извергает неправильные координаты. Я просто хотел убедиться, что я не схожу с ума. Похоже, в моем коде есть ошибка где-то еще. Я ценю вашу помощь! – elwafflegrande