From dc9dce0555beb85d1262893fd5d56747d6a83855 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 19 十二月 2025 11:48:37 +0800
Subject: [PATCH] 新增了导航预览功能

---
 src/zhuye/adddikuaiyulan.java |   78 ++++++++++++++++++++++++++++++--------
 1 files changed, 61 insertions(+), 17 deletions(-)

diff --git a/src/zhuye/adddikuaiyulan.java b/src/zhuye/adddikuaiyulan.java
index 3307106..4b382d2 100644
--- a/src/zhuye/adddikuaiyulan.java
+++ b/src/zhuye/adddikuaiyulan.java
@@ -38,37 +38,81 @@
             return;
         }
 
-        Path2D.Double path = new Path2D.Double();
-        boolean started = false;
+        // 杩囨护鏈夋晥鐐�
+        List<Point2D.Double> validPoints = new java.util.ArrayList<>();
         for (Point2D.Double point : previewPoints) {
-            if (point == null || !Double.isFinite(point.x) || !Double.isFinite(point.y)) {
-                continue;
-            }
-            if (!started) {
-                path.moveTo(point.x, point.y);
-                started = true;
-            } else {
-                path.lineTo(point.x, point.y);
+            if (point != null && Double.isFinite(point.x) && Double.isFinite(point.y)) {
+                validPoints.add(point);
             }
         }
 
-        if (!started) {
+        if (validPoints.isEmpty()) {
             return;
         }
 
         Stroke originalStroke = g2d.getStroke();
         Color originalColor = g2d.getColor();
 
-        if (previewPoints.size() >= 3) {
-            path.closePath();
+        // 鍒涘缓濉厖璺緞锛堝鏋滅偣鏁�>=3锛岄渶瑕侀棴鍚堜互濉厖锛�
+        Path2D.Double fillPath = new Path2D.Double();
+        if (validPoints.size() >= 3) {
+            fillPath.moveTo(validPoints.get(0).x, validPoints.get(0).y);
+            for (int i = 1; i < validPoints.size(); i++) {
+                fillPath.lineTo(validPoints.get(i).x, validPoints.get(i).y);
+            }
+            fillPath.closePath();
             g2d.setColor(HANDHELD_BOUNDARY_FILL);
-            g2d.fill(path);
+            g2d.fill(fillPath);
         }
 
         float outlineWidth = 0.1f;
-        g2d.setStroke(new BasicStroke(outlineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
-        g2d.setColor(HANDHELD_BOUNDARY_BORDER);
-        g2d.draw(path);
+        
+        if (validPoints.size() >= 3) {
+            // 鐐规暟>=3鏃讹紝闇�瑕佸垎鍒粯鍒跺疄绾垮拰铏氱嚎
+            // 缁樺埗瀹炵嚎閮ㄥ垎锛氫粠璧风偣渚濇杩炴帴鍒板悇涓偣锛堜笉闂悎锛屼笉鍖呮嫭璧风偣鍒扮粓鐐圭殑鐩存帴杩炵嚎锛�
+            Path2D.Double solidPath = new Path2D.Double();
+            solidPath.moveTo(validPoints.get(0).x, validPoints.get(0).y);
+            // 浠庣浜屼釜鐐瑰紑濮嬶紝渚濇杩炴帴鍒版渶鍚庝竴涓偣锛堝舰鎴愪笉闂悎鐨勮矾寰勶級
+            for (int i = 1; i < validPoints.size(); i++) {
+                solidPath.lineTo(validPoints.get(i).x, validPoints.get(i).y);
+            }
+            g2d.setStroke(new BasicStroke(outlineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+            g2d.setColor(HANDHELD_BOUNDARY_BORDER);
+            g2d.draw(solidPath);
+            
+            // 鐢ㄨ櫄绾跨粯鍒惰捣鐐瑰埌缁堢偣鐨勮繛绾匡紙闂悎绾挎锛�
+            Point2D.Double startPoint = validPoints.get(0);
+            Point2D.Double endPoint = validPoints.get(validPoints.size() - 1);
+            
+            // 鍒涘缓铏氱嚎鏍峰紡锛堟牴鎹缉鏀捐皟鏁磋櫄绾挎ā寮忥級
+            double effectiveScale = Math.max(0.01d, scale);
+            float dashLength = (float) (0.05 / effectiveScale); // 铏氱嚎闀垮害闅忕缉鏀捐皟鏁�
+            float[] dashPattern = new float[]{dashLength, dashLength}; // 铏氱嚎妯″紡锛氬疄绾裤�佺┖鐧�
+            BasicStroke dashedStroke = new BasicStroke(
+                outlineWidth,
+                BasicStroke.CAP_ROUND,
+                BasicStroke.JOIN_ROUND,
+                1.0f,
+                dashPattern,
+                0.0f
+            );
+            
+            g2d.setStroke(dashedStroke);
+            g2d.setColor(HANDHELD_BOUNDARY_BORDER);
+            // 浣跨敤Path2D缁樺埗璧风偣鍒扮粓鐐圭殑铏氱嚎锛屼互渚挎敮鎸佹诞鐐瑰潗鏍�
+            Path2D.Double dashedLine = new Path2D.Double();
+            dashedLine.moveTo(startPoint.x, startPoint.y);
+            dashedLine.lineTo(endPoint.x, endPoint.y);
+            g2d.draw(dashedLine);
+        } else if (validPoints.size() == 2) {
+            // 濡傛灉鍙湁2涓偣锛岀洿鎺ョ粯鍒跺疄绾�
+            Path2D.Double simplePath = new Path2D.Double();
+            simplePath.moveTo(validPoints.get(0).x, validPoints.get(0).y);
+            simplePath.lineTo(validPoints.get(1).x, validPoints.get(1).y);
+            g2d.setStroke(new BasicStroke(outlineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+            g2d.setColor(HANDHELD_BOUNDARY_BORDER);
+            g2d.draw(simplePath);
+        }
 
         if (cachedMarkerPixelDiameter <= 0.0d) {
             double previousPixelDiameter = Math.abs(BASE_WORLD_MARKER_SIZE * scale);

--
Gitblit v1.10.0