一个java有关路线偏移的算法

来源:互联网 发布:mac北京哪里有专柜 编辑:程序博客网 时间:2024/04/28 19:10

事先说明一下,这个是个人之前搞的第一个项目,还没有毕业,编程不过学了不到一个月,所以很多挺不合适的东西,不过现在一直都在跑,也没有空去改进了…

纯属抛砖引玉吧。

这个算法用于一系列点所构建的一条路线,给点另一个点,得出这个点和这个路线的距离。

算法包含3个部分,说白了就是拼接一下。嘛,不要站在太高的地方来批判我……这个真的是我自己能想到的最好解决办法了,因为我数学确实不好。

思路是这样的,路线的点每两个构成的直线和指定点计算,得到一系列值,再取其中的最小值。

很简单吧?

典型的一个用法:

double[] dis = new double[a.length - 1];
for (int i = 0; i < a.length - 1; i++) {
String[] b = a[i].split(",");//一个字串分割,这里效率很低的大家不要学
String[] c = a[i + 1].split(",");
double lat1 = Double.parseDouble(b[0]);
double lng1 = Double.parseDouble(b[1]);
double lat2 = Double.parseDouble(c[0]);
double lng2 = Double.parseDouble(c[1]);
double distance = DistancePointToLine(lat, lng,
lat1, lng1, lat2, lng2);
dis[i] = distance;
}
result = getMin(dis);


下面给出的几个组成部分,其实都是很常见的算法。

public static double DistancePointToLine(double x, double y, double x1,
double y1, double x2, double y2) {//这是点到线的距离
if (y1 == y2)// 线段为平行于X轴
{
if (Math.min(x1, x2) < x && Math.max(x1, x2) > x)// 垂足在线段内
{
return Math.abs(ComputeD(y1, x, y, x));// 点与该线的距离为TempP与P的的距离
} else {
return Math.min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));// 返回到某个端点的距离
}
}
if (x1 == x2)// 线段为平行于Y轴
{
if (Math.min(y1, y2) < y && Math.max(y1, y2) > y)// 垂足在线段内
{
return ComputeD(y, x1, y, x);// 点与该线的距离为TempP与P的的距离
} else {
return Math.min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));// 返回到某个端点的距离
}
} else// 该线段不平行于X轴也不平行于Y轴
{
double k = (y2 - y1) / (x2 - x1); // 线段的斜率
double TempX, TempY;
TempX = (Math.pow(k, 2.0) * x1 + k * (y - y1) + x)
/ (Math.pow(k, 2.0) + 1.0);
TempY = k * (TempX - x1) + y1;
if (TempX < -180 || TempX > 180 || TempY < -90 || TempY > 90) {
return Math.min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));// 返回到某个端点的距离
}
double TempDis1 = (ComputeD(TempY, TempX, y1, x1) + ComputeD(TempY,
TempX, y2, x2));
double TempDis2 = ComputeD(y1, x1, y2, x2);
if ((TempDis1 - TempDis2) < 0.001) // 垂足在线内
{
return (ComputeD(TempY, TempX, y, x));// 点与该线的距离为TempP与P的的距离
} else {
return Math.min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));// 返回到某个端点的距离
}
}
}


public static double ComputeD(double lat_a, double lng_a, double lat_b,
double lng_b) {//两点经纬度距离算法


double radLat1 = (lat_a * Math.PI / 180.0);
double radLat2 = (lat_b * Math.PI / 180.0);
double a = radLat1 - radLat2;
double b = (lng_a - lng_b) * Math.PI / 180.0;
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;


return s;
}


private static double getMin(double[] a) {//最小值获取


double[] num = a;
for (int i = 0; i < num.length - 1; i++) {
for (int j = 0; j < num.length - i - 1; j++) {
if (num[j] > num[j + 1]) {
double temp = num[j + 1];
num[j + 1] = num[i];
num[j] = temp;
}
}
}
double min = num[0];
return min;
}

就是这样,纯属自己无聊

原创粉丝点击