hronn 0.7.0

An experimental CNC toolpath generator
Documentation
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (c) 2023, 2025 lacklustr@protonmail.com https://github.com/eadf
// This file is part of the hronn crate.

use crate::debug_access::xy_distance_to_line_squared;
use crate::prelude::MaximumTracker;
use crate::probe::square_end_to_edge::square_end_to_edge_collision;
use vector_traits::approx::ulps_eq;
use vector_traits::glam::{DVec2, DVec3};

fn do_disk_test(test_data: &[(Option<f64>, (f64, f64))], p0: DVec3, p1: DVec3, cr: f64) {
    for (sz, center) in test_data {
        let center = DVec2::new(center.0, center.1);
        let edge = xy_distance_to_line_squared(center, p0, p1);

        let mut mt = MaximumTracker::default();
        square_end_to_edge_collision(edge, cr, 0, &mut mt);
        if sz.is_some() {
            assert!(mt.get_max().is_some());
            let expected = sz.unwrap();
            let sz = mt.get_max().unwrap().z_value;
            assert!(
                ulps_eq!(expected, sz, epsilon = 1e-14, max_ulps = 4),
                "{sz} != {expected}, center:{center:}, p0:{p0:}, p1:{p1:}, cr:{cr}",
            );
        } else {
            if mt.get_max().is_some() {
                println!("Should be none: {:?}", mt.get_max().unwrap());
            }
            assert!(
                mt.get_max().is_none(),
                "center:{center:}, p0:{p0:}, p1:{p1:}, cr:{cr}",
            );
        }
    }
}

#[test]
fn a_disk_test() {
    // Rust test data
    #[rustfmt::skip]
    let test_data: [(Option<f64>, (f64, f64)); 280] = [
        (None, (-0.30000000000000004, 0.45789473684210513)), (None, (-0.30000000000000004, 0.6473684210526314)), (None, (-0.30000000000000004, 0.8368421052631578)),
        (None, (-0.30000000000000004, 1.026315789473684)), (None, (-0.30000000000000004, 1.2157894736842103)), (None, (-0.30000000000000004, 1.4052631578947365)),
        (None, (-0.30000000000000004, 1.5947368421052628)), (None, (0.15263157894736845, -0.11052631578947375)), (Some(-0.9600553581478857), (0.15263157894736845, 0.07894736842105254)),
        (Some(-0.8644204508056541), (0.15263157894736845, 0.2684210526315789)), (Some(-0.7938818786623534), (0.15263157894736845, 0.45789473684210513)), (Some(-0.7439615788141616), (0.15263157894736845, 0.6473684210526314)),
        (Some(-0.7125266936476033), (0.15263157894736845, 0.8368421052631578)), (Some(-0.6988606955176278), (0.15263157894736845, 1.026315789473684)), (Some(-0.7034051005489745), (0.15263157894736845, 1.2157894736842103)),
        (Some(-0.727915587075953), (0.15263157894736845, 1.4052631578947365)), (Some(-0.7761823620483028), (0.15263157894736845, 1.5947368421052628)), (Some(-0.8562029424089048), (0.15263157894736845, 1.7842105263157892)),
        (Some(-0.9885168549940224), (0.15263157894736845, 1.9736842105263157)), (None, (0.605263157894737, -0.30000000000000004)), (Some(-0.854970902122894), (0.605263157894737, -0.11052631578947375)),
        (Some(-0.7051986954634493), (0.605263157894737, 0.07894736842105254)), (Some(-0.5973649961771583), (0.605263157894737, 0.2684210526315789)), (Some(-0.5175608182329099), (0.605263157894737, 0.45789473684210513)),
        (Some(-0.45978629516526714), (0.605263157894737, 0.6473684210526314)), (Some(-0.421145712191362), (0.605263157894737, 0.8368421052631578)), (Some(-0.4004160295465766), (0.605263157894737, 1.026315789473684)),
        (Some(-0.3975814167717244), (0.605263157894737, 1.2157894736842103)), (Some(-0.41382772318118644), (0.605263157894737, 1.4052631578947365)), (Some(-0.4519916873897629), (0.605263157894737, 1.5947368421052628)),
        (Some(-0.517949465342765), (0.605263157894737, 1.7842105263157892)), (Some(-0.6252412760134543), (0.605263157894737, 1.9736842105263157)), (Some(-0.8215032576773735), (0.605263157894737, 2.163157894736842)),
        (None, (0.605263157894737, 2.352631578947368)), (None, (1.0578947368421054, -0.30000000000000004)), (Some(-0.6321005839700424), (1.0578947368421054, -0.11052631578947375)),
        (Some(-0.4567439362297123), (1.0578947368421054, 0.07894736842105254)), (Some(-0.3346802385197032), (1.0578947368421054, 0.2684210526315789)), (Some(-0.24470079886936524), (1.0578947368421054, 0.45789473684210513)),
        (Some(-0.17862668453898456), (1.0578947368421054, 0.6473684210526314)), (Some(-0.13259115388340126), (1.0578947368421054, 0.8368421052631578)), (Some(-0.10479533288274334), (1.0578947368421054, 1.026315789473684)),
        (Some(-0.09476521540081029), (1.0578947368421054, 1.2157894736842103)), (Some(-0.10318374822480081), (1.0578947368421054, 1.4052631578947365)), (Some(-0.13213632788330099), (1.0578947368421054, 1.5947368421052628)),
        (Some(-0.18601205669635457), (1.0578947368421054, 1.7842105263157892)), (Some(-0.27427215332727295), (1.0578947368421054, 1.9736842105263157)), (Some(-0.4232088783853625), (1.0578947368421054, 2.163157894736842)),
        (None, (1.0578947368421054, 2.352631578947368)), (None, (1.510526315789474, -0.30000000000000004)), (Some(-0.42923997167002614), (1.510526315789474, -0.11052631578947375)),
        (Some(-0.2162590900051482), (1.510526315789474, 0.07894736842105254)), (Some(-0.07697003167118188), (1.510526315789474, 0.2684210526315789)), (Some(0.024411834421391276), (1.510526315789474, 0.45789473684210513)),
        (Some(0.09937769988043055), (1.510526315789474, 0.6473684210526314)), (Some(0.1530860378360428), (1.510526315789474, 0.8368421052631578)), (Some(0.18802145127805137), (1.510526315789474, 1.026315789473684)),
        (Some(0.2051412719913972), (1.510526315789474, 1.2157894736842103)), (Some(0.2042287272384482), (1.510526315789474, 1.4052631578947365)), (Some(0.18381699641487037), (1.510526315789474, 1.5947368421052628)),
        (Some(0.14061241469333785), (1.510526315789474, 1.7842105263157892)), (Some(0.06775436601634066), (1.510526315789474, 1.9736842105263157)), (Some(-0.05136322259872772), (1.510526315789474, 2.163157894736842)),
        (Some(-0.2884947177386037), (1.510526315789474, 2.352631578947368)), (Some(-0.2693286591028161), (1.9631578947368424, -0.11052631578947375)), (Some(0.013662968620062443), (1.9631578947368424, 0.07894736842105254)),
        (Some(0.1749150482600541), (1.9631578947368424, 0.2684210526315789)), (Some(0.28939656992035845), (1.9631578947368424, 0.45789473684210513)), (Some(0.3740394149336055), (1.9631578947368424, 0.6473684210526314)),
        (Some(0.4358033506116312), (1.9631578947368424, 0.8368421052631578)), (Some(0.4780265873204952), (1.9631578947368424, 1.026315789473684)), (Some(0.5022025118161486), (1.9631578947368424, 1.2157894736842103)),
        (Some(0.5085691411055464), (1.9631578947368424, 1.4052631578947365)), (Some(0.49619255942465923), (1.9631578947368424, 1.5947368421052628)), (Some(0.46262324322344295), (1.9631578947368424, 1.7842105263157892)),
        (Some(0.4027722286341717), (1.9631578947368424, 1.9736842105263157)), (Some(0.3053387262971503), (1.9631578947368424, 2.163157894736842)), (Some(0.13551367238778456), (1.9631578947368424, 2.352631578947368)),
        (None, (1.9631578947368424, 2.542105263157894)), (None, (2.415789473684211, -0.11052631578947375)), (Some(0.22812220211423284), (2.415789473684211, 0.07894736842105254)),
        (Some(0.4197205184444863), (2.415789473684211, 0.2684210526315789)), (Some(0.5497400470399691), (2.415789473684211, 0.45789473684210513)), (Some(0.6451102250802236), (2.415789473684211, 0.6473684210526314)),
        (Some(0.7154421966164977), (2.415789473684211, 0.8368421052631578)), (Some(0.7651841598196159), (2.415789473684211, 1.026315789473684)), (Some(0.7964530799314917), (2.415789473684211, 1.2157894736842103)),
        (Some(0.8099542707612009), (2.415789473684211, 1.4052631578947365)), (Some(0.8052353991148187), (2.415789473684211, 1.5947368421052628)), (Some(0.780526445801049), (2.415789473684211, 1.7842105263157892)),
        (Some(0.732011859645108), (2.415789473684211, 1.9736842105263157)), (Some(0.65163423105697), (2.415789473684211, 2.163157894736842)), (Some(0.5186344238975833), (2.415789473684211, 2.352631578947368)),
        (Some(0.1991631861193941), (2.415789473684211, 2.542105263157894)), (None, (2.8684210526315796, -0.11052631578947375)), (Some(0.4152300713327848), (2.8684210526315796, 0.07894736842105254)),
        (Some(0.6554671594802386), (2.8684210526315796, 0.2684210526315789)), (Some(0.8047318022440066), (2.8684210526315796, 0.45789473684210513)), (Some(0.9122615512804346), (2.8684210526315796, 0.6473684210526314)),
        (Some(0.9918409353639603), (2.8684210526315796, 0.8368421052631578)), (Some(1.0494282431871405), (2.8684210526315796, 1.026315789473684)), (Some(1.087899421416461), (2.8684210526315796, 1.2157894736842103)),
        (Some(1.1084650765087292), (2.8684210526315796, 1.4052631578947365)), (Some(1.1111304852343635), (2.8684210526315796, 1.5947368421052628)), (Some(1.0946974378112686), (2.8684210526315796, 1.7842105263157892)),
        (Some(1.0563096459402637), (2.8684210526315796, 1.9736842105263157)), (Some(0.9900500564415973), (2.8684210526315796, 2.163157894736842)), (Some(0.8822570542382784), (2.8684210526315796, 2.352631578947368)),
        (Some(0.6845044161446947), (2.8684210526315796, 2.542105263157894)), (None, (2.8684210526315796, 2.731578947368421)), (Some(0.5112790660521203), (3.321052631578948, 0.07894736842105254)),
        (Some(0.8786916665293218), (3.321052631578948, 0.2684210526315789)), (Some(1.0533505411286659), (3.321052631578948, 0.45789473684210513)), (Some(1.175054059245401), (3.321052631578948, 0.6473684210526314)),
        (Some(1.264784387462217), (3.321052631578948, 0.8368421052631578)), (Some(1.3306594047398965), (3.321052631578948, 1.026315789473684)), (Some(1.376520173246535), (3.321052631578948, 1.2157894736842103)),
        (Some(1.4041511105409703), (3.321052631578948, 1.4052631578947365)), (Some(1.4140153797161126), (3.321052631578948, 1.5947368421052628)), (Some(1.405418860469006), (3.321052631578948, 1.7842105263157892)),
        (Some(1.376260407684816), (3.321052631578948, 1.9736842105263157)), (Some(1.322121475973595), (3.321052631578948, 2.163157894736842)), (Some(1.233466273846232), (3.321052631578948, 2.352631578947368)),
        (Some(1.083686785413125), (3.321052631578948, 2.542105263157894)), (None, (3.321052631578948, 2.731578947368421)), (None, (3.7736842105263166, 0.07894736842105254)),
        (Some(1.0821653092964283), (3.7736842105263166, 0.2684210526315789)), (Some(1.294044742378813), (3.7736842105263166, 0.45789473684210513)), (Some(1.4328884340047625), (3.7736842105263166, 0.6473684210526314)),
        (Some(1.5339880662125522), (3.7736842105263166, 0.8368421052631578)), (Some(1.6087390891955469), (3.7736842105263166, 1.026315789473684)), (Some(1.6622650883022008), (3.7736842105263166, 1.2157894736842103)),
        (Some(1.6970330824930584), (3.7736842105263166, 1.4052631578947365)), (Some(1.7139886816292556), (3.7736842105263166, 1.5947368421052628)), (Some(1.712904494035394), (3.7736842105263166, 1.7842105263157892)),
        (Some(1.6923004391675323), (3.7736842105263166, 1.9736842105263157)), (Some(1.648860646908347), (3.7736842105263166, 2.163157894736842)), (Some(1.575675145979239), (3.7736842105263166, 2.352631578947368)),
        (Some(1.455976082970063), (3.7736842105263166, 2.542105263157894)), (Some(1.2164330062339321), (3.7736842105263166, 2.731578947368421)), (Some(1.2437445282822952), (4.226315789473685, 0.2684210526315789)),
        (Some(1.524254888090971), (4.226315789473685, 0.45789473684210513)), (Some(1.6849212341726947), (4.226315789473685, 0.6473684210526314)), (Some(1.7990740181743499), (4.226315789473685, 0.8368421052631578)),
        (Some(1.883481093506081), (4.226315789473685, 1.026315789473684)), (Some(1.9450524314464892), (4.226315789473685, 1.2157894736842103)), (Some(1.9871039021128971), (4.226315789473685, 1.4052631578947365)),
        (Some(2.0111155860492467), (4.226315789473685, 1.5947368421052628)), (Some(2.017314874930935), (4.226315789473685, 1.7842105263157892)), (Some(2.0047561588968277), (4.226315789473685, 1.9736842105263157)),
        (Some(1.9709724189863793), (4.226315789473685, 2.163157894736842)), (Some(1.9108400698511365), (4.226315789473685, 2.352631578947368)), (Some(1.8129636612977338), (4.226315789473685, 2.542105263157894)),
        (Some(1.642051511287894), (4.226315789473685, 2.731578947368421)), (None, (4.226315789473685, 2.921052631578947)), (None, (4.678947368421054, 0.2684210526315789)),
        (Some(1.7391633145738645), (4.678947368421054, 0.45789473684210513)), (Some(1.9299100860795186), (4.678947368421054, 0.6473684210526314)), (Some(2.0595325712794286), (4.678947368421054, 0.8368421052631578)),
        (Some(2.154638786063195), (4.678947368421054, 1.026315789473684)), (Some(2.224764521919931), (4.678947368421054, 1.2157894736842103)), (Some(2.274328324239584), (4.678947368421054, 1.4052631578947365)),
        (Some(2.305431338136988), (4.678947368421054, 1.5947368421052628)), (Some(2.318767683915099), (4.678947368421054, 1.7842105263157892)), (Some(2.313874198481007), (4.678947368421054, 1.9736842105263157)),
        (Some(2.288966464275874), (4.678947368421054, 2.163157894736842)), (Some(2.240203419131605), (4.678947368421054, 2.352631578947368)), (Some(2.1594671840874176), (4.678947368421054, 2.542105263157894)),
        (Some(2.025775592560619), (4.678947368421054, 2.731578947368421)), (Some(1.6993302751559674), (4.678947368421054, 2.921052631578947)), (None, (5.131578947368422, 0.2684210526315789)),
        (Some(1.9271786693452648), (5.131578947368422, 0.45789473684210513)), (Some(2.165898590511393), (5.131578947368422, 0.6473684210526314)), (Some(2.3146588757872584), (5.131578947368422, 0.8368421052631578)),
        (Some(2.4218857483584726), (5.131578947368422, 1.026315789473684)), (Some(2.5012408233020222), (5.131578947368422, 1.2157894736842103)), (Some(2.5586411537976645), (5.131578947368422, 1.4052631578947365)),
        (Some(2.5969430281445764), (5.131578947368422, 1.5947368421052628)), (Some(2.6173446561248546), (5.131578947368422, 1.7842105263157892)), (Some(2.61984076096808), (5.131578947368422, 1.9736842105263157)),
        (Some(2.603220736217446), (5.131578947368422, 2.163157894736842)), (Some(2.5646086352064668), (5.131578947368422, 2.352631578947368)), (Some(2.4980461692425857), (5.131578947368422, 2.542105263157894)),
        (Some(2.389748809551362), (5.131578947368422, 2.731578947368421)), (Some(2.1904790044764573), (5.131578947368422, 2.921052631578947)), (None, (5.131578947368422, 3.110526315789473)),
        (Some(2.0290351633597834), (5.584210526315791, 0.45789473684210513)), (Some(2.3894736842105266), (5.584210526315791, 0.6473684210526314)), (Some(2.5634407744424603), (5.584210526315791, 0.8368421052631578)),
        (Some(2.684785686103144), (5.584210526315791, 1.026315789473684)), (Some(2.7742675553316323), (5.584210526315791, 1.2157894736842103)), (Some(2.839943791717948), (5.584210526315791, 1.4052631578947365)),
        (Some(2.8856299464368766), (5.584210526315791, 1.5947368421052628)), (Some(2.913096038679715), (5.584210526315791, 1.7842105263157892)), (Some(2.922794401640385), (5.584210526315791, 1.9736842105263157)),
        (Some(2.9140197215098125), (5.584210526315791, 2.163157894736842)), (Some(2.8846550330460845), (5.584210526315791, 2.352631578947368)), (Some(2.830252138078376), (5.584210526315791, 2.542105263157894)),
        (Some(2.7411998925554393), (5.584210526315791, 2.731578947368421)), (Some(2.590568859297732), (5.584210526315791, 2.921052631578947)), (None, (5.584210526315791, 3.110526315789473)),
        (None, (6.036842105263159, 0.45789473684210513)), (Some(2.5935506567405575), (6.036842105263159, 0.6473684210526314)), (Some(2.804342993722469), (6.036842105263159, 0.8368421052631578)),
        (Some(2.942743779132037), (6.036842105263159, 1.026315789473684)), (Some(3.0), (6.036842105263159, 1.2157894736842103)), (Some(3.0), (6.036842105263159, 1.4052631578947365)),
        (Some(3.0), (6.036842105263159, 1.5947368421052628)), (Some(3.0), (6.036842105263159, 1.7842105263157892)), (Some(3.0), (6.036842105263159, 1.9736842105263157)),
        (Some(3.0), (6.036842105263159, 2.163157894736842)), (Some(3.0), (6.036842105263159, 2.352631578947368)), (Some(3.0), (6.036842105263159, 2.542105263157894)),
        (Some(3.0), (6.036842105263159, 2.731578947368421)), (Some(2.963307349843393), (6.036842105263159, 2.921052631578947)), (Some(2.7212830051930634), (6.036842105263159, 3.110526315789473)),
        (Some(2.756739990653996), (6.489473684210528, 0.6473684210526314)), (Some(3.0), (6.489473684210528, 0.8368421052631578)), (Some(3.0), (6.489473684210528, 1.026315789473684)),
        (Some(3.0), (6.489473684210528, 1.2157894736842103)), (Some(3.0), (6.489473684210528, 1.4052631578947365)), (Some(3.0), (6.489473684210528, 1.5947368421052628)),
        (Some(3.0), (6.489473684210528, 1.7842105263157892)), (Some(3.0), (6.489473684210528, 1.9736842105263157)), (Some(3.0), (6.489473684210528, 2.163157894736842)),
        (Some(3.0), (6.489473684210528, 2.352631578947368)), (Some(3.0), (6.489473684210528, 2.542105263157894)), (Some(3.0), (6.489473684210528, 2.731578947368421)),
        (Some(3.0), (6.489473684210528, 2.921052631578947)), (Some(3.0), (6.489473684210528, 3.110526315789473)), (None, (6.489473684210528, 3.3)),
        (None, (6.942105263157896, 0.6473684210526314)), (Some(3.0), (6.942105263157896, 0.8368421052631578)), (Some(3.0), (6.942105263157896, 1.026315789473684)),
        (Some(3.0), (6.942105263157896, 1.2157894736842103)), (Some(3.0), (6.942105263157896, 1.4052631578947365)), (Some(3.0), (6.942105263157896, 1.5947368421052628)),
        (Some(3.0), (6.942105263157896, 1.7842105263157892)), (Some(3.0), (6.942105263157896, 1.9736842105263157)), (Some(3.0), (6.942105263157896, 2.163157894736842)),
        (Some(3.0), (6.942105263157896, 2.352631578947368)), (Some(3.0), (6.942105263157896, 2.542105263157894)), (Some(3.0), (6.942105263157896, 2.731578947368421)),
        (Some(3.0), (6.942105263157896, 2.921052631578947)), (Some(3.0), (6.942105263157896, 3.110526315789473)), (None, (6.942105263157896, 3.3)),
        (None, (7.394736842105265, 0.6473684210526314)), (Some(3.0), (7.394736842105265, 0.8368421052631578)), (Some(3.0), (7.394736842105265, 1.026315789473684)),
        (Some(3.0), (7.394736842105265, 1.2157894736842103)), (Some(3.0), (7.394736842105265, 1.4052631578947365)), (Some(3.0), (7.394736842105265, 1.5947368421052628)),
        (Some(3.0), (7.394736842105265, 1.7842105263157892)), (Some(3.0), (7.394736842105265, 1.9736842105263157)), (Some(3.0), (7.394736842105265, 2.163157894736842)),
        (Some(3.0), (7.394736842105265, 2.352631578947368)), (Some(3.0), (7.394736842105265, 2.542105263157894)), (Some(3.0), (7.394736842105265, 2.731578947368421)),
        (Some(3.0), (7.394736842105265, 2.921052631578947)), (Some(3.0), (7.394736842105265, 3.110526315789473)), (None, (7.394736842105265, 3.3)),
        (Some(3.0), (7.847368421052633, 1.026315789473684)), (Some(3.0), (7.847368421052633, 1.2157894736842103)), (Some(3.0), (7.847368421052633, 1.4052631578947365)),
        (Some(3.0), (7.847368421052633, 1.5947368421052628)), (Some(3.0), (7.847368421052633, 1.7842105263157892)), (Some(3.0), (7.847368421052633, 1.9736842105263157)),
        (Some(3.0), (7.847368421052633, 2.163157894736842)), (Some(3.0), (7.847368421052633, 2.352631578947368)), (Some(3.0), (7.847368421052633, 2.542105263157894)),
        (Some(3.0), (7.847368421052633, 2.731578947368421)), (Some(3.0), (7.847368421052633, 2.921052631578947)), (None, (7.847368421052633, 3.110526315789473)),
        (None, (8.3, 1.4052631578947365)), (None, (8.3, 1.5947368421052628)), (None, (8.3, 1.7842105263157892)),
        (None, (8.3, 1.9736842105263157)), (None, (8.3, 2.163157894736842)), (None, (8.3, 2.352631578947368)),
        (None, (8.3, 2.542105263157894)),
    ];
    let p0 = DVec3::new(1.0, 1.0, -1.0);
    let p1 = DVec3::new(7.0, 2.0, 3.0);
    let cr = 1.3;
    do_disk_test(&test_data, p0, p1, cr);
}