use nalgebra::Point2;
use projective_grid::{
detect_grid, DetectionParams, DetectionRequest, Evidence, LatticeKind, LocalAxis,
OrientedFeature, PointFeature,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut features: Vec<OrientedFeature<2>> = Vec::new();
let spacing = 40.0_f32;
for j in 0..3 {
for i in 0..3 {
let x = 60.0 + i as f32 * spacing + j as f32 * 6.0;
let y = 50.0 + j as f32 * spacing;
let source_index = features.len();
let point = PointFeature::new(source_index, Point2::new(x, y));
let axes = [
LocalAxis::new(0.0, Some(0.02)),
LocalAxis::new(std::f32::consts::FRAC_PI_2, Some(0.02)),
];
features.push(OrientedFeature::new(point, axes));
}
}
let params = DetectionParams::default();
let request = DetectionRequest::new(
LatticeKind::Square,
Evidence::Oriented2(&features),
None, params,
);
let solution = detect_grid(request)?;
println!(
"recovered {} labelled features:",
solution.grid.entries.len()
);
for entry in &solution.grid.entries {
let residual = entry
.residual_px
.map(|r| format!("{r:.3} px"))
.unwrap_or_else(|| "n/a".to_string());
println!(
" (i={:>2}, j={:>2}) src={:>2} pos=({:6.1}, {:6.1}) residual={}",
entry.coord.u,
entry.coord.v,
entry.source_index,
entry.image_position.x,
entry.image_position.y,
residual,
);
}
if let Some(fit) = &solution.fit {
println!(
"fit: max residual {:.3} px over {} features",
fit.residuals.max_px, fit.residuals.count,
);
}
Ok(())
}