BREP_RANSAC 0.1.2

Topology-aware analytic surface recognition for CAD triangle meshes
Documentation
use brep_ransac::{
    recognize_surfaces_with_unresolved, synthetic, RecognitionOptions, SamplingMode, SurfaceType,
};
use std::time::Instant;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let segments: usize = std::env::args().nth(1).as_deref().unwrap_or("24").parse()?;
    let options = RecognitionOptions {
        distance_tolerance: 0.15,
        normal_tolerance: 0.35,
        sampling: SamplingMode::TriangleCentroids,
        ..Default::default()
    };
    println!("truth,recognized,triangles,support,rms,max,unresolved,time_seconds");
    for kind in [
        SurfaceType::Plane,
        SurfaceType::Sphere,
        SurfaceType::Cylinder,
        SurfaceType::Cone,
        SurfaceType::Torus,
    ] {
        let (_, mesh) = synthetic::canonical(kind, segments);
        let start = Instant::now();
        let result = recognize_surfaces_with_unresolved(&mesh, &options)?;
        let elapsed = start.elapsed().as_secs_f64();
        if let Some(region) = result.regions.first() {
            println!(
                "{},{},{},{},{:.17},{:.17},{},{:.9}",
                kind.name(),
                region.surface.surface_type().name(),
                mesh.triangles.len(),
                region.metrics.support_triangles,
                region.metrics.rms_error,
                region.metrics.max_error,
                result.unresolved_triangles.len(),
                elapsed
            );
        } else {
            println!(
                "{},none,{},0,nan,nan,{},{}",
                kind.name(),
                mesh.triangles.len(),
                result.unresolved_triangles.len(),
                elapsed
            );
        }
    }
    Ok(())
}