diff --git a/doc/requirement/todo_features.md b/doc/requirement/todo_features.md
index 8a06cb9..bd6bacb 100644
--- a/doc/requirement/todo_features.md
+++ b/doc/requirement/todo_features.md
@@ -4,7 +4,8 @@
### [2025/09/09]
-1. [ ] (功能)增加安全优先路径策略
+1. [x] (功能)增加安全优先路径策略
+2. [x] (功能) 增加路径斜线优化
### [2025/09/08]
diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs
index 91b133b..b7cbc51 100644
--- a/src/PathPlanning/AutoPathFinder.cs
+++ b/src/PathPlanning/AutoPathFinder.cs
@@ -769,6 +769,67 @@ namespace NavisworksTransport.PathPlanning
}
}
+ ///
+ /// 专门的斜线路径优化算法
+ /// 在现有优化基础上,通过更激进的斜线连接进一步减少路径点数
+ ///
+ /// 已经过初步优化的路径
+ /// 网格地图
+ /// 经过斜线优化后的路径
+ private List ApplyDiagonalOptimization(List optimizedPath, GridMap gridMap)
+ {
+ if (optimizedPath.Count <= 2)
+ return optimizedPath;
+
+ try
+ {
+ LogManager.Info($"[斜线优化] 开始斜线路径优化,输入路径包含 {optimizedPath.Count} 个点");
+
+ var diagonalOptimizedPath = new List { optimizedPath[0] }; // 保留起点
+
+ int currentIndex = 0;
+ while (currentIndex < optimizedPath.Count - 1)
+ {
+ int farthestIndex = currentIndex + 1; // 默认下一个点
+
+ // 🔥 更激进的斜线检测:从P+2开始尝试,直到找到最远可连接点
+ for (int testIndex = currentIndex + 2; testIndex < optimizedPath.Count; testIndex++)
+ {
+ if (IsDirectPathClear(optimizedPath[currentIndex], optimizedPath[testIndex], gridMap))
+ {
+ // 可以直线连接,更新最远索引
+ farthestIndex = testIndex;
+ }
+ // 🔧 关键改进:不像现有算法那样遇到失败就停止,而是继续尝试更远的点
+ // 这样可以发现更多斜线连接机会
+ }
+
+ // 如果找到了比相邻点更远的连接,记录优化效果
+ if (farthestIndex > currentIndex + 1)
+ {
+ int skippedPoints = farthestIndex - currentIndex - 1;
+ LogManager.Info($"[斜线优化] 从点{currentIndex}直连到点{farthestIndex},跳过{skippedPoints}个中间点");
+ }
+
+ currentIndex = farthestIndex;
+ if (currentIndex < optimizedPath.Count)
+ {
+ diagonalOptimizedPath.Add(optimizedPath[currentIndex]);
+ }
+ }
+
+ int reducedPoints = optimizedPath.Count - diagonalOptimizedPath.Count;
+ LogManager.Info($"[斜线优化] 斜线优化完成,点数变化: {optimizedPath.Count} -> {diagonalOptimizedPath.Count} (减少{reducedPoints}个点)");
+
+ return diagonalOptimizedPath;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Warning($"[斜线优化] 斜线优化失败: {ex.Message},使用输入路径");
+ return optimizedPath;
+ }
+ }
+
///
/// 检查两点间的直线路径是否畅通
///
@@ -1346,6 +1407,19 @@ namespace NavisworksTransport.PathPlanning
// 更新路径结果
pathResult.PathPoints = optimizedPoints;
+
+ // 🔥 步骤2:在现有优化基础上应用专门的斜线优化
+ var diagonalOptimizedPoints = ApplyDiagonalOptimization(optimizedPoints, gridMap);
+
+ if (diagonalOptimizedPoints.Count != optimizedPoints.Count)
+ {
+ LogManager.Info($"[斜线优化] 二次优化点数变化:{optimizedPoints.Count} -> {diagonalOptimizedPoints.Count}");
+ pathResult.PathPoints = diagonalOptimizedPoints;
+ }
+ else
+ {
+ LogManager.Info($"[斜线优化] 斜线优化未能进一步减少点数,保持现有结果");
+ }
}
}
else
@@ -1683,7 +1757,6 @@ namespace NavisworksTransport.PathPlanning
if (!_loggedDistances.Contains(safetyDistance))
{
_loggedDistances.Add(safetyDistance);
- LogManager.Debug($"[速度权重] 安全距离{safetyDistance} -> 速度{finalSpeed:F1}km/h");
}
return finalSpeed;
diff --git a/src/PathPlanning/PathOptimizer.cs b/src/PathPlanning/PathOptimizer.cs
index 73152d1..c8159f0 100644
--- a/src/PathPlanning/PathOptimizer.cs
+++ b/src/PathPlanning/PathOptimizer.cs
@@ -230,7 +230,6 @@ namespace NavisworksTransport.PathPlanning
if (!currentDirection.Equals(prevDirection))
{
simplified.Add(dedupedGridPath[i - 1]);
- LogManager.Debug($"[路径优化] 检测到转弯:位置({dedupedGridPath[i-1].X},{dedupedGridPath[i-1].Y}),方向从({prevDirection.X},{prevDirection.Y})变为({currentDirection.X},{currentDirection.Y})");
prevDirection = currentDirection;
}
}