use crate::{
Circle3D, Ellipse3D, Hyperbola3D, Line3D, Parabola3D, Plane, Point2D, Point3D, Vector3D,
};
mod completeness;
mod conic;
mod curve_curve;
mod curve_curve_hull;
mod curve_surface;
mod curve_surface_hull;
mod dispatch;
mod marching;
mod mixed;
mod pieces;
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, intersect_curve_curve};
pub use curve_curve_hull::{CurveCurveExtrema, CurveCurveHits, CurveCurveRegion};
pub use curve_surface::intersect_curve_surface;
pub use curve_surface_hull::{CurveSurfaceHits, CurveSurfaceRegion};
pub use dispatch::{
CurveCurveIntersection, CurveSurfaceIntersection, InlineList, Intersect, SurfaceIntersection,
};
pub use marching::marching_intersection;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlanePlaneIntersection {
Line(Line3D),
Parallel,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneSphereIntersection {
Circle(Circle3D),
TangentPoint(Point3D),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereSphereIntersection {
Circle(Circle3D),
TangentPoint(Point3D),
Empty,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneCylinderIntersection {
Circle(Circle3D),
Ellipse(Ellipse3D),
TwoLines(Line3D, Line3D),
TangentLine(Line3D),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PlaneConeIntersection {
Circle(Circle3D),
Ellipse(Ellipse3D),
Parabola(Parabola3D),
Hyperbola(Hyperbola3D, Hyperbola3D),
TwoLines(Line3D, Line3D),
TangentLine(Line3D),
ApexPoint(Point3D),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LinePlaneIntersection {
Point(f64, Point3D),
Parallel,
Coincident,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineQuadricIntersection {
TwoPoints((f64, Point3D), (f64, Point3D)),
OnePoint(f64, Point3D),
Tangent(f64, Point3D),
Empty,
Coincident,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LineTorusIntersection {
Hits(Vec<LineTorusHit>),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LineTorusHit {
pub line_param: f64,
pub point: Point3D,
pub surface_params: (f64, f64),
pub multiplicity: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereCylinderIntersection {
Circle(Circle3D),
TwoCircles(Circle3D, Circle3D),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SphereConeIntersection {
TwoCircles(Circle3D, Circle3D),
TangentCircle(Circle3D),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CylinderCylinderIntersection {
TwoLines(Line3D, Line3D),
TangentLine(Line3D),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConeCylinderIntersection {
TwoCircles(Circle3D, Circle3D),
ApexPoint(Point3D),
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusPlaneIntersection {
TwoCircles(Circle3D, Circle3D),
TangentCircle(Circle3D),
Circle(Circle3D),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusSphereIntersection {
Circle(Circle3D),
TwoCircles(Circle3D, Circle3D),
TangentCircle(Circle3D),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusCylinderIntersection {
TwoCircles(Circle3D, Circle3D),
TangentCircle(Circle3D),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LatitudeRing {
pub circle: Circle3D,
pub tangent: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TorusConeIntersection {
Rings(Vec<LatitudeRing>),
Empty,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TorusTorusIntersection {
Circle(Circle3D),
TwoCircles(Circle3D, Circle3D),
TangentCircle(Circle3D),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConeConeIntersection {
Circle(Circle3D),
TwoCircles(Circle3D, Circle3D),
ApexPoint(Point3D),
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 LineLine3DIntersection {
Point(f64, Point3D, f64),
Parallel(f64),
Coincident,
Skew {
s: f64,
t: f64,
distance: f64,
},
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LineCircle3DIntersection {
Points((f64, Point3D), (f64, Point3D)),
Tangent(f64, Point3D),
Empty,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CircleCircle3DIntersection {
Points(Point3D, Point3D),
Tangent(Point3D),
Empty,
Coincident,
NotAnalytic,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LineConicHit {
pub line_param: f64,
pub point: Point3D,
pub conic_param: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LineConic3DIntersection {
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: Vector3D,
pub y: Vector3D,
pub origin: Point3D,
pub implicit: ImplicitConic,
pub extent: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ConicSurfaceHit {
pub parameter: f64,
pub point: Point3D,
pub multiplicity: u32,
}
#[derive(Debug, Clone, PartialEq)]
pub enum CircleSurfaceIntersection {
Circle(Circle3D),
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_param: f64,
pub second_param: f64,
pub distance: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveCurveHit {
pub first_param: f64,
pub point: Point3D,
pub second_param: f64,
pub multiplicity: u32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CurveSurfaceHit {
pub curve_param: f64,
pub surface_params: (f64, f64),
pub point: Point3D,
}