From f1ba329891967bca6d083a9d5722683a9fa2080b Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 22 九月 2025 09:17:10 +0800
Subject: [PATCH] Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/ZhaoYangChuXing

---
 DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ElectricFenceUtil.java |  127 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 127 insertions(+), 0 deletions(-)

diff --git a/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ElectricFenceUtil.java b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ElectricFenceUtil.java
new file mode 100644
index 0000000..7679220
--- /dev/null
+++ b/DriverZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ElectricFenceUtil.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 电子围栏工具类
+ */
+public class ElectricFenceUtil {
+
+//    public static void main(String[] args) {
+//        boolean b = monitorElectricFenc("30.96233482687816,114.0918266313389;30.688443972530024,113.79746988182933;30.278129271486836,114.13781987344977;30.250180498063333,114.57475567350305;30.513377702529993,114.74493066931328;30.755997553111357,114.7725266145798;30.966298453688317,114.5747556735030", "114.311754,30.598604");
+//        System.err.println(b);
+//    }
+
+
+    /**
+     * @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;
+    }
+
+}

--
Gitblit v1.7.1