张世豪
10 小时以前 13d032241e1a2938a8be4f64c9171e1240e9ea1e
src/zhuye/MapRenderer.java
@@ -110,6 +110,9 @@
    private WangfanDraw returnPathDrawer;  // 往返路径绘制管理器
    private List<Point2D.Double> currentReturnPath; // 当前地块的往返路径(用于显示)
    private List<Point2D.Double> previewReturnPath; // 预览的往返路径
    private List<Point2D.Double> previewOriginalBoundary; // 预览的原始边界(紫色)
    private List<Point2D.Double> previewOptimizedBoundary; // 预览的优化后边界
    private boolean boundaryPreviewActive; // 是否处于边界预览模式
    private static final double TRACK_SAMPLE_MIN_DISTANCE_METERS = 0.2d;
    private static final double TRACK_DUPLICATE_TOLERANCE_METERS = 1e-3d;
@@ -397,6 +400,11 @@
        if (hasBoundary) {
            drawCurrentBoundary(g2d);
        }
        // 绘制边界预览(原始边界-紫色,优化后边界)
        if (boundaryPreviewActive) {
            drawBoundaryPreview(g2d);
        }
        yulanzhangaiwu.renderPreview(g2d, scale);
@@ -3073,5 +3081,68 @@
        }
        return new ArrayList<>();
    }
    /**
     * 设置边界预览数据(原始边界和优化后边界)
     */
    public void setBoundaryPreview(String originalBoundaryXY, String optimizedBoundary) {
        if (originalBoundaryXY != null && !originalBoundaryXY.trim().isEmpty() && !"-1".equals(originalBoundaryXY.trim())) {
            previewOriginalBoundary = parseBoundary(originalBoundaryXY.trim());
        } else {
            previewOriginalBoundary = null;
        }
        if (optimizedBoundary != null && !optimizedBoundary.trim().isEmpty() && !"-1".equals(optimizedBoundary.trim())) {
            previewOptimizedBoundary = parseBoundary(optimizedBoundary.trim());
        } else {
            previewOptimizedBoundary = null;
        }
        boundaryPreviewActive = (previewOriginalBoundary != null && previewOriginalBoundary.size() >= 2) ||
                               (previewOptimizedBoundary != null && previewOptimizedBoundary.size() >= 2);
        if (boundaryPreviewActive) {
            // 计算预览边界的边界框并调整视图
            List<Point2D.Double> allPoints = new ArrayList<>();
            if (previewOriginalBoundary != null) allPoints.addAll(previewOriginalBoundary);
            if (previewOptimizedBoundary != null) allPoints.addAll(previewOptimizedBoundary);
            if (!allPoints.isEmpty()) {
                Rectangle2D.Double bounds = computeBounds(allPoints);
                SwingUtilities.invokeLater(() -> {
                    fitBoundsToView(bounds);
                    visualizationPanel.repaint();
                });
            }
        } else {
            visualizationPanel.repaint();
        }
    }
    /**
     * 清除边界预览
     */
    public void clearBoundaryPreview() {
        previewOriginalBoundary = null;
        previewOptimizedBoundary = null;
        boundaryPreviewActive = false;
        visualizationPanel.repaint();
    }
    /**
     * 绘制边界预览(原始边界-紫色,优化后边界-绿色)
     */
    private void drawBoundaryPreview(Graphics2D g2d) {
        // 绘制原始边界(紫色)
        if (previewOriginalBoundary != null && previewOriginalBoundary.size() >= 2) {
            Color purpleFill = new Color(128, 0, 128, 80); // 紫色半透明填充
            Color purpleBorder = new Color(128, 0, 128, 255); // 紫色边框
            bianjiedrwa.drawBoundary(g2d, previewOriginalBoundary, scale, purpleFill, purpleBorder);
        }
        // 绘制优化后边界(绿色,与正常边界颜色一致)
        if (previewOptimizedBoundary != null && previewOptimizedBoundary.size() >= 2) {
            bianjiedrwa.drawBoundary(g2d, previewOptimizedBoundary, scale, GRASS_FILL_COLOR, GRASS_BORDER_COLOR);
        }
    }
}