2013-08-01 2 views
1

Мне задан сегмент линии с двумя конечными точками: (x1, y1) (x2, y2) и случайная точка: (х3, у3).Java - полярные координаты. Для отрезка AB и точки P найдите ближайшую точку на полярной линии AB до точки P

Если я преобразую отрезок линии в полярные координаты, мне нужно иметь возможность вычислить программно точку на сегменте линии, которая ближе всего к точке (x3, y3).

EDIT: Я допустил ошибку в моем вопросе. Проблема не в том, чтобы найти ближайшую точку между этими тремя. Проблема заключается в том, что ... задана строка AB с началом и концом ... найдите ЛЮБУЮ точку на ближайшей к точке (x3, y3) точке.

ответ

0

Этот вопрос включает в себя алгебру уровня начальной школы: Есть только три варианта ближайшей точки:

  • одна из точек (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

+0

Это нужно делать с полярными координатами. – FabianCook

+0

@SmartLemon затем преобразует полярные координаты в декартовую :) – alfasin

+0

Большое спасибо! Вы в значительной степени подтвердили, что я знал ... Я думаю, мой код извергает неправильные координаты. Я просто хотел убедиться, что я не схожу с ума. Похоже, в моем коде есть ошибка где-то еще. Я ценю вашу помощь! – elwafflegrande

0
public static Location closest(double x1, double y1, double x2, double y2, double x3, double y3){ 
    Location a = new Location("provider"); 
    Location b = new Location("provider"); 
    Location c = new Location("provider"); 

    //I can't remember which one goes where, you may need to swap all the x/ys around 
    //Do conversion or something here. 

    a.setLongitude(x1); 
    a.setLatitude(y1); 

    b.setLongitude(x2); 
    b.setLatitude(y2); 

    c.setLongitude(x3); 
    c.setLongitude(y3); 

    return closest(a, b, c); 
} 

public static Location closest(Location a, Location b, Location c){ 
    return a.distanceTo(c) < b.distanceTo(c) ? a : b; 
} 
+0

Я ценю обратную связь, но это решает только для ближайшего между тремя точками. То, что я ищу, пытается найти ЛЮБОЙ пункт на линии, ближайшей к точке x3, y3. – elwafflegrande

+0

Ох, я вижу, чего ты хочешь. Извините xD. У меня есть кое-что для этого. – FabianCook

+0

Нет проблем. Похоже, альфасин понял это. У меня уже было его решение, но я думаю, что в моем коде есть ошибка, которая выкачивает неправильные цифры! Я просто хотел убедиться, что я не схожу с ума. – elwafflegrande

1

Я предполагаю, что это слишком поздно, на случай, если кому-то это понадобится, я просто конвертирую обратно в декартовые координаты, поэтому формула легче смотреть:

public static double distance(double r1,double t1,double r2,double t2,double r3,double t3) 
{ 
    double x1 = (r1*Math.cos(t1)); 
    double x2 = (r1*Math.cos(t2)); 
    double x3 = (r1*Math.cos(t3)); 
    double y1 = (r1*Math.sin(t1)); 
    double y2 = (r1*Math.sin(t2)); 
    double y3 = (r1*Math.sin(t3)); 

    return Math.abs((x2-x1)*(y1-y3)-(x1-x3)*(y2-y1))/Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); 
} 
Смежные вопросы