一个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;
}
就是这样,纯属自己无聊
- 一个java有关路线偏移的算法
- 有关Java的银行家算法
- iOS之有关视图偏移的问题
- 有关停车游戏的一个算法题
- 有关路径搜索的一个算法
- 有关路径搜索的一个算法
- 有关路径搜索的一个算法
- 有关平滑梯度场的一个算法
- 推荐一个有关算法的博客
- 一个指针偏移的问题
- 有关JAVA Generic的一个问题
- Java中有关this的一个问题
- JAVA中有关继承的一个实例
- 《Java自学的路线》
- java的学习路线!
- java的学习路线
- 一个和24点有关的算法题 - 无解中
- 偏移了一个数组的大小
- ubuntu下通过wine安装source insight
- 阿里巴巴建成一种商业生态系统
- JSON
- linq 的Order 与 sql 的orderby 的优先级
- android 实现汉字排序功能的 整理和思考
- 一个java有关路线偏移的算法
- c++ 中extern的基本解释说明(VC代码)
- android的半透明效果实现
- POJ 2417 离散对数
- 静态导入和可变参数
- 乌尔都语简介和Unicode由来
- 设计模式之--观察者模式
- soj 1237. Paint Mix
- 【大话设计模式】笔记——单一职责原则