cavalier_contours 0.7.0

2D polyline/shape library for offsetting, combining, etc.
Documentation
use cavalier_contours::core::math::{CircleCircleIntr::*, Vector2, circle_circle_intr};

macro_rules! assert_case_eq {
    ($left:expr, $right:expr) => {
        match ($left, $right) {
            (NoIntersect, NoIntersect) => {}
            (TangentIntersect { point: a1 }, TangentIntersect { point: a2 }) if a1.fuzzy_eq(a2) => {
            }
            (
                TwoIntersects {
                    point1: a1,
                    point2: b1,
                },
                TwoIntersects {
                    point1: a2,
                    point2: b2,
                },
            ) if a1.fuzzy_eq(a2) && b1.fuzzy_eq(b2) => {}
            (Overlapping, Overlapping) => (),
            _ => panic!(
                "intersect cases do not match: left: {:?}, right: {:?}",
                $left, $right
            ),
        };
    };
}

#[test]
fn no_intersect_outside() {
    let r1 = 1.0;
    let c1 = Vector2::new(-1.0, -1.0);
    let r2 = 0.5;
    let c2 = Vector2::new(0.0, 5.0);
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    assert_case_eq!(result, NoIntersect::<f64>);
}

#[test]
fn no_intersect_inside() {
    let r1 = 5.0;
    let c1 = Vector2::new(-1.0, -1.0);
    let r2 = 0.5;
    let c2 = Vector2::new(1.0, 1.0);
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    assert_case_eq!(result, NoIntersect::<f64>);
}

#[test]
fn tangent_intersect_outside() {
    let r1 = 1.0;
    let c1 = Vector2::new(-1.0, 1.0);
    let r2 = 0.5;
    let c2 = Vector2::new(0.5, 1.0);
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    assert_case_eq!(
        result,
        TangentIntersect {
            point: Vector2::new(0.0, 1.0)
        }
    );
}

#[test]
fn tangent_intersect_inside() {
    let r1 = 3.0;
    let c1 = Vector2::new(0.0, 1.0);
    let r2 = 4.0;
    let c2 = Vector2::new(0.0, 0.0);
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    assert_case_eq!(
        result,
        TangentIntersect {
            point: Vector2::new(0.0, 4.0)
        }
    );
}

#[test]
fn two_intersects() {
    let r1 = 3.0;
    let c1 = Vector2::new(0.0, 1.0);
    let r2 = 4.0;
    let c2 = Vector2::new(5.0, 5.0);
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    let expected_point1 = Vector2::new(2.945782625365772, 1.567771718292785);
    let expected_point2 = Vector2::new(1.2005588380488623, 3.749301452438922);
    assert_case_eq!(
        result,
        TwoIntersects {
            point1: expected_point1,
            point2: expected_point2
        }
    );
}

#[test]
fn overlapping() {
    let r1 = 1.0;
    let c1 = Vector2::new(-1.0, 1.0);
    let r2 = r1;
    let c2 = c1;
    let result = circle_circle_intr(r1, c1, r2, c2, 1e-5);
    assert_case_eq!(result, Overlapping::<f64>);
}