rcgal 0.2.2

Rust Computational Geometry Algorithms Library.
Documentation
use crate::{
    algorithm::intersection::line_segment_2_circle_segment_2::is_line_segment_2_circle_segment_2_intersected,
    kernel::{
        number_type::NumberType, point_2::Point2, segment_2::Segment2, util_enum::Segment2Type,
    },
};

use super::{
    arc_segment_2_arc_segment_2::{
        arc_segment_2_arc_segment_2_intersection, is_arc_segment_2_arc_segment_2_intersected,
    },
    circle_segment_2_arc_segment_2::{
        circle_segment_2_arc_segment_2_intersection, is_circle_segment_2_arc_segment_2_intersected,
    },
    circle_segment_2_circle_segment_2::{
        circle_segment_2_circle_segment_2_intersection,
        is_circle_segment_2_circle_segment_2_intersected,
    },
    line_segment_2_arc_segment_2::{
        is_line_segment_2_arc_segment_2_intersected, line_segment_2_arc_segment_2_intersection,
    },
    line_segment_2_circle_segment_2::line_segment_2_circle_segment_2_intersection,
    line_segment_2_line_segment_2::{
        is_line_segment_2_line_segment_2_intersected, line_segment_2_line_segment_2_intersection,
    },
};

pub fn is_segment_2_segment_2_intersected<T: NumberType>(
    segment_a: &impl Segment2<T>,
    segment_b: &impl Segment2<T>,
) -> bool {
    let segment_a_type = segment_a.segment_type();
    let segment_b_type = segment_b.segment_type();
    if segment_a_type == segment_b_type {
        match segment_a_type {
            Segment2Type::LineSegment2 => {
                is_line_segment_2_line_segment_2_intersected(segment_a, segment_b)
            }
            Segment2Type::CircleSegment2 => {
                is_circle_segment_2_circle_segment_2_intersected(segment_a, segment_b)
            }
            Segment2Type::ArcSegment2 => {
                is_arc_segment_2_arc_segment_2_intersected(segment_a, segment_b)
            }
        }
    } else {
        match segment_a_type {
            Segment2Type::LineSegment2 => match segment_b_type {
                Segment2Type::CircleSegment2 => {
                    is_line_segment_2_circle_segment_2_intersected(segment_a, segment_b)
                }
                _ => is_line_segment_2_arc_segment_2_intersected(segment_a, segment_b),
            },
            Segment2Type::CircleSegment2 => match segment_b_type {
                Segment2Type::LineSegment2 => {
                    is_line_segment_2_circle_segment_2_intersected(segment_b, segment_a)
                }
                _ => is_circle_segment_2_arc_segment_2_intersected(segment_a, segment_b),
            },
            Segment2Type::ArcSegment2 => match segment_b_type {
                Segment2Type::LineSegment2 => {
                    is_line_segment_2_arc_segment_2_intersected(segment_b, segment_a)
                }
                _ => is_arc_segment_2_arc_segment_2_intersected(segment_b, segment_a),
            },
        }
    }
}

pub fn segment_2_segment_2_intersection<T: NumberType>(
    segment_a: &impl Segment2<T>,
    segment_b: &impl Segment2<T>,
) -> Vec<Point2<T>> {
    let segment_a_type = segment_a.segment_type();
    let segment_b_type = segment_b.segment_type();
    if segment_a_type == segment_b_type {
        match segment_a_type {
            Segment2Type::LineSegment2 => {
                line_segment_2_line_segment_2_intersection(segment_a, segment_b)
            }
            Segment2Type::CircleSegment2 => {
                circle_segment_2_circle_segment_2_intersection(segment_a, segment_b)
            }
            Segment2Type::ArcSegment2 => {
                arc_segment_2_arc_segment_2_intersection(segment_a, segment_b)
            }
        }
    } else {
        match segment_a_type {
            Segment2Type::LineSegment2 => match segment_b_type {
                Segment2Type::CircleSegment2 => {
                    line_segment_2_circle_segment_2_intersection(segment_a, segment_b)
                }
                _ => line_segment_2_arc_segment_2_intersection(segment_a, segment_b),
            },
            Segment2Type::CircleSegment2 => match segment_b_type {
                Segment2Type::LineSegment2 => {
                    line_segment_2_circle_segment_2_intersection(segment_b, segment_a)
                }
                _ => circle_segment_2_arc_segment_2_intersection(segment_a, segment_b),
            },
            Segment2Type::ArcSegment2 => match segment_b_type {
                Segment2Type::LineSegment2 => {
                    line_segment_2_arc_segment_2_intersection(segment_b, segment_a)
                }
                _ => circle_segment_2_arc_segment_2_intersection(segment_b, segment_a),
            },
        }
    }
}