#解析 #路径查找 #基准测试

movingai

movingai基准测试地图/场景文件解析器

15个版本 (6个稳定版)

1.3.1 2024年4月26日
1.3.0 2022年12月8日
1.2.0 2021年6月16日
1.1.1 2020年4月23日
0.7.0 2018年3月14日

#299解析器实现

Download history 148/week @ 2024-04-22 93/week @ 2024-04-29 19/week @ 2024-05-13 13/week @ 2024-05-20 4/week @ 2024-06-03 6/week @ 2024-06-10 32/week @ 2024-06-17 27/week @ 2024-07-01 3/week @ 2024-07-15 15/week @ 2024-07-22 198/week @ 2024-07-29 32/week @ 2024-08-05

每月248次 下载
用于 2 crates

MIT 许可证

150KB
276

movingai-rust

Cargo Version

适用于MovingAI基准格式的地图/场景文件解析器。它提供了一种快速解析场景和地图文件的方法,并增加了一些用于管理和查询地图信息的工具。

地图功能

该crate可以解析地图和场景文件,并提供几个用于轻松交互和查询的函数。

一些功能包括

  • 轻松访问地图数据,如宽度、高度和特定坐标处的瓦片。
  • 根据MovingAI格式规则检查瓦片是否可通行。
  • 从特定瓦片获取可访问的邻居列表。
  • [待办] 将位图转换为.map文件。
  • 使用serde将.map.scen文件序列化/反序列化为JSON/YAML(激活--features serde

如何使用

extern crate movingai;

use std::path::Path;
use movingai::parser::parse_map_file;

fn main() {
    let map = parse_map_file(Path::new("./test/arena.map")).unwrap();
    let width = map.width();
    let tile = map[(4,5)]; // Access map location at row 4 and column 5.
}

例如,您可以看到我们如何使用此crate轻松实现A*路径查找算法。

// A* shortest path algorithm.

fn shortest_path(map: &MovingAiMap, start: Coords2D, goal: Coords2D) -> Option<f64> {

    let mut heap = BinaryHeap::new();
    let mut visited = Vec::<Coords2D>::new();

    // We're at `start`, with a zero cost
    heap.push(SearchNode { f: 0.0, g:0.0, h: distance(start, goal), current: start });

    while let Some(SearchNode { f: _f, g, h: _h, current }) = heap.pop() {

        if current == goal { return Some(g); }

        if visited.contains(&current) {
            continue;
        }

        visited.push(current);

        for neigh in map.neighbors(current) {
            let new_h = distance(neigh, goal);
            let i = distance(neigh, current);
            let next = SearchNode { f: g+i+new_h, g: g+i, h: new_h, current: neigh };
            heap.push(next);
        }
    }

    // Goal not reachable
    None
}

在这个例子中,我们可以看到如何编写一个针对scen文件的基准测试。

fn main() {
    let map = parse_map_file(Path::new("./tests/arena.map")).unwrap();
    let scenes = parse_scen_file(Path::new("./tests/arena.map.scen")).unwrap();
    for scene in scenes {
        let start = scene.start_pos;
        let goal = scene.goal_pos;
        let t = Instant::now();
        match shortest_path(&map, (1,3), (4,3)) {
            Some(x) => {
                let duration = t.elapsed();
                let seconds = duration.as_secs();
                let ms = (duration.subsec_nanos() as f64) / 1_000_000.0;
                println!("{:?} -> {:?} \tin {:?} seconds and {:?} ms", start, goal, seconds, ms);
            }
            None => println!("None"),
        }
    }
}

为什么cargo test失败?

请注意,测试需要启用serde功能编译。

cargo test --feature=serde

依赖项