From b315a6943e6c0d6bdf0d5f7565c570d719154d6c Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 17 十二月 2025 14:56:58 +0800
Subject: [PATCH] 新增了障碍物管理页面
---
src/zhuye/MapRenderer.java | 80 +++++++++++++++++++++++++++++++++-------
1 files changed, 66 insertions(+), 14 deletions(-)
diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 8083749..3c79352 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -52,6 +52,7 @@
private static final Color GRASS_FILL_COLOR = new Color(144, 238, 144, 120);
private static final Color GRASS_BORDER_COLOR = new Color(60, 179, 113);
private static final Color BOUNDARY_POINT_COLOR = new Color(128, 0, 128);
+ private static final Color OBSTACLE_POINT_COLOR = new Color(255, 140, 0); // 姗欒壊锛岀敤浜庡尯鍒嗛殰纰嶇墿鐐�
private static final Color CIRCLE_SAMPLE_COLOR = new Color(220, 20, 60, 230);
private static final double CIRCLE_SAMPLE_SIZE = 0.54d;
private static final double BOUNDARY_POINT_MERGE_THRESHOLD = 0.05;
@@ -71,6 +72,7 @@
private String currentObstacleLandNumber;
private String boundaryName;
private boolean boundaryPointsVisible;
+ private boolean obstaclePointsVisible;
private double boundaryPointSizeScale = 1.0d;
private boolean previewSizingEnabled;
private String currentBoundaryLandNumber;
@@ -114,14 +116,15 @@
this.mowerUpdateTimer = createMowerTimer();
this.mowerInfoManager = new GecaojiMeg(visualizationPanel, mower);
setupMouseListeners();
- // 浠庨厤缃枃浠惰鍙栦笂娆′繚瀛樼殑缂╂斁姣斾緥
- loadScaleFromProperties();
+ // 浠庨厤缃枃浠惰鍙栦笂娆′繚瀛樼殑缂╂斁姣斾緥鍜岃鍥句腑蹇冨潗鏍�
+ loadViewSettingsFromProperties();
}
/**
- * 浠庨厤缃枃浠惰鍙栫缉鏀炬瘮渚�
+ * 浠庨厤缃枃浠惰鍙栫缉鏀炬瘮渚嬪拰瑙嗗浘涓績鍧愭爣
*/
- private void loadScaleFromProperties() {
+ private void loadViewSettingsFromProperties() {
+ // 鍔犺浇缂╂斁姣斾緥
String scaleValue = Setsys.getPropertyValue(MAP_SCALE_PROPERTY);
if (scaleValue != null && !scaleValue.trim().isEmpty()) {
try {
@@ -140,6 +143,28 @@
// 濡傛灉娌℃湁淇濆瓨鐨勫�硷紝浣跨敤榛樿鍊�
scale = DEFAULT_SCALE;
}
+
+ // 鍔犺浇瑙嗗浘涓績鍧愭爣
+ String viewCenterXValue = Setsys.getPropertyValue("viewCenterX");
+ String viewCenterYValue = Setsys.getPropertyValue("viewCenterY");
+ if (viewCenterXValue != null && !viewCenterXValue.trim().isEmpty()) {
+ try {
+ translateX = Double.parseDouble(viewCenterXValue.trim());
+ } catch (NumberFormatException e) {
+ translateX = 0.0;
+ }
+ } else {
+ translateX = 0.0;
+ }
+ if (viewCenterYValue != null && !viewCenterYValue.trim().isEmpty()) {
+ try {
+ translateY = Double.parseDouble(viewCenterYValue.trim());
+ } catch (NumberFormatException e) {
+ translateY = 0.0;
+ }
+ } else {
+ translateY = 0.0;
+ }
}
/**
@@ -147,7 +172,8 @@
*/
private void saveScaleToProperties() {
Setsys setsys = new Setsys();
- setsys.updateProperty(MAP_SCALE_PROPERTY, String.valueOf(scale));
+ // 淇濈暀2浣嶅皬鏁�
+ setsys.updateProperty(MAP_SCALE_PROPERTY, String.format("%.2f", scale));
}
/**
@@ -322,14 +348,11 @@
boolean hasPlannedPath = currentPlannedPath != null && currentPlannedPath.size() >= 2;
boolean hasObstacles = currentObstacles != null && !currentObstacles.isEmpty();
+ // 缁樺埗鍦板潡杈圭晫锛堝簳灞傦級
if (hasBoundary) {
drawCurrentBoundary(g2d);
}
- if (hasObstacles) {
- Obstacledraw.drawObstacles(g2d, currentObstacles, scale, selectedObstacleName);
- }
-
yulanzhangaiwu.renderPreview(g2d, scale);
if (!circleSampleMarkers.isEmpty()) {
@@ -342,10 +365,16 @@
adddikuaiyulan.drawPreview(g2d, handheldBoundaryPreview, scale, handheldBoundaryPreviewActive, boundaryPreviewMarkerScale);
+ // 缁樺埗瀵艰埅璺緞锛堜腑灞傦級
if (hasPlannedPath) {
drawCurrentPlannedPath(g2d);
}
+ // 缁樺埗闅滅鐗╋紙椤跺眰锛屾樉绀哄湪鍦板潡鍜屽鑸矾寰勪笂鏂癸級
+ if (hasObstacles) {
+ Obstacledraw.drawObstacles(g2d, currentObstacles, scale, selectedObstacleName);
+ }
+
if (boundaryPointsVisible && hasBoundary) {
double markerScale = boundaryPointSizeScale * (previewSizingEnabled ? PREVIEW_BOUNDARY_MARKER_SCALE : 1.0d);
pointandnumber.drawBoundaryPoints(
@@ -358,6 +387,22 @@
);
}
+ // 缁樺埗闅滅鐗╁潗鏍囩偣
+ if (obstaclePointsVisible && hasObstacles) {
+ List<Point2D.Double> obstaclePoints = Obstacledraw.getObstaclePoints(currentObstacles);
+ if (obstaclePoints != null && !obstaclePoints.isEmpty()) {
+ double markerScale = boundaryPointSizeScale * (previewSizingEnabled ? PREVIEW_BOUNDARY_MARKER_SCALE : 1.0d);
+ pointandnumber.drawBoundaryPoints(
+ g2d,
+ obstaclePoints,
+ scale,
+ BOUNDARY_POINT_MERGE_THRESHOLD,
+ OBSTACLE_POINT_COLOR,
+ markerScale
+ );
+ }
+ }
+
if (shouldRenderIdleTrail()) {
tuowei.draw(g2d, idleMowerTrail, scale);
}
@@ -1328,7 +1373,7 @@
/**
* 鍒ゆ柇瀹氫綅鐘舵�佹槸鍚︽湁鏁堬紝鍙敤浜庢樉绀烘嫋灏�
- * 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級鍜�4锛堝浐瀹氳В锛�
+ * 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級銆�2锛堢爜宸垎锛夈��3锛堟棤鏁圥PS锛夈��4锛堝浐瀹氳В锛夈��5锛堟诞鐐硅В锛�
*/
private boolean isValidFixForTrail(String fixQuality) {
if (fixQuality == null) {
@@ -1338,14 +1383,15 @@
if (trimmed.isEmpty()) {
return false;
}
- // 鎺ュ彈鐘舵��1锛堝崟鐐瑰畾浣嶏級鍜�4锛堝浐瀹氳В锛�
- if ("1".equals(trimmed) || "4".equals(trimmed)) {
+ // 鎺ュ彈鐘舵��1,2,3,4,5锛堝彧瑕佷笉鏄�0鎴栨棤鏁堢姸鎬侊級
+ if ("1".equals(trimmed) || "2".equals(trimmed) || "3".equals(trimmed) ||
+ "4".equals(trimmed) || "5".equals(trimmed)) {
return true;
}
try {
double value = Double.parseDouble(trimmed);
- // 鎺ュ彈1.0鎴�4.0
- return Math.abs(value - 1.0d) < 1e-6 || Math.abs(value - 4.0d) < 1e-6;
+ // 鎺ュ彈1.0, 2.0, 3.0, 4.0, 5.0锛堝彧瑕佷笉鏄�0锛�
+ return value >= 1.0 && value <= 5.0;
} catch (NumberFormatException ex) {
return false;
}
@@ -1718,6 +1764,7 @@
obstacleBounds = null;
selectedObstacleName = null;
currentObstacleLandNumber = null;
+ obstaclePointsVisible = false;
}
private List<Obstacledge.Obstacle> parseObstacles(String obstaclesData, String landNumber) {
@@ -2005,6 +2052,11 @@
visualizationPanel.repaint();
}
+ public void setObstaclePointsVisible(boolean visible) {
+ this.obstaclePointsVisible = visible;
+ visualizationPanel.repaint();
+ }
+
public void setBoundaryPointSizeScale(double sizeScale) {
double normalized = (Double.isFinite(sizeScale) && sizeScale > 0.0d) ? sizeScale : 1.0d;
if (Math.abs(boundaryPointSizeScale - normalized) < 1e-6) {
--
Gitblit v1.10.0