我給出了一個有兩個端點的線段:(x1,y1)(x2,y2)和一個隨機點: (X3,Y3)。Java - 極座標。給定一條線段AB和一個點P,找到極點線AB上的最近點到點P
如果我將線段轉換爲極座標,我需要能夠以編程的方式計算線段上距離點(x3,y3)最近的點。編輯: 我在我的問題中犯了一個錯誤。問題不在於找出三者之間的最接近點。問題是......給出一條具有開始和結束的AB行......找到最接近點(x3,y3)的線上的任意點。
我給出了一個有兩個端點的線段:(x1,y1)(x2,y2)和一個隨機點: (X3,Y3)。Java - 極座標。給定一條線段AB和一個點P,找到極點線AB上的最近點到點P
如果我將線段轉換爲極座標,我需要能夠以編程的方式計算線段上距離點(x3,y3)最近的點。編輯: 我在我的問題中犯了一個錯誤。問題不在於找出三者之間的最接近點。問題是......給出一條具有開始和結束的AB行......找到最接近點(x3,y3)的線上的任意點。
這個問題涉及到小學水平代數: 只有3最接近的點選項:
很容易使用畢達哥拉斯發現的兩個點(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) - 如果此點位於段 - 我們就大功告成了,否則,就像前面提到的 - 我想這是我們將採取d1
和d2
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;
}
我很欣賞這個反饋,但是這隻能解決三點之間最接近的問題。我正在尋找的是試圖找到最接近點x3,y3的線上的任何點。 – elwafflegrande
哦,我明白你想要什麼。對不起xD。我有一些東西爲這個somwhere。 – FabianCook
沒問題。看起來像alfasin想通了。我已經有了他的解決方案,但我想我的代碼中有一個錯誤是錯誤的數字!我只是想確保我不會發瘋。 – elwafflegrande
之間的最小太晚了,以防萬一有人需要它,我只需將其轉換回笛卡爾座標,以便公式更易於查看:
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));
}
然而這需要用極座標來完成。 – FabianCook
@SmartLemon然後將極座標轉換爲笛卡爾:) – alfasin
非常感謝!你幾乎證實了我所知道的...我猜我的代碼正在噴出不正確的座標。我只是想確保我不會發瘋。它看起來像我的代碼中的其他地方有一個錯誤。我感謝您的幫助! – elwafflegrande