一个基于 C++ 的地图生成与路径规划项目,带有 raylib GUI 可视化界面。
- 可控地图生成(网格 / 随机)
- 图结构管理与校验
- 最短路径计算(Dijkstra / A*)
- 车流模拟 + 拥堵感知路径规划
| 模块 | 状态 | 说明 |
|---|---|---|
| 图数据结构 | 已完成 | mapNode + EdgeAttr + mapGraphBase 基本可用 |
| 网格地图生成 | 已完成 | 支持按行列生成并自动连边 |
| 随机地图生成 | 已完成 | 随机点 + K 近邻连边 + 去交叉 + 连通性补边 |
| 路径规划(距离) | 已完成 | PathFinder::dijkstra 与 PathFinder::aStar |
| 路况权重路径 | 已完成 | 支持按 c * L * f(n/v) 计算边权 |
| 基础数据校验 | 已完成 | isMapFullyConnected、isDataValid |
| JSON 持久化 | 已完成 | 支持保存/加载节点、边和元数据 |
| CLI 交互界面 | 已完成 | 主菜单 + 路径测试子菜单 + 导入/生成双流程 |
| raylib GUI | 已完成 | 支持地图可视化、路径显示、车流模拟、JSON 打开/保存 |
SimpleMap/
├── dataStructure.h # 核心数据结构与图管理接口
├── dataStructure.cpp # 图管理、地图生成、连通性与校验实现
├── pathfinding.h # Dijkstra / A* 接口
├── pathfinding.cpp # 路径规划与路况权重实现
├── gui.h / gui.cpp # raylib GUI 可视化界面
├── parameters.h # 全局参数(CACHE_SIZE)(我也不知道为啥要放在单独文件里,反正就放了)
├── main.cpp # CLI 主入口(主菜单 + 路径测试子菜单)
├── test_data_generator.cpp # 测试数据生成器(默认可生成 1000 节点地图,本文件算法由ai生成)
├── thirdparty/
│ └── json.hpp # nlohmann/json 头文件
└── README.md
- 节点数组:
mapNode* mainGraph - 每个节点维护动态邻接数组:
Neighbour/distanceToNeighbour - 边属性数组:
EdgeAttr* edgeAttrs
这是一种“节点数组 + 邻接数组”的轻量实现,便于调试。
- 网格地图:规则坐标生成 + 右/下邻居双向连边
- 随机地图:
- 最小间距随机采样
- K 近邻连边
- 线段相交检测并删边
- BFS 连通分量检测与补边
- Dijkstra:用于全局最短路
- A*:启发函数为欧氏距离
- 可切换权重:
- 纯长度模式:
length - 路况模式:
c * L * f(n/v)
- 纯长度模式:
- 生成地图
generateGridMap(int mapWidth, int mapHeight, int nodeColCount, int nodeRowCount)generateRandomMap(int mapWidth, int mapHeight, int totalNodeCount)
- 查询与修改
getNodeById(int nodeID)getEdgeById(int edgeID)getEdgeByNodes(int fromID, int toID)updateEdgeCongestion(int edgeID, double newCongestion)
- 校验
isMapFullyConnected()isDataValid()
- 路径长度
getPath(int nodeID1, int nodeID2)
dijkstra(mapGraphBase* graph, int startId, int endId, bool useCongestion = false)aStar(mapGraphBase* graph, int startId, int endId, bool useCongestion = false)getTravelTime(mapGraphBase* graph, int fromID, int toID, bool useCongestion)
默认 make 编译命令行版本,不依赖 raylib:
make
./mainGUI 版本依赖 raylib。安装依赖后运行:
make gui
./simplemap_guimacOS:
brew install raylib
make guiLinux:
# 按发行版安装 raylib 开发包,例如 libraylib-dev / raylib-devel
make gui如果 raylib 不在系统默认路径,可以手动指定:
make gui RAYLIB_DIR=/path/to/raylibRAYLIB_DIR 目录下应包含 include/raylib.h 和 lib/libraylib.*。
make test-data
./test_data_generatormake clean| 操作 | 功能 |
|---|---|
| Open / O | 输入 JSON 路径并打开地图,默认 test0.json |
| Random / G | 生成随机地图 |
| Grid | 生成网格地图 |
| Save / S | 输入路径并保存地图,默认 map.json |
| 左键点击节点 | 设起点 |
| Shift + 左键 | 设终点 |
| Dijkstra / P | 显示 Dijkstra 路径 |
| A* / F | 显示 A* 路径 |
| Traffic / T | 车流开关,开启后寻路使用拥堵权重 |
| 右键 | 查找并高亮附近 100 节点 |
| 1 | 查找并高亮屏幕中心附近 100 节点 |
| 滚轮 | 缩放 |
| 拖拽 | 平移 |
| Reset / R | 重置视图 |
| Clear / ESC | 清除路径和高亮 |
1. 导入已有地图 JSON 后做路径测试
2. 生成随机地图后进入路径测试子菜单
3. 输出 Dijkstra/A* 的路径节点详情、分段距离、累计距离与耗时
运行过程中如果调用保存流程,会在项目根目录生成 json 文件。
- GUI 的打开/保存使用内置路径输入框,不依赖 Windows 原生文件对话框。
getPath返回“路径总长度(int)”,缓存的目标是距离值而非完整节点序列;如需节点序列请使用PathFinder。
刘宜东 郑云祥 2026.5