Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Repository files navigation

SimpleMap

一个基于 C++ 的地图生成与路径规划项目,带有 raylib GUI 可视化界面

  • 可控地图生成(网格 / 随机)
  • 图结构管理与校验
  • 最短路径计算(Dijkstra / A*)
  • 车流模拟 + 拥堵感知路径规划

目标一览

模块 状态 说明
图数据结构 已完成 mapNode + EdgeAttr + mapGraphBase 基本可用
网格地图生成 已完成 支持按行列生成并自动连边
随机地图生成 已完成 随机点 + K 近邻连边 + 去交叉 + 连通性补边
路径规划(距离) 已完成 PathFinder::dijkstraPathFinder::aStar
路况权重路径 已完成 支持按 c * L * f(n/v) 计算边权
基础数据校验 已完成 isMapFullyConnectedisDataValid
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

核心设计

1) 图存储模型

  • 节点数组:mapNode* mainGraph
  • 每个节点维护动态邻接数组:Neighbour / distanceToNeighbour
  • 边属性数组:EdgeAttr* edgeAttrs

这是一种“节点数组 + 邻接数组”的轻量实现,便于调试。

2) 地图生成策略

  • 网格地图:规则坐标生成 + 右/下邻居双向连边
  • 随机地图:
    • 最小间距随机采样
    • K 近邻连边
    • 线段相交检测并删边
    • BFS 连通分量检测与补边

3) 路径规划策略

  • Dijkstra:用于全局最短路
  • A*:启发函数为欧氏距离
  • 可切换权重:
    • 纯长度模式:length
    • 路况模式:c * L * f(n/v)

关键接口

mapGraphBase

  • 生成地图
    • 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)

PathFinder

  • 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)

构建说明

CLI

默认 make 编译命令行版本,不依赖 raylib:

make
./main

GUI

GUI 版本依赖 raylib。安装依赖后运行:

make gui
./simplemap_gui

macOS:

brew install raylib
make gui

Linux:

# 按发行版安装 raylib 开发包,例如 libraylib-dev / raylib-devel
make gui

如果 raylib 不在系统默认路径,可以手动指定:

make gui RAYLIB_DIR=/path/to/raylib

RAYLIB_DIR 目录下应包含 include/raylib.hlib/libraylib.*

测试数据生成器

make test-data
./test_data_generator

清理

make clean

操作

GUI 操作

操作 功能
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 清除路径和高亮

CLI 操作

1. 导入已有地图 JSON 后做路径测试
2. 生成随机地图后进入路径测试子菜单
3. 输出 Dijkstra/A* 的路径节点详情、分段距离、累计距离与耗时

运行过程中如果调用保存流程,会在项目根目录生成 json 文件。

注意

  1. GUI 的打开/保存使用内置路径输入框,不依赖 Windows 原生文件对话框。
  2. getPath 返回“路径总长度(int)”,缓存的目标是距离值而非完整节点序列;如需节点序列请使用 PathFinder

小组成员

刘宜东 郑云祥 2026.5

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages