Expand description
A pure, standalone geometric kernel for CAD-grade curves and surfaces.
geomcore provides parametric evaluation of elementary curves and
surfaces (lines, circles, ellipses, parabolas, hyperbolas, B-splines;
planes, cylinders, cones, spheres, tori, B-spline surfaces), rigid
transformations, and analytic curve-on-surface parametrization: computing
the exact 2D representation of a 3D curve in a surface’s parameter space
wherever a closed form exists.
§Namespace layout
- The crate root re-exports the placement and value types shared by
everything else:
Point3D/Point2D,Vector3D/Vector2D,Axis3D/Axis2D,Frame3D/Frame2D, andTransform. curvesholds the 3D and 2D curve types (curves::Line3D,curves::Circle3D,curves::Ellipse3D,curves::Parabola3D,curves::Hyperbola3D,curves::BSplineCurve3D,curves::Line2D,curves::Circle2D), thecurves::Curve3D/curves::Curve2Denum adaptors, thecurves::TrimmedCurve3D/curves::TrimmedCurve2Dpieces of a curve over a parameter range (segments, arcs), and thecurves::ParametricCurve3D/curves::ParametricCurve2Dtraits.surfacesholds the five elementary analytic surfaces (surfaces::Plane,surfaces::Cylinder,surfaces::Cone,surfaces::Sphere,surfaces::Torus) plussurfaces::BSplineSurface, thesurfaces::Surfaceenum adaptor, and thesurfaces::ParametricSurfacetrait.
§Quick start
use geomcore::{Cylinder, Point3D, Vector3D};
use geomcore::curves::Circle3D;
// Evaluate a circle at a single parameter, and over a batch of parameters.
let circle = Circle3D::new(Point3D::ORIGIN, Vector3D::Z, 2.0).unwrap();
let point = circle.eval_point(std::f64::consts::PI / 4.0);
let points = circle.eval_points(&[0.0, 1.0, 2.0]);
assert_eq!(points[0], circle.eval_point(0.0));
// Curve-on-surface parametrization: this circle is coaxial with the
// cylinder, so it has an exact 2D image, a horizontal line in (u, v).
let cylinder = Cylinder::new(Point3D::ORIGIN, Vector3D::Z, 2.0).unwrap();
let pcurve = circle.parametrize_on(&cylinder).unwrap();§Intersections
Intersect is the one entry point for exact intersections. Between
two concrete types it returns the pair’s own result, in either order:
use geomcore::{Intersect, PlaneSphereIntersection, Point3D, Vector3D};
use geomcore::surfaces::{Plane, Sphere};
let plane = Plane::new(Point3D::ORIGIN, Vector3D::Z).unwrap();
let sphere = Sphere::new(Point3D::ORIGIN, 2.0).unwrap();
let tol = geomcore::Tolerance::default();
let PlaneSphereIntersection::Circle(circle) = plane.intersect(&sphere, tol) else {
panic!("expected a circle");
};
assert_eq!(sphere.intersect(&plane, tol), PlaneSphereIntersection::Circle(circle));Between surfaces::Surface or curves::Curve3D values it returns
a general result such as SurfaceIntersection, which reports
NotAnalytic for a B-spline or a pair without a closed form; the
numeric functions (marching_intersection,
intersect_curve_surface, intersect_curve_curve) cover those.
§Extending the kernel
New curve or surface types are added by implementing
curves::ParametricCurve3D (or curves::ParametricCurve2D) and
surfaces::ParametricSurface respectively, without touching the
existing dispatch code in curves::Curve3D/surfaces::Surface.
Re-exports§
pub use curves::BSplineConstructionError;pub use curves::BSplineCurve3D;pub use curves::Circle2D;pub use curves::Circle3D;pub use curves::CircleConstructionError;pub use curves::Curve2D;pub use curves::Curve3D;pub use curves::ElementaryCurve;pub use curves::Ellipse3D;pub use curves::EllipseConstructionError;pub use curves::Hyperbola3D;pub use curves::HyperbolaConstructionError;pub use curves::InterpParametrization;pub use curves::Line2D;pub use curves::Line3D;pub use curves::LineConstructionError;pub use curves::Parabola3D;pub use curves::ParabolaConstructionError;pub use curves::ParametricCurve2D;pub use curves::ParametricCurve3D;pub use curves::ParametrizeError;pub use curves::PointExtrema2D;pub use curves::PointExtrema3D;pub use curves::TrimmedCurve2D;pub use curves::TrimmedCurve3D;pub use curves::TrimmedCurveConstructionError;pub use curves::parametrize_numeric;pub use frame::Axis2D;pub use frame::Axis3D;pub use frame::Frame2D;pub use frame::Frame3D;pub use frame::FrameConstructionError;pub use intersect::intersect_curve_surface;pub use intersect::marching_intersection;pub use intersect::CircleCircle2DIntersection;pub use intersect::CircleCircle3DIntersection;pub use intersect::CircleConic3DIntersection;pub use intersect::CircleConicHit;pub use intersect::CircleSurfaceIntersection;pub use intersect::ConeConeIntersection;pub use intersect::ConeCylinderIntersection;pub use intersect::ConicSurfaceHit;pub use intersect::ConicSurfaceIntersection;pub use intersect::CurveCurveExtremum;pub use intersect::CurveCurveHit;pub use intersect::CurveSurfaceHit;pub use intersect::CylinderCylinderIntersection;pub use intersect::EllipseEllipse3DIntersection;pub use intersect::EllipseEllipseHit;pub use intersect::LatitudeRing;pub use intersect::LineCircle2DIntersection;pub use intersect::LineCircle3DIntersection;pub use intersect::LineConic3DIntersection;pub use intersect::LineConicHit;pub use intersect::LineLine2DIntersection;pub use intersect::LineLine3DIntersection;pub use intersect::LinePlaneIntersection;pub use intersect::LineQuadricIntersection;pub use intersect::LineTorusHit;pub use intersect::LineTorusIntersection;pub use intersect::PlaneConeIntersection;pub use intersect::PlaneCylinderIntersection;pub use intersect::PlanePlaneIntersection;pub use intersect::PlaneSphereIntersection;pub use intersect::SphereConeIntersection;pub use intersect::SphereCylinderIntersection;pub use intersect::SphereSphereIntersection;pub use intersect::TorusConeIntersection;pub use intersect::TorusCylinderIntersection;pub use intersect::TorusPlaneIntersection;pub use intersect::TorusSphereIntersection;pub use intersect::TorusTorusIntersection;pub use intersect::CurveCurveIntersection;pub use intersect::CurveSurfaceIntersection;pub use intersect::InlineList;pub use intersect::Intersect;pub use intersect::SurfaceIntersection;pub use intersect::curve_curve_extrema;pub use intersect::intersect_curve_curve;pub use point::Point2D;pub use point::Point3D;pub use projection::CurveProjection;pub use projection::SurfaceProjection;pub use surfaces::BSplineSurface;pub use surfaces::Cone;pub use surfaces::ConeConstructionError;pub use surfaces::Cylinder;pub use surfaces::CylinderConstructionError;pub use surfaces::ElementarySurface;pub use surfaces::ParametricSurface;pub use surfaces::Plane;pub use surfaces::PlaneConstructionError;pub use surfaces::Sphere;pub use surfaces::SphereConstructionError;pub use surfaces::Surface;pub use surfaces::Torus;pub use surfaces::TorusConstructionError;pub use tolerance::Tolerance;pub use transform::Transform;pub use vector::Vector2D;pub use vector::Vector3D;
Modules§
- curves
- Public curve types: lines, conics, and B-spline curves.
Public curve types: parametric curves in 2D and 3D built on top of the
crate’s placement types (
crate::Axis3D/crate::Axis2D,crate::Frame3D/crate::Frame2D). - frame
- Axis and frame placement types. Axis and frame placement types: the coordinate systems that curves and surfaces are positioned in.
- intersect
- Analytic intersection result types. Analytic intersection result types.
- point
- Points in 2D and 3D space.
- projection
- Point-projection result types. Point-projection result types.
- surfaces
- Public surface types: planes, cylinders, cones, spheres, tori, and
B-spline surfaces.
Public surface types: the five elementary analytic surfaces (plane,
cylinder, cone, sphere, torus) plus B-spline surfaces, built on top of
the crate’s placement type (
crate::Frame3D). - tolerance
- Distance and angle tolerances shared by all geometric queries.
- transform
- Rigid and affine transformations. Rigid and affine transformations of points and vectors.
- vector
- Vectors in 2D and 3D space.