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 |  107 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 86 insertions(+), 21 deletions(-)

diff --git a/src/zhuye/adddikuaiyulan.java b/src/zhuye/adddikuaiyulan.java
index caa584d..4b382d2 100644
--- a/src/zhuye/adddikuaiyulan.java
+++ b/src/zhuye/adddikuaiyulan.java
@@ -17,6 +17,10 @@
     private static final Color HANDHELD_BOUNDARY_FILL = new Color(51, 153, 255, 60);
     private static final Color HANDHELD_BOUNDARY_BORDER = new Color(0, 100, 0, 220);
     private static final Color HANDHELD_BOUNDARY_POINT = new Color(0, 100, 0);
+    private static final double BASE_WORLD_MARKER_SIZE = 0.27d; // halve the base diameter for subtler markers
+    private static final double MIN_PIXEL_DIAMETER = 3.0d;
+    private static final double MAX_PIXEL_DIAMETER = 9.0d;
+    private static volatile double cachedMarkerPixelDiameter = -1.0d;
 
     private adddikuaiyulan() {
     }
@@ -24,45 +28,106 @@
     public static void drawPreview(Graphics2D g2d,
                                    List<Point2D.Double> previewPoints,
                                    double scale,
-                                   boolean previewActive) {
+                                   boolean previewActive,
+                                   double diameterScale) {
+        if (!previewActive) {
+            cachedMarkerPixelDiameter = -1.0d;
+        }
+
         if (g2d == null || !previewActive || previewPoints == null || previewPoints.isEmpty()) {
             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);
+        float outlineWidth = 0.1f;
+        
+        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);
+        }
 
-        double markerSize = 0.2d;
-        double markerRadius = markerSize / 2.0d;
+        if (cachedMarkerPixelDiameter <= 0.0d) {
+            double previousPixelDiameter = Math.abs(BASE_WORLD_MARKER_SIZE * scale);
+            if (previousPixelDiameter <= 0.0d) {
+                previousPixelDiameter = MIN_PIXEL_DIAMETER;
+            }
+            cachedMarkerPixelDiameter = Math.max(MIN_PIXEL_DIAMETER,
+                Math.min(MAX_PIXEL_DIAMETER, previousPixelDiameter));
+        }
+
+    double effectiveScale = Math.max(0.01d, scale);
+    double markerSize = cachedMarkerPixelDiameter / effectiveScale;
+    double normalizedScale = Double.isFinite(diameterScale) && diameterScale > 0.0d ? diameterScale : 1.0d;
+    markerSize *= normalizedScale;
+    double markerRadius = markerSize / 2.0d;
 
         for (Point2D.Double point : previewPoints) {
             if (point == null || !Double.isFinite(point.x) || !Double.isFinite(point.y)) {

--
Gitblit v1.10.0