|
@@ -1,117 +1,117 @@
|
|
|
-package com.fdkankan.indoor.base.util;
|
|
|
-
|
|
|
-import java.awt.geom.Point2D;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-/**
|
|
|
- * @author Admin
|
|
|
- * 距离计算
|
|
|
- */
|
|
|
-public class DistanceUtil {
|
|
|
-
|
|
|
- public static double distance(Double[] coordinates1, Double[] coordinates2, Options options) {
|
|
|
- double dLat = degreesToRadians(coordinates2[1] - coordinates1[1]);
|
|
|
- double dLon = degreesToRadians(coordinates2[0] - coordinates1[0]);
|
|
|
- double lat1 = degreesToRadians(coordinates1[1]);
|
|
|
- double lat2 = degreesToRadians(coordinates2[1]);
|
|
|
-
|
|
|
- double a = Math.pow(Math.sin(dLat / 2), 2) +
|
|
|
- Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
|
|
|
-
|
|
|
- return radiansToLength(
|
|
|
- 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)),
|
|
|
- options.getUnits()
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- public static double degreesToRadians(Double degrees) {
|
|
|
- if (degrees == null) {
|
|
|
- return 0.0D;
|
|
|
- }
|
|
|
- double radians = degrees % 360;
|
|
|
- return (radians * Math.PI) / 180;
|
|
|
- }
|
|
|
-
|
|
|
- public static double radiansToLength(double radians, String units) {
|
|
|
- Double factor = Factors.getFactorsData(units);
|
|
|
- if (factor == null) {
|
|
|
- throw new RuntimeException(units + " units is invalid");
|
|
|
- }
|
|
|
- return radians * factor;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 判断点是否在多边形内
|
|
|
- * @param point 检测点
|
|
|
- * @param pts 多边形的顶点
|
|
|
- * @return 点在多边形内返回true,否则返回false
|
|
|
- */
|
|
|
- public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
|
|
|
-
|
|
|
- int N = pts.size();
|
|
|
- boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
|
|
|
- int intersectCount = 0;//cross points count of x
|
|
|
- double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
|
|
|
- Point2D.Double p1, p2;//neighbour bound vertices
|
|
|
- Point2D.Double p = point; //当前点
|
|
|
-
|
|
|
- p1 = pts.get(0);//left vertex
|
|
|
- for(int i = 1; i <= N; ++i){//check all rays
|
|
|
- if(p.equals(p1)){
|
|
|
- return boundOrVertex;//p is an vertex
|
|
|
- }
|
|
|
-
|
|
|
- p2 = pts.get(i % N);//right vertex
|
|
|
- if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
|
|
|
- p1 = p2;
|
|
|
- continue;//next ray left point
|
|
|
- }
|
|
|
-
|
|
|
- if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//横坐标 内 ray is crossing over by the algorithm (common part of)
|
|
|
- if(p.y <= Math.max(p1.y, p2.y)){//y下 x is before of ray
|
|
|
- if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray 垂线
|
|
|
- return boundOrVertex;
|
|
|
- }
|
|
|
-
|
|
|
- if(p1.y == p2.y){//水平线 ray is vertical
|
|
|
- if(p1.y == p.y){//水平线内 overlies on a vertical ray
|
|
|
- return boundOrVertex;
|
|
|
- }else{//before ray
|
|
|
- ++intersectCount; //交点在上方
|
|
|
- }
|
|
|
- }else{//cross point on the left side
|
|
|
- double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//两点式化简,交点y坐标 cross point of y
|
|
|
- if(Math.abs(p.y - xinters) < precision){//== 0 在线上 overlies on a ray
|
|
|
- return boundOrVertex;
|
|
|
- }
|
|
|
-
|
|
|
- if(p.y < xinters){//before ray
|
|
|
- ++intersectCount; //交点在上方
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }else{//special case when ray is crossing through the vertex
|
|
|
- if(p.x == p2.x && p.y <= p2.y){//p crossing over p2
|
|
|
- Point2D.Double p3 = pts.get((i+1) % N); //next vertex
|
|
|
- if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
|
|
|
- ++intersectCount;
|
|
|
- }else{
|
|
|
- intersectCount += 2;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- p1 = p2;//next ray left point
|
|
|
- }
|
|
|
-
|
|
|
- if(intersectCount % 2 == 0){//偶数在多边形外
|
|
|
- return false;
|
|
|
- } else { //奇数在多边形内
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
+//package com.fdkankan.indoor.base.util;
|
|
|
+//
|
|
|
+//import java.awt.geom.Point2D;
|
|
|
+//import java.util.List;
|
|
|
+//
|
|
|
+///**
|
|
|
+// * @author Admin
|
|
|
+// * 距离计算
|
|
|
+// */
|
|
|
+//public class DistanceUtil {
|
|
|
+//
|
|
|
+// public static double distance(Double[] coordinates1, Double[] coordinates2, Options options) {
|
|
|
+// double dLat = degreesToRadians(coordinates2[1] - coordinates1[1]);
|
|
|
+// double dLon = degreesToRadians(coordinates2[0] - coordinates1[0]);
|
|
|
+// double lat1 = degreesToRadians(coordinates1[1]);
|
|
|
+// double lat2 = degreesToRadians(coordinates2[1]);
|
|
|
+//
|
|
|
+// double a = Math.pow(Math.sin(dLat / 2), 2) +
|
|
|
+// Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
|
|
|
+//
|
|
|
+// return radiansToLength(
|
|
|
+// 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)),
|
|
|
+// options.getUnits()
|
|
|
+// );
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// public static double degreesToRadians(Double degrees) {
|
|
|
+// if (degrees == null) {
|
|
|
+// return 0.0D;
|
|
|
+// }
|
|
|
+// double radians = degrees % 360;
|
|
|
+// return (radians * Math.PI) / 180;
|
|
|
+// }
|
|
|
+//
|
|
|
+// public static double radiansToLength(double radians, String units) {
|
|
|
+// Double factor = Factors.getFactorsData(units);
|
|
|
+// if (factor == null) {
|
|
|
+// throw new RuntimeException(units + " units is invalid");
|
|
|
+// }
|
|
|
+// return radians * factor;
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 判断点是否在多边形内
|
|
|
+// * @param point 检测点
|
|
|
+// * @param pts 多边形的顶点
|
|
|
+// * @return 点在多边形内返回true,否则返回false
|
|
|
+// */
|
|
|
+// public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
|
|
|
+//
|
|
|
+// int N = pts.size();
|
|
|
+// boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
|
|
|
+// int intersectCount = 0;//cross points count of x
|
|
|
+// double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
|
|
|
+// Point2D.Double p1, p2;//neighbour bound vertices
|
|
|
+// Point2D.Double p = point; //当前点
|
|
|
+//
|
|
|
+// p1 = pts.get(0);//left vertex
|
|
|
+// for(int i = 1; i <= N; ++i){//check all rays
|
|
|
+// if(p.equals(p1)){
|
|
|
+// return boundOrVertex;//p is an vertex
|
|
|
+// }
|
|
|
+//
|
|
|
+// p2 = pts.get(i % N);//right vertex
|
|
|
+// if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
|
|
|
+// p1 = p2;
|
|
|
+// continue;//next ray left point
|
|
|
+// }
|
|
|
+//
|
|
|
+// if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//横坐标 内 ray is crossing over by the algorithm (common part of)
|
|
|
+// if(p.y <= Math.max(p1.y, p2.y)){//y下 x is before of ray
|
|
|
+// if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray 垂线
|
|
|
+// return boundOrVertex;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if(p1.y == p2.y){//水平线 ray is vertical
|
|
|
+// if(p1.y == p.y){//水平线内 overlies on a vertical ray
|
|
|
+// return boundOrVertex;
|
|
|
+// }else{//before ray
|
|
|
+// ++intersectCount; //交点在上方
|
|
|
+// }
|
|
|
+// }else{//cross point on the left side
|
|
|
+// double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//两点式化简,交点y坐标 cross point of y
|
|
|
+// if(Math.abs(p.y - xinters) < precision){//== 0 在线上 overlies on a ray
|
|
|
+// return boundOrVertex;
|
|
|
+// }
|
|
|
+//
|
|
|
+// if(p.y < xinters){//before ray
|
|
|
+// ++intersectCount; //交点在上方
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }else{//special case when ray is crossing through the vertex
|
|
|
+// if(p.x == p2.x && p.y <= p2.y){//p crossing over p2
|
|
|
+// Point2D.Double p3 = pts.get((i+1) % N); //next vertex
|
|
|
+// if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
|
|
|
+// ++intersectCount;
|
|
|
+// }else{
|
|
|
+// intersectCount += 2;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// p1 = p2;//next ray left point
|
|
|
+// }
|
|
|
+//
|
|
|
+// if(intersectCount % 2 == 0){//偶数在多边形外
|
|
|
+// return false;
|
|
|
+// } else { //奇数在多边形内
|
|
|
+// return true;
|
|
|
+// }
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+//}
|