點到直線的距離


工作中遇到了點到直線的距離,給出一個點的經緯度,求解這個點到

一條道路的垂直距離。道理表示使用起止點,起止點同樣也是經緯度,

PS:好久沒有用到高數了,真心覺得自己全部忘記了,公式推導了好久,終於搞定了垂足問題。

 

 

//實現的功能:給出某一個點的經緯度和某一條道路的
// 起止經緯度,計算出點到道路上的垂直距離,
// 如果垂足不在道路上,則返回點與道路起止點的最小距離

/**
* Created by yyk .
*/
public class PointToLine {
static double DEF_PI = 3.14159265359;
public static void main(String[] args) {

//點到直線的垂足
double[] Point = new double[]{2,2};
int R = 6371;
double[] StrLonLat = new double[]{1,1};//StrLonLat EndLonLat表示直線的起止經緯度
double[] EndLonLat = new double[]{1,3};
double[] Pedal = pointtoline(Point, StrLonLat, EndLonLat);//Pedal表示垂足的經緯
//SimpleDateParam dfs=new SimpleDateParam("yyyy-MM-dd HH:mm:ss.SSS");
//long start=dfs.timestamp();
double PtoP = EDistance(Point, Pedal, R);//計算考慮了地球的弧度問題
double PtoStr = EDistance(Point, StrLonLat, R);
double PtoEnd = EDistance(Point, EndLonLat, R);
double min = MIN(PtoP, PtoStr, PtoEnd);//要求的值
System.out.println("min"+min);
// long end=dfs.timestamp();
// long time=start-end;
// System.out.println("Time:"+time);
}

public static double EDistance(double[] LonLat1, double[] LonLat2, int R) {
//將兩點經緯度轉換為三維直角坐標
double x1 = Math.cos(LonLat1[0] / 180 * DEF_PI);
double y1 = Math.sin(LonLat1[0] / 180 * DEF_PI);
double z1 = Math.tan(LonLat1[1] / 180 * DEF_PI);
double x2 = Math.cos(LonLat2[0] / 180 * DEF_PI);
double y2 = Math.sin(LonLat2[0] / 180 * DEF_PI);
double z2 = Math.tan(LonLat2[1] / 180 * DEF_PI);
//根據直角坐標求兩點間的直線距離(即弦長)
double L = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
//根據弦長求兩點間的距離(即弧長)
double Eudis = R * DEF_PI * 2 * (Math.asin(0.5 * L / R)) / 180;
return Eudis;
}

public static double[] pointtoline(double[] point, double[] strlonlat, double[] endlonlat) {
double A = endlonlat[1] - strlonlat[1];
double B = strlonlat[0] - endlonlat[0];
double C = strlonlat[1] * endlonlat[0] - strlonlat[0] * endlonlat[1];
double[] Pedal = new double[2];
Pedal[0] = (point[0] * B * B - point[1] * A * B-A*C) / (A * A + B * B);
Pedal[1] = (point[1]*A*A - A * B * point[0] - B * C) / (A * A + B * B);
System.out.println("垂足經度:"+Pedal[0]+"垂足緯度:"+Pedal[1]);
return Pedal;
}
public static double MIN(double pp, double ps, double pe) {
double mindis;
if (pp < ps && pp < pe)
mindis = pp;
else if (ps < pe)
mindis = ps;
else
mindis = pe;
if(mindis==pp)
System.out.println("pedal in lineAB");
else
System.out.println("pedal is not in lineAB");
return mindis;
}

}




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM