From f4a2ce6f608049dc11f00908ee8a829060882de3 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期四, 25 十二月 2025 16:38:32 +0800
Subject: [PATCH] 优化了部分内容
---
src/dikuai/daohangyulan.java | 151 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 126 insertions(+), 25 deletions(-)
diff --git a/src/dikuai/daohangyulan.java b/src/dikuai/daohangyulan.java
index a65ffcf..8d3bfaf 100644
--- a/src/dikuai/daohangyulan.java
+++ b/src/dikuai/daohangyulan.java
@@ -9,9 +9,10 @@
import java.util.ArrayList;
import zhuye.Shouye;
import zhuye.MapRenderer;
-import zhuye.buttonset;
+import gecaoji.Device;
import gecaoji.Gecaoji;
import gecaoji.lujingdraw;
+import publicway.buttonset;
/**
* 瀵艰埅棰勮鍔熻兘绫�
@@ -82,12 +83,85 @@
return;
}
- // 瑙f瀽璺緞鍧愭爣
- pathPoints = lujingdraw.parsePlannedPath(plannedPath);
- if (pathPoints == null || pathPoints.size() < 2) {
+ // 1. 瑙f瀽璺緞鍧愭爣锛堝師濮嬭矾寰勶級
+ List<Point2D.Double> rawPathPoints = lujingdraw.parsePlannedPath(plannedPath);
+ if (rawPathPoints == null || rawPathPoints.size() < 2) {
JOptionPane.showMessageDialog(null, "璺緞鍧愭爣瑙f瀽澶辫触锛屾棤娉曡繘琛屽鑸瑙�", "閿欒", JOptionPane.ERROR_MESSAGE);
return;
}
+
+ // 2. 灏濊瘯閲嶆柊鐢熸垚瀹屾暣璺緞娈碉紙鍖呭惈鍥磋竟鍜屼綔涓氳矾寰勶級
+ // 杩欐牱鍙互纭繚瀵艰埅棰勮鏃讹紝鍓茶崏鏈哄厛娌跨潃鍐呯缉杈圭晫璧颁竴鍦堬紝鍐嶈蛋鍓茶崏璺緞
+ List<lujing.Lunjingguihua.PathSegment> segments = null;
+ String boundaryCoords = dikuai.getBoundaryCoordinates();
+ String mowingWidth = dikuai.getMowingBladeWidth(); // 娉ㄦ剰锛氳繖閲屽簲璇ョ敤鍓茶崏瀹藉害锛岃�屼笉鏄壊鍒�瀹藉害锛岄�氬父鏄竴鏍风殑
+ // 濡傛灉娌℃湁鍓茶崏瀹藉害锛屽皾璇曚粠Device鑾峰彇
+ if (mowingWidth == null || mowingWidth.trim().isEmpty() || "-1".equals(mowingWidth.trim())) {
+ Device device = Device.getActiveDevice();
+ if (device != null) {
+ mowingWidth = device.getMowingWidth();
+ }
+ }
+ // 濡傛灉杩樻槸娌℃湁锛屼娇鐢ㄩ粯璁ゅ��
+ if (mowingWidth == null || mowingWidth.trim().isEmpty() || "-1".equals(mowingWidth.trim())) {
+ mowingWidth = "0.34";
+ }
+
+ String safetyDistance = dikuai.getMowingSafetyDistance();
+ String obstaclesCoords = dikuai.getObstacleCoordinates();
+ String mowingPattern = dikuai.getMowingPattern();
+
+ if (boundaryCoords != null && !boundaryCoords.trim().isEmpty() && !"-1".equals(boundaryCoords.trim())) {
+ try {
+ // 瑙f瀽鍓茶崏妯″紡
+ String mode = "parallel"; // 榛樿骞宠妯″紡
+ if (mowingPattern != null && !mowingPattern.trim().isEmpty()) {
+ String pattern = mowingPattern.trim().toLowerCase();
+ if ("1".equals(pattern) || "spiral".equals(pattern) || "铻烘棆寮�".equals(pattern) || "铻烘棆".equals(pattern)) {
+ mode = "spiral";
+ } else if ("parallel".equals(pattern) || "骞宠绾�".equals(pattern) || "骞宠".equals(pattern)) {
+ mode = "parallel";
+ }
+ }
+
+ // 璋冪敤璺緞瑙勫垝鐢熸垚瀹屾暣璺緞娈�
+ segments = lujing.Lunjingguihua.generatePathSegments(
+ boundaryCoords,
+ obstaclesCoords != null ? obstaclesCoords : "",
+ mowingWidth,
+ safetyDistance,
+ mode
+ );
+ } catch (Exception e) {
+ // 濡傛灉閲嶆柊鐢熸垚澶辫触锛宻egments 涓� null
+ System.err.println("瀵艰埅棰勮閲嶆柊鐢熸垚璺緞澶辫触: " + e.getMessage());
+ }
+ }
+
+ // 3. 鏋勫缓鏈�缁堝鑸矾寰勭偣鍒楄〃
+ pathPoints = new ArrayList<>();
+ if (segments != null && !segments.isEmpty()) {
+ // 濡傛灉鎴愬姛鐢熸垚浜嗚矾寰勬锛屼娇鐢ㄨ矾寰勬鏋勫缓鐐瑰垪琛�
+ // 杩欐牱鍖呭惈浜嗗洿杈硅矾寰勫拰浣滀笟璺緞锛屼互鍙婂畠浠箣闂寸殑杩炴帴
+ lujing.Lunjingguihua.PathSegment firstSeg = segments.get(0);
+ pathPoints.add(new Point2D.Double(firstSeg.start.x, firstSeg.start.y));
+
+ for (lujing.Lunjingguihua.PathSegment seg : segments) {
+ // 娣诲姞缁堢偣锛堣捣鐐瑰凡缁忓湪涓婁竴娆″惊鐜垨鍒濆鍖栨椂娣诲姞浜嗭級
+ // 娉ㄦ剰锛氳繖閲屽亣璁捐矾寰勬鏄繛缁殑锛屾垨鑰呮垜浠彧鍏冲績绔偣
+ // 濡傛灉娈典箣闂翠笉杩炵画锛堟湁绌鸿蛋锛夛紝generatePathSegments 搴旇宸茬粡鐢熸垚浜嗚繛鎺ユ锛坕sMowing=false锛�
+ pathPoints.add(new Point2D.Double(seg.end.x, seg.end.y));
+ }
+ } else {
+ // 濡傛灉鐢熸垚澶辫触锛屽洖閫�鍒颁娇鐢ㄥ師濮嬭В鏋愮殑璺緞鐐�
+ // 杩欓�氬父鍙寘鍚綔涓氳矾寰勶紝鍙兘娌℃湁鍥磋竟
+ pathPoints = rawPathPoints;
+ }
+
+ if (pathPoints == null || pathPoints.size() < 2) {
+ JOptionPane.showMessageDialog(null, "鏃犳硶鏋勫缓鏈夋晥鐨勫鑸矾寰�", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
this.currentDikuai = dikuai;
this.currentPathIndex = 0;
@@ -363,43 +437,67 @@
return;
}
- Point2D.Double targetPoint = pathPoints.get(currentPathIndex + 1);
-
- // 璁$畻鍒扮洰鏍囩偣鐨勮窛绂�
- double dx = targetPoint.x - currentPos.x;
- double dy = targetPoint.y - currentPos.y;
- double distance = Math.hypot(dx, dy);
-
// 璁$畻姣忓抚绉诲姩鐨勮窛绂伙紙绫筹級
double moveDistance = currentSpeed * (TIMER_INTERVAL_MS / 1000.0);
- if (distance <= moveDistance) {
- // 鍒拌揪鐩爣鐐癸紝绉诲姩鍒颁笅涓�涓偣
- mower.setPosition(targetPoint.x, targetPoint.y);
- navigationTrack.add(new Point2D.Double(targetPoint.x, targetPoint.y));
- mapRenderer.addNavigationPreviewTrackPoint(targetPoint);
+ // 鍒拌揪闃堝�硷細褰撹窛绂诲皬浜庤繖涓�兼椂锛岃涓哄凡鍒拌揪鐩爣鐐癸紙0.05绫筹級
+ double arrivalThreshold = 0.05;
+
+ // 寰幆澶勭悊锛岀洿鍒扮Щ鍔ㄨ窛绂荤敤瀹屾垨鍒拌揪璺緞缁堢偣
+ double remainingDistance = moveDistance;
+
+ while (remainingDistance > 0.001 && currentPathIndex < pathPoints.size() - 1) {
+ Point2D.Double targetPoint = pathPoints.get(currentPathIndex + 1);
- currentPathIndex++;
+ // 璁$畻鍒扮洰鏍囩偣鐨勮窛绂�
+ double dx = targetPoint.x - currentPos.x;
+ double dy = targetPoint.y - currentPos.y;
+ double distance = Math.hypot(dx, dy);
- // 濡傛灉杩樻湁涓嬩竴涓偣锛岃绠楁柟鍚�
- if (currentPathIndex < pathPoints.size() - 1) {
- Point2D.Double nextPoint = pathPoints.get(currentPathIndex + 1);
- double heading = calculateHeading(targetPoint, nextPoint);
- setMowerHeading(heading);
+ // 濡傛灉璺濈灏忎簬鍒拌揪闃堝�硷紝璁や负宸插埌杈剧洰鏍囩偣锛岀Щ鍔ㄥ埌涓嬩竴涓偣
+ if (distance <= arrivalThreshold) {
+ // 鍒拌揪鐩爣鐐癸紝绉诲姩鍒扮簿纭綅缃�
+ mower.setPosition(targetPoint.x, targetPoint.y);
+ navigationTrack.add(new Point2D.Double(targetPoint.x, targetPoint.y));
+ mapRenderer.addNavigationPreviewTrackPoint(targetPoint);
+
+ currentPos = new Point2D.Double(targetPoint.x, targetPoint.y);
+ currentPathIndex++;
+
+ // 濡傛灉杩樻湁涓嬩竴涓偣锛屾洿鏂版柟鍚�
+ if (currentPathIndex < pathPoints.size() - 1) {
+ Point2D.Double nextPoint = pathPoints.get(currentPathIndex + 1);
+ double heading = calculateHeading(targetPoint, nextPoint);
+ setMowerHeading(heading);
+ }
+
+ // 缁х画澶勭悊鍓╀綑鐨勭Щ鍔ㄨ窛绂�
+ continue;
}
- } else {
+
// 鍚戠洰鏍囩偣绉诲姩
- // 鍏堟洿鏂版柟鍚戯紝纭繚杞﹀ご鏈濆悜鐩爣鐐�
+ // 璁$畻鏈瀹為檯绉诲姩鐨勮窛绂伙紙涓嶈秴杩囧墿浣欒窛绂诲拰鍒扮洰鏍囩偣鐨勮窛绂伙級
+ double actualMoveDistance = Math.min(remainingDistance, distance);
+
+ // 鏇存柊鏂瑰悜锛岀‘淇濊溅澶存湞鍚戠洰鏍囩偣
double heading = calculateHeading(currentPos, targetPoint);
setMowerHeading(heading);
- double ratio = moveDistance / distance;
+ // 璁$畻鏂颁綅缃�
+ double ratio = actualMoveDistance / distance;
double newX = currentPos.x + dx * ratio;
double newY = currentPos.y + dy * ratio;
mower.setPosition(newX, newY);
navigationTrack.add(new Point2D.Double(newX, newY));
mapRenderer.addNavigationPreviewTrackPoint(new Point2D.Double(newX, newY));
+
+ // 鏇存柊褰撳墠浣嶇疆鍜屽墿浣欒窛绂�
+ currentPos = new Point2D.Double(newX, newY);
+ remainingDistance -= actualMoveDistance;
+
+ // 濡傛灉宸茬粡鍒拌揪鐩爣鐐归檮杩戯紙璺濈灏忎簬闃堝�硷級锛屽湪涓嬫寰幆涓細澶勭悊
+ // 缁х画寰幆澶勭悊鍓╀綑鐨勭Щ鍔ㄨ窛绂�
}
// 鏇存柊閫熷害鏄剧ず鍒板湴鍥炬覆鏌撳櫒
@@ -546,3 +644,6 @@
return isNavigating;
}
}
+
+
+
--
Gitblit v1.10.0