distance_transforms/
distance_transforms.rs1use terrain_forge::{
6 algorithms,
7 spatial::{distance_field, DistanceMetric},
8 Grid, Tile,
9};
10
11fn main() {
12 println!("=== Distance Transform Demo ===\n");
13
14 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 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 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}