diff --git a/src/PathPlanning/AutoPathFinder.cs b/src/PathPlanning/AutoPathFinder.cs index 33d4a96..1768a80 100644 --- a/src/PathPlanning/AutoPathFinder.cs +++ b/src/PathPlanning/AutoPathFinder.cs @@ -100,11 +100,16 @@ namespace NavisworksTransport.PathPlanning LogManager.Info($"[2.5D路径规划] A*算法找到原始路径,包含 {pathResult.PathPoints.Count} 个点"); - // 5. 根据网格点通行高度区间对路径点Z坐标调整 - var enhancedPath = ApplyGridHeightConstraints(pathResult.PathPoints, gridMap, vehicleHeight); + // 5. 预先生成路径点和网格坐标的对应关系,避免重复转换 + var pathWithGridCoords = pathResult.PathPoints + .Select(point => (point, gridMap.WorldToGrid(point))) + .ToList(); - // 6. 验证路径中所有点的高度约束(特别是门网格) - ValidatePathHeightConstraints(enhancedPath, gridMap, vehicleHeight); + // 6. 根据网格点通行高度区间对路径点Z坐标调整 + var enhancedPath = ApplyGridHeightConstraints(pathWithGridCoords, gridMap, vehicleHeight); + + // 7. 验证路径中所有点的高度约束(直接使用原始网格坐标,因为网格位置未变) + ValidatePathHeightConstraints(pathWithGridCoords, gridMap, vehicleHeight); // 更新PathFindingResult pathResult.PathPoints = enhancedPath; @@ -1234,21 +1239,19 @@ namespace NavisworksTransport.PathPlanning /// /// 根据网格高度区间调整路径点Z坐标 /// - /// 原始路径 + /// 路径点和对应的网格坐标 /// 网格地图 /// 车辆高度(模型单位) /// 调整后的路径 - private List ApplyGridHeightConstraints(List path, GridMap gridMap, double vehicleHeight) + private List ApplyGridHeightConstraints(List<(Point3D point, GridPoint2D gridPos)> pathWithGridCoords, GridMap gridMap, double vehicleHeight) { - LogManager.Info($"[应用高度区间] 开始调整,路径点数: {path.Count}"); + LogManager.Info($"[应用高度区间] 开始调整,路径点数: {pathWithGridCoords.Count}"); var adjustedPath = new List(); int adjustedCount = 0; - foreach (var point in path) + foreach (var (point, gridPos) in pathWithGridCoords) { - var gridPos = gridMap.WorldToGrid(point); - // 检查网格位置有效性 if (!gridMap.IsValidGridPosition(gridPos)) { @@ -1273,7 +1276,7 @@ namespace NavisworksTransport.PathPlanning adjustedCount++; } - LogManager.Info($"[应用高度区间] 完成,调整了 {adjustedCount}/{path.Count} 个点"); + LogManager.Info($"[应用高度区间] 完成,调整了 {adjustedCount}/{pathWithGridCoords.Count} 个点"); return adjustedPath; } @@ -1285,14 +1288,10 @@ namespace NavisworksTransport.PathPlanning /// 网格坐标 private GridPoint2D ConvertAStarPositionToGrid(Position astarPosition, GridMap gridMap) { - LogManager.Info($"[A*原始坐标] A*返回: ({astarPosition.X:F3}, {astarPosition.Y:F3})"); - double cellSizeInMeters = UnitsConverter.ConvertToMeters(gridMap.CellSize); int gridX = (int)Math.Round(astarPosition.X / cellSizeInMeters); int gridY = (int)Math.Round(astarPosition.Y / cellSizeInMeters); - LogManager.Info($"[A*转换坐标] 转换结果: ({gridX}, {gridY})"); - return new GridPoint2D(gridX, gridY); } @@ -1397,22 +1396,21 @@ namespace NavisworksTransport.PathPlanning /// /// 验证路径中所有点的高度约束(特别检查门网格) /// - /// 路径点列表 + /// 路径点和对应的网格坐标 /// 网格地图 /// 车辆高度(模型单位) - private void ValidatePathHeightConstraints(List path, GridMap gridMap, double vehicleHeight) + private void ValidatePathHeightConstraints(List<(Point3D point, GridPoint2D gridPos)> pathWithGridCoords, GridMap gridMap, double vehicleHeight) { - LogManager.Info($"[路径高度验证] 开始验证 {path.Count} 个路径点的高度约束"); + LogManager.Info($"[路径高度验证] 开始验证 {pathWithGridCoords.Count} 个路径点的高度约束"); int checkedPoints = 0; int passedPoints = 0; int failedPoints = 0; int doorPoints = 0; - for (int i = 0; i < path.Count; i++) + for (int i = 0; i < pathWithGridCoords.Count; i++) { - var point = path[i]; - var gridPos = gridMap.WorldToGrid(point); + var (point, gridPos) = pathWithGridCoords[i]; if (gridMap.IsValidGridPosition(gridPos)) {