use crate::{Circle, Ellipse, Hyperbola, Line, Parabola, Plane, Point, Point2D, Vector};
mod completeness;
mod conic;
mod curve_curve;
mod curve_curve_hull;
mod curve_surface;
mod curve_surface_hull;
mod dispatch;
mod inline_or_heap_list;
mod marching;
mod mixed;
mod overlap_runs;
mod pieces;
mod results;
mod routing;
pub use completeness::{Completeness, IncompleteReason};
mod surface_surface;
pub(crate) use conic::{Conic, intersect_conic_conic, intersect_conic_quadric};
pub use curve_curve::curve_curve_extrema;
pub use curve_curve::intersect_curve_curve;
#[cfg(test)]
pub(crate) use curve_curve::search_curve_curve;
pub use curve_curve_hull::{CurveCurveExtrema, CurveCurveRegion};
pub use curve_surface::intersect_curve_surface;
#[cfg(test)]
pub(crate) use curve_surface::search_curve_surface;
pub use curve_surface_hull::CurveSurfaceRegion;
pub use dispatch::{
ExactCurveCurveIntersection, ExactCurveSurfaceIntersection, ExactSurfaceIntersection,
InlineList, IntersectExact,
};
pub(crate) use results::curve_surface_multiplicity;
pub use results::{
CurveCurveIntersection, CurveCurveIntersection2D, CurveCurveOverlap, CurveSurfaceIntersection,
IntersectionCurve, IntersectionMethod, SurfaceSurfaceIntersection, SurfaceSurfaceRegion,
};
pub use routing::Intersect;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlanePlaneIntersection {
Line(Line),
Parallel,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneSphereIntersection {
Circle(Circle),
TangentPoint(Point),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereSphereIntersection {
Circle(Circle),
TangentPoint(Point),
Empty,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneCylinderIntersection {
Circle(Circle),
Ellipse(Ellipse),
TwoLines(Line, Line),
TangentLine(Line),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneConeIntersection {
Circle(Circle),
Ellipse(Ellipse),
Parabola(Parabola),
Hyperbola(Hyperbola, Hyperbola),
TwoLines(Line, Line),
TangentLine(Line),
ApexPoint(Point),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LinePlaneIntersection {
Point(f64, Point),
Parallel,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineQuadricIntersection {
TwoPoints((f64, Point), (f64, Point)),
OnePoint(f64, Point),
Tangent(f64, Point),
Empty,
Coincident,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LineTorusIntersection {
Hits(Vec<LineTorusHit>),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LineTorusHit {
pub line_parameter: f64,
pub point: Point,
pub surface_parameters: (f64, f64),
pub multiplicity: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereCylinderIntersection {
Circle(Circle),
TwoCircles(Circle, Circle),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereConeIntersection {
TwoCircles(Circle, Circle),
TangentCircle(Circle),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CylinderCylinderIntersection {
TwoLines(Line, Line),
TangentLine(Line),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConeCylinderIntersection {
TwoCircles(Circle, Circle),
ApexPoint(Point),
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusPlaneIntersection {
TwoCircles(Circle, Circle),
TangentCircle(Circle),
Circle(Circle),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusSphereIntersection {
Circle(Circle),
TwoCircles(Circle, Circle),
TangentCircle(Circle),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusCylinderIntersection {
TwoCircles(Circle, Circle),
TangentCircle(Circle),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LatitudeRing {
pub circle: Circle,
pub tangent: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TorusConeIntersection {
Rings(Vec<LatitudeRing>),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusTorusIntersection {
Circle(Circle),
TwoCircles(Circle, Circle),
TangentCircle(Circle),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConeConeIntersection {
Circle(Circle),
TwoCircles(Circle, Circle),
ApexPoint(Point),
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineLine2DIntersection {
Point(f64, Point2D, f64),
Parallel,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineCircle2DIntersection {
Points((f64, Point2D), (f64, Point2D)),
Tangent(f64, Point2D),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CircleCircle2DIntersection {
Points(Point2D, Point2D),
Tangent(Point2D),
Empty,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineLineIntersection {
Point(f64, Point, f64),
Parallel(f64),
Coincident,
Skew {
s: f64,
t: f64,
distance: f64,
},
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineCircleIntersection {
Points((f64, Point), (f64, Point)),
Tangent(f64, Point),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CircleCircleIntersection {
Points(Point, Point),
Tangent(Point),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LineConicHit {
pub line_parameter: f64,
pub point: Point,
pub conic_parameter: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LineConicIntersection {
Points(LineConicHit, LineConicHit),
Tangent(LineConicHit),
Empty,
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct ImplicitConic {
a2: f64,
b2: f64,
c2: f64,
d1: f64,
e1: f64,
f0: f64,
}
impl ImplicitConic {
pub(crate) fn ellipse(a: f64, b: f64) -> ImplicitConic {
ImplicitConic {
a2: 1.0 / (a * a),
b2: 1.0 / (b * b),
c2: 0.0,
d1: 0.0,
e1: 0.0,
f0: -1.0,
}
}
pub(crate) fn parabola(focal: f64) -> ImplicitConic {
ImplicitConic {
a2: 0.0,
b2: 1.0,
c2: 0.0,
d1: -4.0 * focal,
e1: 0.0,
f0: 0.0,
}
}
pub(crate) fn hyperbola(a: f64, b: f64) -> ImplicitConic {
ImplicitConic {
a2: 1.0 / (a * a),
b2: -1.0 / (b * b),
c2: 0.0,
d1: 0.0,
e1: 0.0,
f0: -1.0,
}
}
pub(crate) fn line_substitute(&self, ox: f64, oy: f64, dx: f64, dy: f64) -> (f64, f64, f64) {
let qa = self.a2 * dx * dx + self.b2 * dy * dy + self.c2 * dx * dy;
let qb = 2.0 * self.a2 * ox * dx
+ 2.0 * self.b2 * oy * dy
+ self.c2 * (ox * dy + oy * dx)
+ self.d1 * dx
+ self.e1 * dy;
let qc = self.a2 * ox * ox
+ self.b2 * oy * oy
+ self.c2 * ox * oy
+ self.d1 * ox
+ self.e1 * oy
+ self.f0;
(qa, qb, qc)
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct PlacedConic {
pub plane: Plane,
pub x: Vector,
pub y: Vector,
pub origin: Point,
pub implicit: ImplicitConic,
pub extent: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ConicSurfaceHit {
pub parameter: f64,
pub point: Point,
pub multiplicity: u32,
}
#[derive(Debug, Clone, PartialEq)]
pub enum CircleSurfaceIntersection {
Circle(Circle),
Hits(Vec<ConicSurfaceHit>),
Empty,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ConicSurfaceIntersection {
Hits(Vec<ConicSurfaceHit>),
Coincident,
Empty,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ConicConicIntersection {
Hits(Vec<CurveCurveHit>),
Coincident,
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveCurveExtremum {
pub first_parameter: f64,
pub second_parameter: f64,
pub distance: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveCurveHit {
pub first_parameter: Option<f64>,
pub second_parameter: Option<f64>,
pub point: Point,
pub multiplicity: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveCurveHit2D {
pub first_parameter: Option<f64>,
pub second_parameter: Option<f64>,
pub point: Point2D,
pub multiplicity: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveSurfaceHit {
pub curve_parameter: Option<f64>,
pub surface_parameters: Option<(f64, f64)>,
pub point: Point,
pub multiplicity: u32,
}
#[deprecated(
since = "0.37.0",
note = "renamed `LineConicIntersection`: only 2D types carry a dimension suffix"
)]
pub type LineConic3DIntersection = LineConicIntersection;
#[deprecated(
since = "0.37.0",
note = "renamed `CircleCircleIntersection`: only 2D types carry a dimension suffix"
)]
pub type CircleCircle3DIntersection = CircleCircleIntersection;
#[deprecated(
since = "0.37.0",
note = "renamed `LineCircleIntersection`: only 2D types carry a dimension suffix"
)]
pub type LineCircle3DIntersection = LineCircleIntersection;
#[deprecated(
since = "0.37.0",
note = "renamed `LineLineIntersection`: only 2D types carry a dimension suffix"
)]
pub type LineLine3DIntersection = LineLineIntersection;