2013-08-01 48 views
1

我給出了一個有兩個端點的線段:(x1,y1)(x2,y2)和一個隨機點: (X3,Y3)。Java - 極座標。給定一條線段AB和一個點P,找到極點線AB上的最近點到點P

如果我將線段轉換爲極座標,我需要能夠以編程的方式計算線段上距離點(x3,y3)最近的點。編輯: 我在我的問題中犯了一個錯誤。問題不在於找出三者之間的最接近點。問題是......給出一條具有開始和結束的AB行......找到最接近點(x3,y3)的線上的任意點。

回答

0

這個問題涉及到小學水平代數: 只有3最接近的點選項:

  • 點(X1,Y1)中的一個(x2,y2)
  • 另一線段上它們之間的點

很容易使用畢達哥拉斯發現的兩個點(X3,Y3)之間的距離:

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是容易計算:

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) - 如果此點位於段 - 我們就大功告成了,否則,就像前面提到的 - 我想這是我們將採取d1d2

+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。我有一些東西爲這個somwhere。 – FabianCook

+0

沒問題。看起來像alfasin想通了。我已經有了他的解決方案,但我想我的代碼中有一個錯誤是錯誤的數字!我只是想確保我不會發瘋。 – 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)); 
} 
相關問題