  ⎿ 最少转弯路径实现计划（基于Roy-T.AStar官方API）

    实施策略：严格保护现有算法

    阶段一：数据结构扩展

    1. 添加路径策略枚举

    位置：src/PathPlanning/PathPlanningModels.cs
    public enum PathStrategy
    {
        Shortest = 0,    // 默认：标准最短路径（现有行为）
        Straightest = 1  // 新增：直线优先路径
    }

    2. 扩展AutoPathFinder方法签名

    位置：src/PathPlanning/AutoPathFinder.cs
    - 新增重载：FindPath(..., PathStrategy strategy = PathStrategy.Shortest)
    - 保留所有现有方法不变

    阶段二：核心算法实现

    3. 实现方向感知的网格转换

    新增方法：ConvertToAStarGridWithStrategy()
    private Grid ConvertToAStarGridWithStrategy(GridMap gridMap, Point3D startPos, Point3D endPos, PathStrategy strategy,
    double objectHeight)
    {
        if (strategy == PathStrategy.Shortest) {
            // 调用现有方法，保证100%兼容
            return ConvertToAStarGridWith2_5D(gridMap, channelCoverage, objectHeight);
        }

        // 直线优先实现
        return ConvertToAStarGridStraightest(gridMap, startPos, endPos, objectHeight);
    }

    4. 直线优先算法核心

    基于文档第127行的AddEdge模式：
    private Grid ConvertToAStarGridStraightest(GridMap gridMap, Point3D start, Point3D end, double objectHeight)
    {
        // 1. 计算主方向
        double dx = Math.Abs(end.X - start.X);
        double dy = Math.Abs(end.Y - start.Y);
        bool preferHorizontal = dx > dy;

        // 2. 差异化速度设置（基于文档的Velocity.FromKilometersPerHour）
        var mainDirectionVelocity = Velocity.FromKilometersPerHour(10);  // 主方向：低成本
        var crossDirectionVelocity = Velocity.FromKilometersPerHour(2);  // 次方向：高成本
        var diagonalVelocity = Velocity.FromKilometersPerHour(5);        // 对角线：中等成本

        // 3. 按现有模式创建和断开网格（文档第104-108行）
        var grid = Grid.CreateGridWithLateralConnections(gridSize, cellSize, mainDirectionVelocity);

        // 先断开所有连接
        for (int x = 0; x < gridMap.Width; x++) {
            for (int y = 0; y < gridMap.Height; y++) {
                grid.DisconnectNode(new GridPosition(x, y));
            }
        }

        // 4. 智能连接：根据方向设置不同速度（文档第115-126行模式）
        for (int x = 0; x < gridMap.Width; x++) {
            for (int y = 0; y < gridMap.Height; y++) {
                if (IsPassableWithHeight(gridMap.Cells[x, y], objectHeight)) {
                    var pos = new GridPosition(x, y);

                    // 水平连接
                    if (x + 1 < gridMap.Width && IsPassableWithHeight(gridMap.Cells[x + 1, y], objectHeight)) {
                        var rightPos = new GridPosition(x + 1, y);
                        var velocity = preferHorizontal ? mainDirectionVelocity : crossDirectionVelocity;
                        grid.AddEdge(pos, rightPos, velocity);
                        grid.AddEdge(rightPos, pos, velocity);
                    }

                    // 垂直连接
                    if (y + 1 < gridMap.Height && IsPassableWithHeight(gridMap.Cells[x, y + 1], objectHeight)) {
                        var bottomPos = new GridPosition(x, y + 1);
                        var velocity = preferHorizontal ? crossDirectionVelocity : mainDirectionVelocity;
                        grid.AddEdge(pos, bottomPos, velocity);
                        grid.AddEdge(bottomPos, pos, velocity);
                    }

                    // 对角线连接（可选）
                    if (x + 1 < gridMap.Width && y + 1 < gridMap.Height &&
                        IsPassableWithHeight(gridMap.Cells[x + 1, y + 1], objectHeight)) {
                        var diagonalPos = new GridPosition(x + 1, y + 1);
                        grid.AddEdge(pos, diagonalPos, diagonalVelocity);
                        grid.AddEdge(diagonalPos, pos, diagonalVelocity);
                    }
                }
            }
        }

        return grid;
    }

    阶段三：集成到现有流程

    5. 扩展PathPlanningManager调用

    位置：src/Core/PathPlanningManager.cs
    - 在AutoPlanPath方法中添加可选策略参数
    - 默认值确保现有调用完全不变

    6. 策略路由逻辑

    public Task<PathRoute> AutoPlanPath(..., PathStrategy strategy = PathStrategy.Shortest)
    {
        // 现有逻辑保持不变...

        // 策略感知的路径查找
        pathResult = pathFinder.FindPath(startPoint.Position, endPoint.Position, gridMap, channelCoverage, objectHeight,
    strategy);
    }

    阶段四：质量保证

    7. 兼容性验证

    - ✅ 所有现有单元测试必须通过
    - ✅ 默认调用行为与当前完全一致
    - ✅ 现有UI调用无需任何修改

    8. 功能验证

    - ✅ 对比两种策略的路径差异
    - ✅ 验证直线优先路径确实减少转弯
    - ✅ 性能测试确保无显著性能影响

    9. 调试支持

    基于文档第237行的日志模式：
    LogManager.Info($"[直线优先] 主方向: {(preferHorizontal ? "水平" : "垂直")}, 起点({start.X:F2},{start.Y:F2}),
    终点({end.X:F2},{end.Y:F2})");
    LogManager.Info($"[速度设置] 主方向: {mainDirectionVelocity.InKilometersPerHour}km/h, 次方向:
    {crossDirectionVelocity.InKilometersPerHour}km/h");

    交付成果

    1. 零破坏性扩展：现有功能100%保持原样
    2. 基于官方API：使用Roy-T.AStar文档化的最佳实践
    3. 易于使用：通过可选参数启用新功能
    4. 充分测试：确保稳定性和兼容性
    5. 详细日志：便于调试和性能分析

    测试用例设计

    - 现有路径 vs 直线优先路径的转弯次数对比
    - 长距离直线路径的优化效果验证
    - 复杂地形下的算法鲁棒性测试
