From f0d6cefec73492c29d8323e66fb92ee6bbb60cd2 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 26 十二月 2025 18:58:23 +0800
Subject: [PATCH] 优化了预览时候视图居中的逻辑
---
src/gecaoji/Gecaoji.java | 66 ++++++++++++++++++++++++++++++--
1 files changed, 61 insertions(+), 5 deletions(-)
diff --git a/src/gecaoji/Gecaoji.java b/src/gecaoji/Gecaoji.java
index 2aca713..18493ec 100644
--- a/src/gecaoji/Gecaoji.java
+++ b/src/gecaoji/Gecaoji.java
@@ -49,6 +49,11 @@
}
public void refreshFromDevice() {
+ // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮忥紝濡傛灉鏄垯涓嶆洿鏂颁綅缃�
+ if (isNavigating()) {
+ return;
+ }
+
Device device = Device.getGecaoji();
if (device == null) {
positionValid = false;
@@ -57,7 +62,7 @@
double x = parseCoordinate(device.getRealtimeX());
double y = parseCoordinate(device.getRealtimeY());
- double heading = parseHeading(device.getHeading());
+ double heading = parseHeading(device.getYaw());
if (Double.isNaN(x) || Double.isNaN(y)) {
// Keep showing the last known mower position when temporary sensor glitches occur.
return;
@@ -69,6 +74,22 @@
positionValid = true;
headingDegrees = heading;
}
+
+ /**
+ * 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+ * @return 濡傛灉姝e湪瀵艰埅棰勮杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+ */
+ private boolean isNavigating() {
+ try {
+ dikuai.daohangyulan nav = dikuai.daohangyulan.getInstance();
+ if (nav != null) {
+ return nav.isNavigating();
+ }
+ } catch (Exception e) {
+ // 濡傛灉鑾峰彇瀵艰埅瀹炰緥澶辫触锛岃繑鍥瀎alse锛堜笉褰卞搷涓昏鍔熻兘锛�
+ }
+ return false;
+ }
private void ensurePosition() {
if (position == null) {
@@ -130,7 +151,8 @@
double iconHeight = icon.getHeight(null);
double maxSide = Math.max(iconWidth, iconHeight);
double scaleFactor = worldSize / Math.max(maxSide, MIN_SCALE);
- double rotationRadians = Math.toRadians(-headingDegrees);
+ // 鍓茶崏鏈哄浘鏍囬粯璁ゆ湞鍗楋紝Yaw=0琛ㄧず姝e寳锛岄渶瑕佹棆杞�180搴�
+ double rotationRadians = Math.toRadians(headingDegrees + 180);
AffineTransform original = g2d.getTransform();
AffineTransform transformed = new AffineTransform(original);
@@ -155,9 +177,11 @@
g2d.fill(fallbackShape);
g2d.setColor(Color.WHITE);
g2d.draw(fallbackShape);
- double rotationRadians = Math.toRadians(-headingDegrees);
- double lineLength = radius;
- double dx = lineLength * Math.sin(rotationRadians);
+ // Yaw=0琛ㄧず姝e寳(0, -1)锛屼娇鐢╯in/cos璁$畻鍧愭爣
+ // sin(180)=0, cos(180)=-1 -> 姝e寳
+ double rotationRadians = Math.toRadians(180 - headingDegrees);
+ double lineLength = radius;
+ double dx = lineLength * Math.sin(rotationRadians);
double dy = lineLength * Math.cos(rotationRadians);
g2d.drawLine(
(int) Math.round(position.x),
@@ -179,6 +203,38 @@
return new Point2D.Double(position.x, position.y);
}
+ /**
+ * 璁剧疆鍓茶崏鏈轰綅缃紙鐢ㄤ簬瀵艰埅棰勮绛夊満鏅級
+ * @param x X鍧愭爣
+ * @param y Y鍧愭爣
+ */
+ public void setPosition(double x, double y) {
+ ensurePosition();
+ position.x = x;
+ position.y = y;
+ positionValid = true;
+ }
+
+ /**
+ * 璁剧疆鍓茶崏鏈烘柟鍚戯紙鐢ㄤ簬瀵艰埅棰勮绛夊満鏅級
+ * @param headingDegrees 鏂瑰悜瑙掑害锛堝害锛�0-360锛�
+ */
+ public void setHeading(double headingDegrees) {
+ double normalized = headingDegrees % 360.0;
+ if (normalized < 0) {
+ normalized += 360.0;
+ }
+ this.headingDegrees = normalized;
+ }
+
+ /**
+ * 鑾峰彇鍓茶崏鏈烘柟鍚�
+ * @return 鏂瑰悜瑙掑害锛堝害锛�0-360锛�
+ */
+ public double getHeading() {
+ return headingDegrees;
+ }
+
public double getWorldRadius(double scale) {
if (!positionValid) {
return Double.NaN;
--
Gitblit v1.10.0