use nalgebra::{Point2, Vector2};
use projective_grid::RegularGridDetector;
fn push_grid(out: &mut Vec<Point2<f32>>, origin: Point2<f32>, cols: i32, rows: i32, pitch: f32) {
for j in 0..rows {
for i in 0..cols {
out.push(origin + Vector2::new(i as f32 * pitch, j as f32 * pitch));
}
}
}
fn main() {
let mut cloud = Vec::new();
push_grid(&mut cloud, Point2::new(40.0, 40.0), 5, 4, 30.0);
push_grid(&mut cloud, Point2::new(600.0, 400.0), 6, 6, 28.0);
println!(
"input cloud: {} points = 5x4 board + 6x6 board\n",
cloud.len()
);
let detector = RegularGridDetector::default();
let boards = detector.detect_all(&cloud);
if boards.is_empty() {
eprintln!("no grids detected");
return;
}
println!("detected {} disjoint grid(s)\n", boards.len());
for (k, board) in boards.iter().enumerate() {
let max_i = board.points.iter().map(|p| p.grid.0).max().unwrap_or(0);
let max_j = board.points.iter().map(|p| p.grid.1).max().unwrap_or(0);
println!(
"board #{k}: {} corners, extent {}x{} (i:0..={max_i}, j:0..={max_j})",
board.points.len(),
max_i + 1,
max_j + 1,
);
println!(" cell_size : {:.2} px", board.cell_size);
println!(
" axis_i : ({:+.3}, {:+.3})",
board.axis_i.x, board.axis_i.y
);
let origin = board
.points
.iter()
.find(|p| p.grid == (0, 0))
.map(|p| p.position)
.unwrap();
println!(" (0,0) at : ({:.1}, {:.1})\n", origin.x, origin.y);
}
}