From 48ee74129bb09a817a0bbbabe860c4007b74c66b Mon Sep 17 00:00:00 2001
From: 826220679@qq.com <826220679@qq.com>
Date: 星期日, 21 十二月 2025 12:37:44 +0800
Subject: [PATCH] 新增了往返路径

---
 src/zhuye/MapRenderer.java |  142 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 31b93b8..ed61778 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -31,6 +31,7 @@
 import zhangaiwu.Obstacledge;
 import zhangaiwu.yulanzhangaiwu;
 import yaokong.Control03;
+import bianjie.shudongdraw;
 
 /**
  * 鍦板浘娓叉煋鍣� - 璐熻矗鍧愭爣绯荤粯鍒躲�佽鍥惧彉鎹㈢瓑鍔熻兘
@@ -102,9 +103,13 @@
     private boolean measurementModeActive = false;  // 娴嬮噺妯″紡鏄惁婵�娲�
     private boolean handheldBoundaryPreviewActive;
     private boolean pendingTrackBreak = true;
+    private bianjie.shudongdraw manualBoundaryDrawer = new bianjie.shudongdraw();  // 鎵嬪姩缁樺埗杈圭晫缁樺埗鍣�
     private boolean idleTrailSuppressed;
     private Path2D.Double realtimeBoundaryPathCache;
     private String realtimeBoundaryPathLand;
+    private WangfanDraw returnPathDrawer;  // 寰�杩旇矾寰勭粯鍒剁鐞嗗櫒
+    private List<Point2D.Double> currentReturnPath; // 褰撳墠鍦板潡鐨勫線杩旇矾寰勶紙鐢ㄤ簬鏄剧ず锛�
+    private List<Point2D.Double> previewReturnPath; // 棰勮鐨勫線杩旇矾寰�
 
     private static final double TRACK_SAMPLE_MIN_DISTANCE_METERS = 0.2d;
     private static final double TRACK_DUPLICATE_TOLERANCE_METERS = 1e-3d;
@@ -207,6 +212,14 @@
                 lastDragPoint = null;
                 dragInProgress = false;
             }
+            
+            public void mouseExited(MouseEvent e) {
+                // 榧犳爣绂诲紑闈㈡澘鏃讹紝娓呴櫎榧犳爣浣嶇疆鏄剧ず
+                if (manualBoundaryDrawer.isManualBoundaryDrawingMode()) {
+                    manualBoundaryDrawer.clearMousePosition();
+                    visualizationPanel.repaint();
+                }
+            }
 
             public void mouseClicked(MouseEvent e) {
                 if (dragInProgress) {
@@ -216,6 +229,14 @@
                 if (!SwingUtilities.isLeftMouseButton(e) || e.getClickCount() != 1) {
                     return;
                 }
+                // 浼樺厛澶勭悊鎵嬪姩缁樺埗杈圭晫妯″紡鐐瑰嚮
+                if (manualBoundaryDrawer.isManualBoundaryDrawingMode()) {
+                    Point2D.Double worldPoint = screenToWorld(e.getPoint());
+                    if (manualBoundaryDrawer.handleClick(worldPoint)) {
+                        visualizationPanel.repaint();
+                        return;
+                    }
+                }
                 // 浼樺厛澶勭悊娴嬮噺妯″紡鐐瑰嚮
                 if (measurementModeActive && handleMeasurementClick(e.getPoint())) {
                     return;
@@ -248,6 +269,17 @@
                     visualizationPanel.repaint();
                 }
             }
+            
+            public void mouseMoved(MouseEvent e) {
+                // 鍦ㄦ墜鍔ㄧ粯鍒惰竟鐣屾ā寮忔椂锛屾洿鏂伴紶鏍囦綅缃�
+                if (manualBoundaryDrawer.isManualBoundaryDrawingMode()) {
+                    Point2D.Double worldPoint = screenToWorld(e.getPoint());
+                    manualBoundaryDrawer.updateMousePosition(worldPoint);
+                    visualizationPanel.repaint();
+                } else {
+                    manualBoundaryDrawer.clearMousePosition();
+                }
+            }
         });
     }
 
@@ -378,6 +410,12 @@
 
     adddikuaiyulan.drawPreview(g2d, handheldBoundaryPreview, scale, handheldBoundaryPreviewActive, boundaryPreviewMarkerScale);
 
+        // 缁樺埗鎵嬪姩缁樺埗鐨勮竟鐣�
+        manualBoundaryDrawer.drawBoundary(g2d, scale);
+        
+        // 缁樺埗榧犳爣瀹炴椂浣嶇疆锛堟墜鍔ㄧ粯鍒惰竟鐣屾ā寮忔椂锛�
+        manualBoundaryDrawer.drawMousePosition(g2d, scale);
+
         // 缁樺埗瀵艰埅璺緞锛堜腑灞傦級
         if (hasPlannedPath) {
             drawCurrentPlannedPath(g2d);
@@ -424,6 +462,17 @@
             drawNavigationPreviewCoverage(g2d);
         }
 
+        // 鍏堢敾寰�杩旇矾寰勶紙绾�+鐐癸級锛屼繚璇佸壊鑽夋満鍥炬爣鍦ㄥ叾涓婃柟
+        if (returnPathDrawer != null && returnPathDrawer.isActive()) {
+            returnPathDrawer.draw(g2d, scale);
+        } else if (previewReturnPath != null && !previewReturnPath.isEmpty()) {
+            // 缁樺埗棰勮鐨勫線杩旇矾寰勶紙閾佺嚎璺浘椋庢牸锛�
+            WangfanDraw.drawRailwayPath(g2d, previewReturnPath, scale);
+        } else if (currentReturnPath != null && !currentReturnPath.isEmpty()) {
+            // 缁樺埗淇濆瓨鐨勫線杩旇矾寰勶紙閾佺嚎璺浘椋庢牸锛�
+            WangfanDraw.drawRailwayPath(g2d, currentReturnPath, scale);
+        }
+
         drawMower(g2d);
         
         // 缁樺埗瀵艰埅棰勮閫熷害锛堝鏋滄鍦ㄥ鑸瑙堬級
@@ -927,6 +976,14 @@
             mowerEffectiveWidthMeters = defaultMowerWidthMeters;
         }
 
+        // 鍔犺浇寰�杩旇矾寰�
+        String returnPathStr = dikuai != null ? dikuai.getReturnPathCoordinates() : null;
+        if (returnPathStr != null && !returnPathStr.isEmpty() && !"-1".equals(returnPathStr)) {
+            currentReturnPath = lujingdraw.parsePlannedPath(returnPathStr);
+        } else {
+            currentReturnPath = null;
+        }
+
         loadRealtimeTrack(landNumber, dikuai != null ? dikuai.getMowingTrack() : null);
         visualizationPanel.repaint();
     }
@@ -1223,6 +1280,33 @@
     }
     
     /**
+     * 璁剧疆鎵嬪姩缁樺埗杈圭晫妯″紡
+     */
+    public void setManualBoundaryDrawingMode(boolean active) {
+        manualBoundaryDrawer.setManualBoundaryDrawingMode(active);
+        if (visualizationPanel != null) {
+            visualizationPanel.repaint();
+        }
+    }
+    
+    /**
+     * 鑾峰彇鎵嬪姩缁樺埗鐨勮竟鐣岀偣鍒楄〃
+     */
+    public List<Point2D.Double> getManualBoundaryPoints() {
+        return manualBoundaryDrawer.getManualBoundaryPoints();
+    }
+    
+    /**
+     * 娓呯┖鎵嬪姩缁樺埗鐨勮竟鐣岀偣
+     */
+    public void clearManualBoundaryPoints() {
+        manualBoundaryDrawer.clearManualBoundaryPoints();
+        if (visualizationPanel != null) {
+            visualizationPanel.repaint();
+        }
+    }
+    
+    /**
      * 璁剧疆娴嬮噺妯″紡
      */
     public void setMeasurementMode(boolean active) {
@@ -2931,5 +3015,63 @@
     public Gecaoji getMower() {
         return mower;
     }
+    
+    /**
+     * 璁剧疆寰�杩旇矾寰勭粯鍒剁鐞嗗櫒
+     */
+    public void setReturnPathDrawer(WangfanDraw drawer) {
+        this.returnPathDrawer = drawer;
+    }
+
+    /**
+     * 璁剧疆棰勮鐨勫線杩旇矾寰�
+     */
+    public void setPreviewReturnPath(List<Point2D.Double> path) {
+        this.previewReturnPath = path;
+        if (visualizationPanel != null) {
+            visualizationPanel.repaint();
+        }
+    }
+    
+    /**
+     * 寮�濮嬪線杩旇矾寰勭粯鍒�
+     */
+    public void startReturnPathDrawing() {
+        if (returnPathDrawer != null) {
+            // 绂佺敤鎷栧熬鏁堟灉锛堝湪寰�杩旇矾寰勭粯鍒舵ā寮忎笅涓嶆樉绀哄疄鏃惰建杩规嫋灏撅級
+            idleTrailSuppressed = true;
+            clearIdleMowerTrail();
+            // 娓呯┖涔嬪墠鐨勮矾寰勭偣锛堥�氳繃 WangfanDraw 绠$悊锛�
+            repaint();
+        }
+    }
+    
+    /**
+     * 鍋滄寰�杩旇矾寰勭粯鍒�
+     */
+    public void stopReturnPathDrawing() {
+        // 鎭㈠鎷栧熬鏁堟灉
+        idleTrailSuppressed = false;
+        repaint();
+    }
+    
+    /**
+     * 娣诲姞寰�杩旇矾寰勭偣锛堝凡搴熷純锛岃矾寰勭偣鐢� WangfanDraw 鐩存帴绠$悊锛�
+     */
+    @Deprecated
+    public void addReturnPathPoint(double x, double y) {
+        // 璺緞鐐圭敱 WangfanDraw 鐩存帴绠$悊锛岃繖閲屽彧闇�瑕侀噸缁�
+        repaint();
+    }
+    
+    /**
+     * 鑾峰彇寰�杩旇矾寰勭偣鍒楄〃鐨勫揩鐓�
+     */
+    public List<Point2D.Double> getReturnPathPointsSnapshot() {
+        if (returnPathDrawer != null) {
+            return returnPathDrawer.getPointsSnapshot();
+        }
+        return new ArrayList<>();
+    }
 
 }
\ No newline at end of file

--
Gitblit v1.10.0