distance_transforms/
distance_transforms.rs

1//! Distance Transform Demo
2//!
3//! Demonstrates distance field generation with different metrics
4
5use terrain_forge::{
6    algorithms,
7    spatial::{distance_field, DistanceMetric},
8    Grid, Tile,
9};
10
11fn main() {
12    println!("=== Distance Transform Demo ===\n");
13
14    // Generate a simple room layout
15    let mut grid = Grid::new(20, 15);
16    let algo = algorithms::get("rooms").unwrap();
17    algo.generate(&mut grid, 12345);
18
19    println!("1. Original Grid (20x15):");
20    print_grid(&grid);
21
22    // Generate distance fields with different metrics
23    println!("\n2. Euclidean Distance Field:");
24    let euclidean = distance_field(&grid, DistanceMetric::Euclidean);
25    print_distance_field(&euclidean);
26
27    println!("\n3. Manhattan Distance Field:");
28    let manhattan = distance_field(&grid, DistanceMetric::Manhattan);
29    print_distance_field(&manhattan);
30
31    println!("\n4. Chebyshev Distance Field:");
32    let chebyshev = distance_field(&grid, DistanceMetric::Chebyshev);
33    print_distance_field(&chebyshev);
34
35    // Performance comparison
36    println!("\n5. Performance Comparison:");
37    let start = std::time::Instant::now();
38    let _ = distance_field(&grid, DistanceMetric::Euclidean);
39    println!("   Euclidean: {:?}", start.elapsed());
40
41    let start = std::time::Instant::now();
42    let _ = distance_field(&grid, DistanceMetric::Manhattan);
43    println!("   Manhattan: {:?}", start.elapsed());
44
45    let start = std::time::Instant::now();
46    let _ = distance_field(&grid, DistanceMetric::Chebyshev);
47    println!("   Chebyshev: {:?}", start.elapsed());
48}
49
50fn print_grid(grid: &Grid<Tile>) {
51    for y in 0..grid.height() {
52        for x in 0..grid.width() {
53            let tile = grid.get(x as i32, y as i32).unwrap();
54            print!("{}", if tile.is_floor() { "." } else { "#" });
55        }
56        println!();
57    }
58}
59
60fn print_distance_field(transform: &terrain_forge::spatial::DistanceTransform) {
61    for y in 0..transform.height() {
62        for x in 0..transform.width() {
63            let dist = transform.get(x, y);
64            if dist == f32::INFINITY {
65                print!("## ");
66            } else if dist < 10.0 {
67                print!("{:2.0} ", dist);
68            } else {
69                print!("++ ");
70            }
71        }
72        println!();
73    }
74}