New file |
| | |
| | | package com.stylefeng.guns.modular.system.util; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 电子围栏工具类 |
| | | */ |
| | | public class ElectricFenceUtil { |
| | | |
| | | |
| | | |
| | | /** |
| | | * @return |
| | | */ |
| | | public static boolean monitorElectricFenc(String coordinate, String locations){ |
| | | return areaMonitoring(coordinate, locations); |
| | | } |
| | | public static boolean areaMonitoring(String coordinate, String lonLat){ |
| | | boolean flag = false; |
| | | String[] split = coordinate.split(";"); |
| | | List<Double> pointsX = new ArrayList<>(); |
| | | List<Double> pointsY = new ArrayList<>(); |
| | | for (String s : split) { |
| | | pointsX.add(Double.valueOf(s.split(",")[0])); |
| | | pointsY.add(Double.valueOf(s.split(",")[1])); |
| | | } |
| | | String lon1 = lonLat.split(",")[0]; |
| | | String lat1 = lonLat.split(",")[1]; |
| | | boolean inPolygon = isInPolygon(Double.valueOf(lon1), Double.valueOf(lat1), pointsX, pointsY); |
| | | if (inPolygon){ |
| | | flag = true; |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | |
| | | /** |
| | | // * 判断点是否在多边形内 |
| | | // * @param px 测试点 |
| | | // * @param polygonXA 多边形的点 |
| | | // * @return boolean true:在多边形内, false:在多边形外 |
| | | // * @throws |
| | | // * @Title: IsPointInPoly |
| | | // */ |
| | | public static boolean isInPolygon(double px, double py,List<Double> polygonXA, List<Double> polygonYA) { |
| | | boolean isInside = false; |
| | | double ESP = 1e-9; |
| | | int count = 0; |
| | | double linePoint1x; |
| | | double linePoint1y; |
| | | double linePoint2x = 180; |
| | | double linePoint2y; |
| | | |
| | | linePoint1x = px; |
| | | linePoint1y = py; |
| | | linePoint2y = py; |
| | | |
| | | for (int i = 0; i < polygonXA.size() - 1; i++) { |
| | | double cx1 = polygonXA.get(i); |
| | | double cy1 = polygonYA.get(i); |
| | | double cx2 = polygonXA.get(i + 1); |
| | | double cy2 = polygonYA.get(i + 1); |
| | | if (isPointOnLine(px, py, cx1, cy1, cx2, cy2)) { |
| | | return true; |
| | | } |
| | | if (Math.abs(cy2 - cy1) < ESP) { |
| | | continue; |
| | | } |
| | | |
| | | if (isPointOnLine(cx1, cy1, linePoint1x, linePoint1y, linePoint2x, |
| | | linePoint2y)) { |
| | | if (cy1 > cy2) |
| | | count++; |
| | | } else if (isPointOnLine(cx2, cy2, linePoint1x, linePoint1y, |
| | | linePoint2x, linePoint2y)) { |
| | | if (cy2 > cy1) |
| | | count++; |
| | | } else if (isIntersect(cx1, cy1, cx2, cy2, linePoint1x, |
| | | linePoint1y, linePoint2x, linePoint2y)) { |
| | | count++; |
| | | } |
| | | } |
| | | if (count % 2 == 1) { |
| | | isInside = true; |
| | | } |
| | | |
| | | return isInside; |
| | | } |
| | | public static double Multiply(double px0, double py0, double px1, double py1, |
| | | double px2, double py2) { |
| | | return ((px1 - px0) * (py2 - py0) - (px2 - px0) * (py1 - py0)); |
| | | } |
| | | |
| | | public static boolean isPointOnLine(double px0, double py0, double px1, |
| | | double py1, double px2, double py2) { |
| | | boolean flag = false; |
| | | double ESP = 1e-9; |
| | | if ((Math.abs(Multiply(px0, py0, px1, py1, px2, py2)) < ESP) |
| | | && ((px0 - px1) * (px0 - px2) <= 0) |
| | | && ((py0 - py1) * (py0 - py2) <= 0)) { |
| | | flag = true; |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | public static boolean isIntersect(double px1, double py1, double px2, double py2, |
| | | double px3, double py3, double px4, double py4) { |
| | | boolean flag = false; |
| | | double d = (px2 - px1) * (py4 - py3) - (py2 - py1) * (px4 - px3); |
| | | if (d != 0) { |
| | | double r = ((py1 - py3) * (px4 - px3) - (px1 - px3) * (py4 - py3)) |
| | | / d; |
| | | double s = ((py1 - py3) * (px2 - px1) - (px1 - px3) * (py2 - py1)) |
| | | / d; |
| | | if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1)) { |
| | | flag = true; |
| | | } |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | } |