# 新的包围盒遍历算法实施计划

## 目标

在GridMapGenerator中增加新的网格生成方法，使用简化的包围盒遍历算法，保留原有算法用于性能对比。

## 可复用的现有工具方法

### 1. 坐标转换

- `GridMap.WorldToGrid()` - 世界坐标到网格坐标转换
- `GridMap.GridToWorld()` - 网格坐标到世界坐标转换

### 2. 包围盒处理

- `BoundingBoxIntersects()` - 包围盒相交检测
- `CollectItemsInBounds()` - 收集边界内的模型项

### 3. 通道构建

- `_channelBuilder.BuildChannelCoverage()` - 构建通道覆盖网格

### 4. 物体膨胀

- `ApplyObjectInflation()` - 应用物体膨胀
- `ApplyObjectInflationOptimized()` - 优化版膨胀算法

### 5. 数据结构

- `GridCell` - 网格单元结构（支持高度信息）
- `HeightInterval` - 高度区间结构
- `GridMap` - 网格地图类

## 实施步骤

### 1. 新增方法 `GenerateBoundingBoxBased2_5D`

```csharp
private GridMap GenerateBoundingBoxBased2_5D(
    Document document, 
    BoundingBox3D bounds, 
    double cellSize,
    double objectRadius, 
    double safetyMargin,
    Point3D planningStartPoint,
    Point3D planningEndPoint,
    double objectHeight)
```

### 2. 新增辅助方法

#### 2.1 `ProcessObstaclesWithBoundingBox`

- 直接遍历模型项并使用包围盒检测
- 支持高度范围预筛选
- 记录高度信息到GridCell.PassableHeights

#### 2.2 `CalculateBoundingBoxGridCoverage`

- 计算包围盒在网格上的投影范围
- 返回覆盖的网格单元坐标列表

#### 2.3 `IsInScanHeightRange`

- 检查包围盒是否在扫描高度范围内
- 参数：包围盒、基准高度、扫描高度

### 3. 算法实现细节

```csharp
// 主要处理流程
1. 构建通道覆盖（复用现有）
   var channelCoverage = _channelBuilder.BuildChannelCoverage(cellSizeInModelUnits, document);

2. 直接遍历处理障碍物
   ProcessObstaclesWithBoundingBox(document, channelCoverage.GridMap, objectHeight, safetyMargin);
   
3. 应用物体膨胀（复用现有）
   ApplyObjectInflation(channelCoverage.GridMap, totalInflationRadius);

// ProcessObstaclesWithBoundingBox 实现逻辑
- 获取所有模型项
- 排除通道项（使用 channelCoverage.ChannelItems）
- 并行处理每个模型项：
  a. 获取包围盒
  b. 检查高度范围（IsInScanHeightRange）
  c. 计算网格覆盖（CalculateBoundingBoxGridCoverage）
  d. 更新网格状态和高度信息（线程安全）
```

### 4. 性能优化要点

- **早期退出**：高度范围预检查，跳过不相关的模型项
- **减少写操作**：只更新通道网格，跳过已是障碍物的网格
- **并行处理**：使用 Parallel.ForEach 处理模型项
- **批量更新**：一次计算所有覆盖的网格，然后批量更新

### 5. 添加算法选择机制

在 `GenerateFromBIM` 方法中添加算法选择：

```csharp
public GridMap GenerateFromBIM(Document document, GridMapGenerationAlgorithm algorithm = GridMapGenerationAlgorithm.BoundingBoxBased)
{
    switch(algorithm)
    {
        case GridMapGenerationAlgorithm.BoundingBoxBased:
            return GenerateBoundingBoxBased2_5D(...);
        case GridMapGenerationAlgorithm.VerticalScan:
            return GenerateChannelBased2_5D(...);
    }
}
```

### 6. 性能对比功能

添加性能统计和对比：

- 记录算法执行时间
- 统计处理的模型项数量
- 内存使用对比
- 结果一致性验证

## 预期效果

1. **代码复用**：最大化复用现有工具方法
2. **性能提升**：预计提升40-60%
3. **可维护性**：保留原算法，便于对比和回退
4. **扩展性**：保留高度信息，支持未来多楼层路径规划

## 风险控制

- 保留原有算法不做修改
- 新算法独立实现，不影响现有功能
- 添加算法切换机制，可随时回退
- 充分的性能对比和验证

## 实施进度

- [x] 查找项目中可复用的工具方法
- [x] 设计新的包围盒遍历算法
- [ ] 实现新的网格生成方法
- [ ] 添加算法选择和性能对比功能
