rcgal 0.2.2

Rust Computational Geometry Algorithms Library.
Documentation
use crate::{
    algorithm::intersection::segment_2_segment_2::{
        is_segment_2_segment_2_intersected as KernelIsSegment2Segment2Intersected,
        segment_2_segment_2_intersection as KernelSegment2Segment2Intersection,
    },
    wasm::kernel::{
        point_2::Point2,
        segment_2::{get_segment_value, Segment2, Segment2Value},
    },
};
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn is_segment_2_segment_2_intersected(segment_a: &Segment2, segment_b: &Segment2) -> bool {
    let segment_a = get_segment_value(segment_a);
    let segment_b = get_segment_value(segment_b);
    match segment_a {
        Segment2Value::LineSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
        Segment2Value::CircleSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
        Segment2Value::ArcSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelIsSegment2Segment2Intersected(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
    }
}

#[wasm_bindgen]
pub fn segment_2_segment_2_intersection(segment_a: &Segment2, segment_b: &Segment2) -> Vec<Point2> {
    let segment_a = get_segment_value(segment_a);
    let segment_b = get_segment_value(segment_b);
    let result = match segment_a {
        Segment2Value::LineSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_line_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
        Segment2Value::CircleSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_circle_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
        Segment2Value::ArcSegment2(segment_a) => match segment_b {
            Segment2Value::LineSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_line_segment_2,
            ),
            Segment2Value::CircleSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_circle_segment_2,
            ),
            Segment2Value::ArcSegment2(segment2_b) => KernelSegment2Segment2Intersection(
                &segment_a.kernel_arc_segment_2,
                &segment2_b.kernel_arc_segment_2,
            ),
        },
    };
    result
        .into_iter()
        .map(|p| Point2 { kernel_point_2: p })
        .collect()
}