From 8d68e8c24e5d7f7f363041ebfe6c2b4c26068fef Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 12 十二月 2025 17:23:12 +0800
Subject: [PATCH] 新增了点击开始判断割草机是否在边界内的判断
---
src/gecaoji/MowerBoundaryChecker.java | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 117 insertions(+), 0 deletions(-)
diff --git a/src/gecaoji/MowerBoundaryChecker.java b/src/gecaoji/MowerBoundaryChecker.java
new file mode 100644
index 0000000..636a7db
--- /dev/null
+++ b/src/gecaoji/MowerBoundaryChecker.java
@@ -0,0 +1,117 @@
+package gecaoji;
+
+import java.awt.geom.Point2D;
+import java.util.List;
+
+/**
+ * 鍓茶崏鏈鸿竟鐣屾鏌ュ伐鍏风被銆�
+ *
+ * 鐢ㄦ硶濂戠害锛�
+ * - 杈撳叆鐨勫湴鍧楄竟鐣屼负闂悎鐨勫杈瑰舰鐐瑰簭鍒楋紙椤哄簭涓洪『鏃堕拡鎴栭�嗘椂閽堝潎鍙級锛屾瘡涓偣鍖呭惈 X锛堢背锛夈�乊锛堢背锛夊潗鏍囥��
+ * - 鑻ョ偣浣嶄簬澶氳竟褰㈠唴閮ㄦ垨浣嶄簬杈圭晫绾夸笂锛岃繑鍥� true锛涘惁鍒欒繑鍥� false銆�
+ */
+public final class MowerBoundaryChecker {
+
+ private MowerBoundaryChecker() { }
+
+ /**
+ * 鍒ゆ柇缁欏畾鐐规槸鍚﹀湪杈圭晫澶氳竟褰㈠唴閮紙鍚竟鐣岋級銆�
+ *
+ * @param polygonPoints 杈圭晫鐐瑰垪琛紝姣忎釜鍏冪礌涓� double[2]锛岀储寮�0涓簒锛岀储寮�1涓簓锛涜嚦灏戦渶瑕�3涓偣
+ * @param x 鍓茶崏鏈哄疄鏃禭鍧愭爣锛堢背锛�
+ * @param y 鍓茶崏鏈哄疄鏃禮鍧愭爣锛堢背锛�
+ * @return 濡傛灉鐐瑰湪澶氳竟褰㈠唴閮ㄦ垨杈圭晫涓婂垯杩斿洖 true锛涘惁鍒欒繑鍥� false
+ */
+ public static boolean isInsideBoundary(List<double[]> polygonPoints, double x, double y) {
+ if (polygonPoints == null || polygonPoints.size() < 3) {
+ return false;
+ }
+ int n = polygonPoints.size();
+ boolean inside = false;
+ for (int i = 0, j = n - 1; i < n; j = i++) {
+ double xi = polygonPoints.get(i)[0];
+ double yi = polygonPoints.get(i)[1];
+ double xj = polygonPoints.get(j)[0];
+ double yj = polygonPoints.get(j)[1];
+
+ // 鍒ゆ柇鐐规槸鍚﹀湪褰撳墠杈逛笂锛堣�冭檻娴偣瀹瑰樊锛�
+ if (pointOnSegment(xj, yj, xi, yi, x, y)) {
+ return true;
+ }
+
+ boolean intersect = ((yi > y) != (yj > y)) &&
+ (x < (xj - xi) * (y - yi) / (yj - yi + 0.0) + xi);
+ if (intersect) {
+ inside = !inside;
+ }
+ }
+ return inside;
+ }
+
+ /**
+ * 閲嶈浇锛氭帴鍙� Point2D 鍒楄〃
+ */
+ public static boolean isInsideBoundaryPoints(List<Point2D.Double> polygonPoints, double x, double y) {
+ if (polygonPoints == null || polygonPoints.size() < 3) {
+ return false;
+ }
+ int n = polygonPoints.size();
+ boolean inside = false;
+ for (int i = 0, j = n - 1; i < n; j = i++) {
+ double xi = polygonPoints.get(i).x;
+ double yi = polygonPoints.get(i).y;
+ double xj = polygonPoints.get(j).x;
+ double yj = polygonPoints.get(j).y;
+
+ if (pointOnSegment(xj, yj, xi, yi, x, y)) {
+ return true;
+ }
+
+ boolean intersect = ((yi > y) != (yj > y)) &&
+ (x < (xj - xi) * (y - yi) / (yj - yi + 0.0) + xi);
+ if (intersect) {
+ inside = !inside;
+ }
+ }
+ return inside;
+ }
+
+ /**
+ * 閲嶈浇锛氭帴鍙椾簩缁存暟缁� double[][]锛屾瘡琛� [x,y]
+ */
+ public static boolean isInsideBoundary(double[][] polygon, double x, double y) {
+ if (polygon == null || polygon.length < 3) {
+ return false;
+ }
+ int n = polygon.length;
+ boolean inside = false;
+ for (int i = 0, j = n - 1; i < n; j = i++) {
+ double xi = polygon[i][0];
+ double yi = polygon[i][1];
+ double xj = polygon[j][0];
+ double yj = polygon[j][1];
+
+ if (pointOnSegment(xj, yj, xi, yi, x, y)) {
+ return true;
+ }
+
+ boolean intersect = ((yi > y) != (yj > y)) &&
+ (x < (xj - xi) * (y - yi) / (yj - yi + 0.0) + xi);
+ if (intersect) {
+ inside = !inside;
+ }
+ }
+ return inside;
+ }
+
+ // 鍒ゆ柇鐐规槸鍚﹀湪绾挎 (x1,y1)-(x2,y2) 涓婏紙鍖呮嫭绔偣锛夛紝鍏佽灏忕殑鏁板�艰宸�
+ private static boolean pointOnSegment(double x1, double y1, double x2, double y2, double px, double py) {
+ double cross = (px - x1) * (y2 - y1) - (py - y1) * (x2 - x1);
+ double eps = 1e-8;
+ if (Math.abs(cross) > eps) {
+ return false;
+ }
+ double dot = (px - x1) * (px - x2) + (py - y1) * (py - y2);
+ return dot <= eps;
+ }
+}
--
Gitblit v1.10.0