Skip to content

Geometry capability comparison: Axiolid vs OCCT and CGAL, like for like ​

Date: 2026-09-23 Axiolid revision audited: cb8d203 (0.3.0 plus the #113 fix) Compared against: OCCT at 7d2efad9 (2026-08-10, the tree under ~/projects/occt/occt-research/occt) and CGAL v6.2.1 at 28811b6.

This supersedes the earlier gap list (competitive-capability-gaps-2026-09.md, removed; it is in git history). Every issue that document filed (#72 to #80) is closed, and about twenty crates have landed since, so its gap list no longer describes the kernel.

Why this comparison is scoped ​

Axiolid is a geometry kernel and nothing else. It does not read or write files, draw, store documents, or host a scripting console; those concerns live in separate projects (STEP in openbim/step, IFC in the openbim IFC workspace). OCCT bundles all of them, and CGAL bundles I/O and viewers. A comparison of whole repositories therefore measures scope, not capability.

This document compares only the geometry both reference libraries contain. Everything below is scoped that way, including the line counts.

What was excluded ​

  • OCCT: the DataExchange, Visualization, ApplicationFramework, Draw and Deprecated modules; the TKernel toolkit (OS, memory, collections, units); geometry serialisation (BinTools, BRepTools, GeomTools, BRepGraph); the Expr formula parser; the GTests suites.
  • CGAL: I/O (Stream_support, CGAL_ImageIO), viewers, Ipe and Qt plugins, build/test infrastructure, generic C++ utilities, and the machine-learning classifier. Everything else is geometry and stays, including CGAL's exact number types, since Axiolid's predicates are the counterpart.

Counting rule ​

Code lines only: blank and comment-only lines are dropped, the same way for C++ and Rust. Test directories are excluded in all three. Generated numeric tables are excluded too, because they are data, not logic: 170,587 lines in OCCT (123,680 of them in AppCont's precomputed approximation matrices) and 10,504 in CGAL. Axiolid has none.

Size by capability area ​

AreaOCCTCGALAxiolid
A. Foundations: predicates, number types, math77,335166,2307,667
B. Curves and surfaces316,286–14,259
C. B-rep topology and construction519,674–14,231
D. Polygon meshes–168,18011,040
E. Triangulations and meshing–222,543846
F. 2D polygons and arrangements–142,2132,168
G. Point sets and reconstruction–72,1722,042
H. Spatial search and miscellany–25,0511,141
Contracts, execution and facades––2,500
Total913,342796,38955,894

OCCT and CGAL barely overlap: OCCT's geometry is curves, surfaces and B-rep; CGAL's is meshes, triangulations, planar and point-set geometry. Axiolid spans all eight areas, so it is compared against both at once. In scope, OCCT is 16.3 times Axiolid and CGAL 14.2 times.

Line counts measure effort, not coverage. The capability table below is the actual gap list.

Capability rows ​

95 rows, each taken from a package or toolkit in OCCT or CGAL. Axiolid's column was graded from source and tests, never from names or docs:

  • implemented: a general algorithm with tests.
  • narrow: implemented for a named subset; the row says which.
  • scoped: deliberately not raised further. Either the narrowing is the design (a documented refusal), or it is a specialist structure with no consumer. The ledger records why for each, and the gate requires it.
  • contract only: a type, trait or refusal with no algorithm behind it.
  • absent: nothing found.

The first grading found 24 implemented, 43 narrow and 28 absent. Nine were then reclassified as scoped after review; the table below is current.

AreaRowsimplementednarrowscopedabsent
A. Foundations54100
B. Curves and surfaces166802
C. B-rep2041204
D. Polygon meshes206617
E. Triangulations101135
F. 2D112414
G. Point sets83122
H. Spatial and misc50221
Total952635925

No row graded contract only: every capability Axiolid names has an algorithm behind it, even where that algorithm is narrow.

A. Foundations ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
A1exact/filtered predicates (orient, incircle, insphere)C:Kernel_23,Filtered_kernel O:- (OCCT uses tolerances)implementedorient2d/orient3d/incircle/insphere with adaptive exact fallback via expansion arithmetic; general for any finite f64 input Evidence: crates/algorithms/predicates/src/orient3.rs::orient3d (dispatches to orient3_dyadic/expansion on filter failure), src/orientation.rs::orient2d, src/sphere.rs::incircle/insphere
A2exact number types / arbitrary precisionC:Number_types,CGAL_Core,Algebraic_* O:-implementedaxiolid-exact (#154): an outward-rounded interval filter over exact big-integer dyadic arithmetic, one expression evaluated in both tiers; signs and order of (a + b*sqrt(c))/d across radicands; exact segment crossings and line/circle hits. Division-free, so no rational type; one square root per value.
A3tolerance modelO:Precision,BRepLib tolerances C:-implementedExplicit Tolerance{linear, angular} struct, validated, no silent default; used pervasively as an explicit parameter Evidence: crates/foundation/core/src/scalar.rs::Tolerance::new/eq
A4transforms, frames, bounding boxesO:gp,Bnd,BndLib C:Kernel_23,Bounding_volumesimplementedOrthonormal SpaceFrame/PlaneFrame (validated, right-handed), Aabb with union/gap/intersects; general Evidence: crates/foundation/core/src/space_frame.rs::SpaceFrame::world, src/bounds.rs::Aabb::{intersects,gap,union}
A5linear algebra / root finding / optimisation / integrationO:math,MathRoot,MathOpt,MathInteg,PLib C:Solver_interface(excluded),QP_solvernarrowNo standalone math crate; root-finding (bisection) and Gauss-Legendre quadrature exist only inline inside curve-evaluation code, and a dense linear solve exists only inline inside curve interpolation/loft fitting — none exposed as a reusable general numeric-kernel API Evidence: crates/algorithms/parametric/evaluate/src/curve.rs (bisection, comment "Why bisection rather than a closed-form segment count"), crates/algorithms/parametric/evaluate/src/arc_length.rs:: (Gauss-Legendre quadrature), crates/algorithms/parametric/nurbs/src/fit.rs::solve (private Gaussian-elimination-style solver for interpolation only)

B. Curves and surfaces ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
B1analytic curves (line, conics) + eval/derivsO:Geom,Geom2d,ElCLib C:Circular_kernel_2implementedLine2/3, Circle2/3, Ellipse2/3 types with general closed-form jet evaluation Evidence: crates/representations/analytic/curve/src/linear.rs, src/conic.rs::Circle2/Circle3/Ellipse2/Ellipse3, evaluation in crates/algorithms/parametric/evaluate/src/curve.rs
B2B-spline/NURBS curves: eval, knot ops, degree elev, splitO:BSplCLib,Geom C:-implementedeval, knot insertion/removal, degree elevation (exact) and reduction (bounded/refusable), split -- all general for arbitrary degree/knot-vector B-splines including rational Evidence: crates/algorithms/parametric/nurbs/src/degree.rs::elevate_degree3 (exact), reduce_degree3/remove_knot3 (bounded, return BoundedResult deviation, refuse via GeomError when tolerance can't be met), src/transform.rs::split2/split3
B3analytic surfaces (plane,cyl,cone,sphere,torus)O:Geom,ElSLib C:Circular_kernel_3(partly)implementedPlane, Cylinder, EllipticalCylinder, Cone, Sphere, Torus all present as exact types with evaluation Evidence: crates/representations/analytic/surface/src/elementary.rs::Plane/Cylinder/Cone/Sphere/Torus, eval in src/evaluate.rs
B4NURBS surfaces: eval, knot ops, iso-curvesO:BSplSLib,Geom C:-narrowSurface evaluation and knot insertion in u and v (insert_surface_knot_u/v, tested) and parameter reversal exist. Missing for surfaces, though present for curves: knot removal, degree elevation and reduction, and iso-parameter curve extraction.
B5swept/revolved/extruded/offset SURFACES as typesO:Geom (SurfaceOfRevolution, OffsetSurface...) C:-narrowA Revolution helper struct exists but is pub(crate) (private, used internally by the NURBS revolution-profile module), not a public exported analytic-surface type; curve OFFSET (not surface offset) is exact-only for the helix special case and refused otherwise Evidence: crates/algorithms/parametric/nurbs/src/revolution_profile.rs::Revolution (private struct, line 234)
B6point inversion / projection on curve & surfaceO:Extrema,ProjLib,GeomAPI C:-implementedNewton-style bounded projection for curves (project_curve2/3) and surfaces (project_surface_certified/invert_surface_certified), general within declared budgets, not certified global minimum (documented) Evidence: crates/algorithms/parametric/nurbs/src/curve_projection.rs::project_curve2/project_curve3, src/certified_surface_inversion.rs::invert_surface_certified
B7curve-curve / curve-surface / surface-surface extremaO:Extrema C:-narrowExtrema exist only as a side effect of certified intersection/distance routines (distance_curve2/3_certified) for bounded parameter boxes; no general dedicated extrema API decoupled from intersection Evidence: crates/algorithms/parametric/nurbs/src/certified_curve_distance.rs::distance_curve2_certified/distance_curve3_certified
B8curve-curve intersection (2D & 3D)O:IntCurve,Geom2dInt,IntAna2d C:Intersections_2/3 (linear), Arrangement traitsnarrowCertified intersection exists for NURBS curve pairs with explicit transverse/degeneracy classification and bounded work budgets -- general for regular transverse cases, refuses/returns unresolved on tangential or unbounded-work cases; separately a simple linear line/segment intersection exists (exact, general for lines only) Evidence: crates/algorithms/parametric/nurbs/src/certified_curve_intersection.rs::intersect_curve2_certified (returns ClassifiedCurveContact2/CurveIntersectionDegeneracy), crates/algorithms/query/intersection/linear/src/line_line.rs/segment_segment.rs (exact linear-only)
B9curve-surface intersectionO:IntCurveSurface C:-narrowCertified bounded curve/surface intersection exists with the same budgeted/refusal design as B8 Evidence: crates/algorithms/parametric/nurbs/src/certified_curve_surface_intersection.rs::intersect_curve_surface_certified (options carry max_refinement_work/max_depth, refuses beyond budget)
B10surface-surface intersection (analytic + general)O:IntPatch,IntWalk,GeomInt,IntPolyh C:-narrowExplicitly documented as narrow by the source itself: both inputs must be single-span polynomial affine patches with continuous clamped axes; general patch pairs are bounded and conservatively returned as unresolved candidates rather than passed through heuristic marching Evidence: crates/algorithms/parametric/nurbs/src/certified_surface_surface_intersection.rs::intersect_surface_surface_certified (module doc, lines 1-6)
B11approximation/interpolation (fit curve/surface to points)O:AppDef,AppCont,Approx,GeomAPI C:-narrowOnly INTERPOLATION (curve passes exactly through points, chord-length parameterised, C2 cubic) and section-based lofting exist; no least-squares APPROXIMATION to a tolerance for scattered points Evidence: crates/algorithms/parametric/nurbs/src/fit.rs::interpolate_curve3 (module doc: "Interpolation, not approximation"), loft_surface in same file
B12surface filling / plate / Coons / GordonO:GeomFill,GeomPlate,Plate C:-absentNo Coons/Gordon/Plate filling code found anywhere in the workspace Evidence: grep for Coons/Gordon/Plate/filling across crates/*.rs returned no surface-filling matches (only unrelated hits: CSG "filling" comment, "hatch" comment)
B13continuity/conversion (to Bezier, to BSpline, reparam)O:GeomConvert,Convert C:-implementedBezier-segment decomposition of B-splines is a general, exact, reused primitive (used by degree elevation/reduction itself) Evidence: crates/algorithms/parametric/nurbs/src/transform.rs::bezier_segments2/bezier_segments3
B142D constraint solving (tangent circles/lines, Apollonius)O:GccAna,Geom2dGcc C:Apollonius_graph_2absentNo GccAna/Apollonius/tangency-solving code found Evidence: grep for GccAna/Apollonius/"tangent circle" across crates/*.rs returned zero matches
B15local properties: curvature, normals, inflectionsO:GeomLProp,LProp,LocalAnalysis C:Jet_fitting_3,Ridges_3(mesh)implementedGeneral regular-surface differential analysis (first/second fundamental forms, Gaussian/mean/principal curvature) with degeneracy refusal; curve curvature via CurvatureLaw for intrinsic curves Evidence: crates/algorithms/parametric/nurbs/src/surface_analysis.rs::analyze_surface (general, computes principal curvatures via discriminant with degeneracy floor)
B16laws / helix / fair curvesO:Law,HelixGeom,FairCurve C:-narrowCurvatureLaw (constant/polynomial/sinusoid/composite/piecewise) exists and drives Intrinsic3 curves including true helices (closed-form offset); no fair-curve (minimum-energy/spline-fairing) algorithm found Evidence: crates/representations/analytic/curve/src/intrinsic.rs::CurvatureLaw, crates/representations/analytic/curve/src/intrinsic3.rs (helix detection via constant curvature+torsion)

C. B-rep topology and construction ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
C1B-rep data structure (vertex/edge/wire/face/shell/solid)O:TopoDS,BRep,BRepGraph C:HalfedgeDS,Combinatorial_map,LCCimplementedFull append-only typed arena BRep<Curve3,Curve2,Surface> generic over geometry, with vertex/edge/loop/face/shell/solid; general Evidence: crates/representations/brep/src/lib.rs::BRep (add_vertex/add_edge/add_loop/add_face/add_shell/add_solid), crates/representations/topology/src/brep.rs::BRep (generic arena)
C2validity checking of B-repO:BRepCheck C:is_validimplementedaudit_brep/BRepHealth catches dangling references, open/empty loops, unpaired edge uses, overused edges, false closure claims -- general structural validator, deliberately excludes geometric self-intersection checks (documented as separate concern) Evidence: crates/representations/topology/src/audit.rs::BRepHealth (dangling_references, open_loops, unpaired_edge_uses, etc.)
C3primitives (box,cyl,cone,sphere,torus,wedge)O:BRepPrim,BRepPrimAPI C:-narrowPrimitive enum covers Block, Sphere, Cylinder, Cone, Pyramid only -- no Torus, no Wedge as primitive-solid variants (Torus exists only as an analytic surface type, B3, not as a closed primitive solid) Evidence: crates/representations/analytic/primitive/src/solid.rs::Primitive (non_exhaustive enum: Block/Sphere/Cylinder/Cone/Pyramid), tessellated by crates/algorithms/reference/src/tessellate.rs::tessellate_primitive
C4extrude/revolve (prism, revol) exactO:BRepSweep,BRepPrimAPI C:Straight_skeleton_extrusion_2narrowExact extrusion and exact revolution both exist but are restricted to specific profile families (rectangle/polygon/certain contour types), not general arbitrary-profile extrude/revolve; source itself titles the module "Exact revolution for the profile families exact extrusion already covers" Evidence: crates/algorithms/construction/construct/src/extrude_exact.rs::extrude_polygon_rings, src/revolve_exact.rs (module doc: "Exact revolution for the profile families exact extrusion already covers")
C5sweep/pipe along curve (exact)O:BRepFill,BRepOffsetAPI_MakePipe(Shell) C:-narrowGeneral sweep module exists (sweep.rs) but exact sweep is limited to specific directrix families; there is a separate "surface_curve_sweep" compile-time test suggesting only certain curve/surface combinations are exact-supported Evidence: crates/algorithms/construction/construct/src/sweep.rs, crates/execution/compile/src/directrix.rs
C6loft / thru-sectionsO:BRepOffsetAPI_ThruSections C:-narrowloft_surface in the NURBS fit module requires sections to already agree in degree and control-point count ("reconciling mismatched sections means knot merging and degree elevation... doing it implicitly would hide a shape change") -- refuses mismatched section families rather than reconciling them Evidence: crates/algorithms/parametric/nurbs/src/fit.rs::loft_surface (module doc explicitly states the restriction)
C7point classification in solid/faceO:BRepClass,BRepClass3d,TopClass C:Side_of_triangle_meshimplementedWinding-number-based exact inside/outside classification against a closed triangle mesh, using certified orient3d, general (any closed mesh); explicitly returns None (not a silent guess) for ray-degenerate ties Evidence: crates/algorithms/query/inspect/src/containment.rs::winding_number/contains
C8B-rep tessellation with toleranceO:BRepMesh C:-implementedtessellate in execution/compile drives faceting of the full BRep with explicit chord/tolerance budgets; large dedicated test suite (2288 lines) Evidence: crates/execution/compile/src/brep.rs::tessellate
C9B-rep booleans (general, incl. curved)O:BOPAlgo,BRepAlgoAPI,TopOpeBRep* C:-narrowTwo tiers exist: (1) exact boolean over general planar-faced polyhedra (boolean_polyhedra_exact, convex or non-convex, any orientation) -- general for planar-faced solids only, refuses curved faces entirely; (2) a mesh-level (tessellated) boolean provider (boolmesh, absorbed from an external crate) that operates on triangle meshes, so curved geometry is only booleaned after faceting, never exactly, and carries a known defect (a depth-2 Menger sponge panics inside the absorbed algorithm per its own module doc) Evidence: crates/algorithms/construction/construct/src/polyhedron.rs::boolean_polyhedra_exact (module doc: "General exact boolean over planar-faced solids (#77)"), narrower coaxial-prism special case in src/boolean_exact.rs::boolean_prisms_exact
C10fillet (constant/variable radius, edge networks)O:ChFi3d,BRepFilletAPI C:-narrowConstant-radius fillet limited to a single straight vertical edge of an exact prism (module doc: "Chamfer and fillet on a straight vertical edge of an exact prism"); variable/tapered-radius fillet exists but only for the same single-corner-of-a-polygon-profile family; explicitly refuses curved edges, edge loops/networks Evidence: crates/algorithms/construction/construct/src/feature.rs::fillet_extruded_profile/fillet_polygon_corner/fillet_polygon_corners (module doc: "Variable radius, edge loops, curved edges, and fillets all return typed refusals naming the missing capability"), crates/algorithms/construction/construct/src/fillet_variable.rs::TaperedFillet (single-corner taper only)
C11chamferO:ChFi3d C:-narrowSame single-straight-edge restriction as C10; general polygon-corner chamfer exists for prism profiles only, no curved-edge or edge-network chamfer Evidence: crates/algorithms/construction/construct/src/feature.rs::chamfer_extruded_profile/chamfer_polygon_corners
C12offset / shell / thickenO:BRepOffset,BRepOffsetAPI C:-narrowSolid offset/shelling module exists (offset.rs, "Solid offset and shelling (#78)") but scoped to solids constructible by the same exact-extrusion/polyhedron machinery -- no evidence of general curved-face offset/thicken across arbitrary B-rep Evidence: crates/algorithms/construction/construct/src/offset.rs (module doc: "Solid offset and shelling (#78)")
C13draft angleO:Draft,BRepOffsetAPI_DraftAngle C:-absentNo draft-angle code found anywhere in the workspace Evidence: grep for `draft.?angle
C14features (holes, ribs, local ops, split)O:BRepFeat,LocOpe C:-narrowOnly corner-local features (fillet/chamfer on a polygon corner) exist under a feature.rs module; no hole, rib, boss, or general split/local-modification operations found Evidence: crates/algorithms/construction/construct/src/feature.rs (contains only chamfer/fillet corner operations, see C10/C11)
C15shape healing / fixingO:ShapeFix,ShapeAnalysis,ShapeUpgrade C:-narrowHealing exists for triangle MESHES (weld vertices, unify orientation, drop degenerate elements, orient outward -- opt-in RepairPlan, no blanket "fix everything") and for B-rep it is AUDIT-only (C2): no B-rep-level repair/fixing (e.g. gap closing, edge merging on a BRep) found, only mesh repair Evidence: crates/algorithms/repair/heal/src/repair.rs::RepairAction/RepairPlan (module doc: "There is deliberately no All variant"), operates on axiolid_mesh
C16hidden-line removal / projection drawingO:HLRBRep,Contap C:-absentNo HLR/hidden-line-removal/silhouette-extraction algorithm found; the only "silhouette" hits are unrelated code comments (tessellation-consistency and mesh-decimation comments) Evidence: grep for `hidden.?line
C17mass properties exact (B-rep)O:BRepGProp,GProp C:-narrowExact (non-tessellated) mass-properties computation exists but refuses any non-planar face: module doc states "Only planar faces are supported. A cylindrical or spherical face needs a surface integral this module does not implement" Evidence: crates/algorithms/query/measure/src/exact.rs:: (module doc explicit refusal for curved faces)
C18B-rep distance / extrema between shapesO:BRepExtrema C:-narrowOnly floating-point metric proximity/closest-point witnesses between primitive shapes exist (ClosestPoints3); module doc states these "construct floating-point witnesses only" and that certified topological classification is a separate, unimplemented-here concern; no general certified B-rep-to-B-rep distance/extrema Evidence: crates/algorithms/query/measure/src/proximity.rs::ClosestPoints3 (module doc: "Certified topological classification belongs in axiolid-reference
C19medial axis / bisector 2DO:MAT2d,Bisector C:Straight_skeleton_2, Segment_Delaunay_graph_2absentNo medial-axis or straight-skeleton implementation; "bisector" hits found are all local per-corner angle-bisector geometry used inside fillet/chamfer construction, not a medial-axis/skeleton algorithm Evidence: grep for `medial.?axis
C202D hatchingO:Hatch,Geom2dHatch C:-absentNo hatching implementation found; the one text hit for "hatch" is an unrelated code comment ("standard escape hatch") Evidence: grep for `hatch

D. Polygon meshes ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
D1mesh data structure (halfedge/surface mesh)C:Surface_mesh,Polyhedron,HalfedgeDS O:PolynarrowTriMesh/PolygonMesh are index-buffer structures with derived EdgeAdjacency, not a persistent halfedge/DCEL mesh type; the only true halfedge DCEL in the repo is 2D (axiolid-arrangement), not a 3D mesh. Evidence: crates/representations/discrete/mesh/src/lib.rs::TriMesh,PolygonMesh
D2mesh booleans / corefinementC:PMP_Boolean_operations,Nef_3 O:-(BOP on B-rep)implementedRobust (non-exact-arithmetic) manifold boolean over general triangle meshes, absorbed own code (ADR 0047); separate from exact path (see D3). Evidence: crates/providers/mesh/boolmesh/src/provider.rs::BoolmeshProvider (implements MeshBoolean) tested by crates/providers/mesh/boolmesh/tests/analytic_boxes.rs and tests/differential_corpus.rs::bounds_do_not_lose_features_across_scales.
D3exact polyhedral booleans (Nef)C:Nef_3,Nef_2,Nef_S2 O:-narrowboolean_polyhedra_exact handles general planar-faced solids (convex or non-convex) for union/intersection/difference, constructing intersection coordinates in f64 (not exact rational/interval arithmetic despite the name); curved faces refused. No Nef-style open/half-space set representation (no unbounded regions, no 2D/spherical Nef). Evidence: crates/algorithms/construction/construct/src/polyhedron.rs::boolean_polyhedra_exact tested by crates/algorithms/construction/construct/tests/boolean_polyhedra.rs. Doc (docs/capabilities.md line ~120) confirms: "The production mesh boolean constructs intersection coordinates in f64".
D4self-intersection detectionC:PMP(self_intersections) O:BOPAlgo_CheckerSIimplementedGeneral triangle-triangle test via BVH broad phase + narrow phase; reports intersecting pairs. Evidence: crates/algorithms/repair/heal/src/intersect.rs::self_intersections (or equivalent fn) tested by crates/algorithms/repair/heal/tests/self_intersection.rs.
D5mesh repair (stitch, orient, degenerate, holes)C:PMP_Mesh_repair,Polygon_repair O:-scopedOpt-in RepairAction enum: WeldVertices, UnifyOrientation, DropDegenerateElements, OrientOutward. Deliberately no "repair everything" mode; each action applies only where safe and reports skipped when not applicable. Hole filling is a SEPARATE capability (see D6), not part of heal. Evidence: crates/algorithms/repair/heal/src/repair.rs::RepairAction,RepairPlan,RepairReport tested by crates/algorithms/repair/heal/tests/mesh.rs, tests/orient_outward.rs.
D6hole filling / fairingC:PMP (triangulate_hole, fair) O:-absentNo fill_hole/triangulate_hole/fairing function found anywhere in the workspace; heal addresses welding/orientation/degenerate removal, not boundary closure. Convex-decomposition's "cap" (D18/decompose) closes a PLANAR cut cross-section only, not an arbitrary boundary hole — different problem. Evidence: grep for fair/hole_fill/fill_hole across crates: 0 hits (excluding decompose's cut-capping).
D7isotropic remeshing / refinement / smoothingC:PMP_Remeshing,Tetrahedral_remeshing O:-narrowUniform/edge-length subdivision (4-way split) with optional surface-aware vertex placement when a source B-rep surface is known; separately, boundary-fixed Laplacian smoothing. No isotropic remeshing (target-edge-length equalization via edge flip/collapse/split combined) — only pure refinement (splitting, monotonic triangle growth) and pure smoothing, run independently. Evidence: crates/algorithms/discrete/refine/src/lib.rs::refine tested by crates/algorithms/discrete/refine/tests/refine.rs
D8simplification / decimationC:Surface_mesh_simplification O:-implementedEdge-collapse decimation with caller bound on deviation; rejects collapses that would invert a triangle, create non-manifold edges, or open the boundary. Evidence: crates/algorithms/discrete/decimate/src/collapse.rs::decimate tested by crates/algorithms/discrete/decimate/tests/decimation.rs::decimation_reduces_and_reports_its_deviation.
D9subdivision surfacesC:Subdivision_method_3 O:-absentNo Catmull-Clark/Loop subdivision scheme found. The 4-way triangle split in refine is geometric subdivision-for-refinement, not a limit-surface subdivision scheme (no smoothing masks, no valence-based weighting). Evidence: grep for subdivision/catmull/loop_subdiv: 0 hits outside refine's doc comment discussing why it is NOT that.
D10parameterization (UV unwrap)C:Surface_mesh_parameterization O:-absentNo UV/parameterization crate; region/profile is 2D construction profiles (extrusion sketches), unrelated to mesh UV unwrapping. Evidence: grep for parameteriz/uv_unwrap/lscm/ARAP: 0 relevant hits.
D11geodesics / shortest path on meshC:Surface_mesh_shortest_path,Heat_method_3 O:-absentNo geodesic-distance or mesh-surface shortest-path algorithm. axiolid-route (F8) computes visibility/shortest path in a 2D polygon plane, not on a 3D mesh surface. Evidence: grep for geodesic/shortest_path/heat_method: only 2D polygon route hits (see F8).
D12segmentation / skeletonizationC:Surface_mesh_segmentation,Surface_mesh_skeletonization O:-absentNo mesh segmentation or (3D) skeletonization code found; only unrelated 2D "route"/navigation code and mesh connected-component decomposition (component::decompose, which is D18-adjacent, not segmentation by feature/region). Evidence: grep for segmentat/skeletoniz: 0 hits besides F8's route crate and F3 (2D straight skeleton, ABSENT too, see below).
D13deformationC:Surface_mesh_deformation O:-absentNo mesh deformation (ARAP, cage, skinning) code found. Evidence: grep for deformation/as_rigid_as_possible: 0 hits.
D14mesh measures (area/volume/centroid/moments)C:PMP measures O:BRepGProp (on triangulation)implementedMeshMeasure computes area, signed volume, volume centroid, and second moments in one pass; refuses non-closed/non-manifold input for volume/moments (open shell still gets area). Evidence: crates/algorithms/query/measure/src/mesh_measure.rs::MeshMeasure::measure tested by crates/algorithms/query/measure/tests/mass_properties.rs.
D15mesh distance (Hausdorff), inside test, ray castC:PMP distance, Side_of_triangle_mesh, AABB_tree O:BRepExtremanarrowInside test (winding number, exact via orient3d) and ray cast (BVH-accelerated nearest hit) are IMPL and general. Mesh-to-mesh proximity/clearance (mesh_proximity.rs) is a min-gap/clash measure, not a full two-sided Hausdorff distance metric — reports nearest gap, "clash" as 0.0, out-of-range as None, not the symmetric max-min Hausdorff value CGAL's PMP::approximate_Hausdorff_distance computes. Evidence: crates/algorithms/query/inspect/src/containment.rs::winding_number,contains
D16mesh plane section / slicingC:Polygon_mesh_slicer O:BRepAlgoAPI_SectionimplementedScalarSection/MeshPlaneSection produce closed plane-local contours from source-topology stitching of outward-oriented closed solids; explicitly fails closed on coplanar overlap and open/non-manifold input (no region nesting claimed). Evidence: crates/algorithms/reference/src/section.rs::ScalarSection and crates/contracts/operations/mesh-section/src/conformance.rs, tested by section-related test files under algorithms/reference/tests.
D17mesh clipping/splitting by plane or meshC:PMP clip/split O:BRepAlgoAPI_SplitternarrowPlane-splitting exists via convex-decomposition's clip-and-cap machinery (D18) and via the exact-B-rep offset/solid path; general clip/split of an arbitrary mesh by an arbitrary cutting mesh (not just a plane) is not a standalone general operation — relies on the boolean provider (D2) for mesh-by-mesh splitting. Evidence: crates/algorithms/discrete/decompose/src/lib.rs (plane clip+cap, see doc comment "Two splitters")
D18convex decompositionC:Convex_decomposition_3 O:-implementedStrategy::Exact (recursive plane split to zero concavity, to tolerance) and Strategy::Approximate (bounded concavity); reports which strategy actually applied and the concavity achieved. Requires closed two-manifold solid input (refused otherwise) — this is the format precondition, not a narrowing of the decomposition algorithm itself. Evidence: crates/algorithms/discrete/decompose/src/lib.rs::Strategy,Decomposition,convex_decompose (approx name) tested by crates/algorithms/discrete/decompose/tests/decompose.rs::a_reflex_solid_is_split_into_convex_parts, an_approximate_result_never_claims_to_be_exact.
D19approximation (VSA) / shape detection (RANSAC, regions)C:Surface_mesh_approximation,Shape_detection O:-absentNo variational shape approximation or RANSAC/region-growing shape-detection code found anywhere in the workspace. Evidence: grep for shape_detection/ransac/vsa: 0 hits.
D20topology queries (genus, homotopy, cycles)C:Surface_mesh_topology O:-narrowGenus only, via Euler characteristic; refuses meshes with boundary, non-manifold edges, non-orientable characteristic, or more than one connected component (must call per-component). No homotopy/cycle-basis queries. Evidence: crates/algorithms/query/inspect/src/genus.rs::genus tested by crates/algorithms/query/inspect/tests/queries.rs.

E. Triangulations and meshing ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
E12D Delaunay / constrained DelaunayC:Triangulation_2 O:BRepMesh (internal)implementedConstrained Delaunay triangulation with certified incircle/orient2d predicates (exact arithmetic on demand), every constraint edge preserved as a union of output edges, empty-circumcircle away from constraints. Evidence: crates/algorithms/planar/triangulate/src/build.rs::triangulate (re-exported from src/lib.rs) — see also src/recover.rs
E22D quality meshing (Ruppert/Chew)C:Mesh_2 O:-scopedQuality/refine/triangulate_refined implement Ruppert-style refinement with an explicit Steiner-point budget; reports RefineOutcome::Capped when the angle bound is not reached rather than silently returning a worse mesh — a correct and deliberate refusal for inputs with small input angles (Ruppert does not terminate universally), but this means the angle guarantee is conditional, matching CGAL's own caveat, so this is genuinely close to IMPL but is marked NARROW because the crate itself documents the guarantee as conditional/capped rather than unconditional. Evidence: crates/algorithms/planar/triangulate/src/refine.rs::refine,triangulate_refined,Quality,RefineOutcome (re-exported src/lib.rs).
E33D Delaunay / regular triangulationC:Triangulation_3 O:-absentNo tetrahedralization/3D Delaunay code found anywhere in the workspace. Evidence: grep for tetrahedr/delaunay_3/Triangulation3: 0 relevant hits (only unrelated "tet" substring matches in orient3d predicate files).
E43D constrained DelaunayC:Constrained_triangulation_3 O:-absentDepends on E3, which is absent. Evidence: (same search as E3)
E5volume (tetrahedral) meshingC:Mesh_3,Tetrahedral_remeshing O:- (TKXMesh stub)absentNo tet-mesh generator; no TetMesh type exists in representations. Evidence: grep for TetMesh/tet_mesh/volume_mesh: 0 hits.
E6surface meshing of implicit/smooth surfacesC:Surface_mesher,Mesh_3 O:-narrowaxiolid-levelset extracts a surface mesh from a signed scalar field via marching-cubes-family extraction (see G5); "meshing of an implicit surface" and "isosurface extraction" are the same underlying capability here, so this row and G5 report the same evidence. No dedicated Delaunay-refinement surface mesher (CGAL Mesh_3/Surface_mesher style) with a guaranteed approximation-error bound exists. Evidence: crates/algorithms/sampled/levelset/src/lib.rs tested by crates/algorithms/sampled/levelset/tests/extract.rs::a_surface_reaching_the_bounds_still_closes.
E7alpha shapes / alpha wrapC:Alpha_shapes_2/3,Alpha_wrap_2/3 O:-absentNo alpha-shape or alpha-wrap code found. Evidence: grep for alpha_shape/AlphaShape/alpha_wrap: 0 hits.
E8Voronoi / power diagramsC:Voronoi_diagram_2,Apollonius,Segment_Delaunay_graph O:-absentNo Voronoi diagram, power diagram, Apollonius, or segment-Delaunay-graph code found. Evidence: grep for voronoi/Voronoi: 0 hits.
E9periodic / hyperbolic / spherical triangulationsC:Periodic_,Hyperbolic_,Triangulation_on_sphere_2 O:-scopedNo such structures found. Evidence: not directly searched beyond general triangulation source review
E10d-dimensional triangulations/hullsC:Triangulation,Convex_hull_d,Kernel_d O:-scopedOnly 2D triangulation and 2D/3D convex hull exist (G1); no generalized d-dimensional kernel. Evidence: see G1 evidence

F. 2D polygons and arrangements ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
F1polygon booleans (exact)C:Boolean_set_operations_2,Nef_2 O:(BOP on faces)implementedOne exact core, with holes, for straight-edge polygons (axiolid-overlay::{overlay, union_soup, Region}, #173) and arcs (arc_overlay, ADR 0070): crossings, ordering, classification, linking and nesting are exact sign decisions via axiolid-exact; output is rounded once (untouched input vertices bit-identical, segment crossings correctly rounded). No Nef-2D (open/unbounded regions). Evidence: crates/algorithms/planar/overlay/src/exact_arc.rs::boolean tested by crates/algorithms/planar/overlay/tests/arc_exact_oracle.rs (area identities and point membership) and tests/exact_straight.rs
F2polygon offset (straight/rounded)C:Straight_skeleton_2,Minkowski_sum_2 O:BRepOffsetAPI_MakeOffsetnarrowoffset_polygons/stroke_polyline in overlay crate, and Region::dilate/Region::erode (disc-expansion form). No standalone straight-skeleton-based offset (see F3, ABSENT) — offset here is the Minkowski-disc form (rounded corners only by construction; no mitred/beveled straight-skeleton offset variant). Evidence: crates/algorithms/planar/overlay/src/offset.rs::offset_polygons,stroke_polyline
F3straight skeletonC:Straight_skeleton_2 O:-absentNo straight-skeleton implementation found anywhere in the workspace (searched directly, 0 hits). Evidence: grep for straight_skeleton/StraightSkeleton: 0 hits.
F4arrangements of curves (segments, arcs, conics, Bezier)C:Arrangement_on_surface_2 O:-narrowaxiolid-arrangement is a general editable DCEL, but only for STRAIGHT-EDGE (segment) boundaries — Vertex/HalfEdge/Face store Point2 positions with no curve type. Arcs are handled only inside the separate, non-incremental arc_overlay boolean path (F1/F2), not as arrangement edges; conics and Bezier curves are not supported anywhere. Evidence: crates/algorithms/planar/arrangement/src/lib.rs::Arrangement (straight edges only) tested by crates/algorithms/planar/arrangement/tests/arrangement.rs::a_square_builds_one_bounded_face_plus_the_outer_one.
F5envelopes / lower envelopeC:Envelope_2/3 O:-scopedNo lower/upper envelope algorithm found; all "envelope" hits in the codebase refer to unrelated navigation/traversal "clearance envelope" (agent radius/height/slope) concepts in axiolid-field, not the CGAL curve-envelope sense. Evidence: grep for envelope: all hits are TraversalEnvelope in crates/algorithms/sampled/field/src/navigate.rs, unrelated capability.
F6Minkowski sum 2DC:Minkowski_sum_2 O:-narrowNo standalone 2D-specific Minkowski sum; the general axiolid-minkowski crate operates on 3D planar-faced solids (see H2) via convex-hull-of-pairwise-sums for convex operands and decompose+pairwise+boolean for non-convex. 2D callers would have to lift into 3D or use Region::dilate for the disc-only special case (F2). No 2D polygon+polygon Minkowski sum function exists. Evidence: crates/algorithms/discrete/minkowski/src/lib.rs::minkowski_sum,minkowski_sum_with (3D only) tested by crates/algorithms/discrete/minkowski/tests/minkowski.rs::the_sum_of_two_boxes_is_a_box_with_summed_extents.
F7polygon partition (convex/monotone)C:Partition_2 O:-absentNo convex or monotone polygon partition algorithm found; the CDT-based triangulation (E1) fully partitions into triangles but that is a different, finer-grained capability. Evidence: not found in overlay/triangulate/arrangement source.
F8visibility / shortest path in polygonC:Visibility_2 O:-implementedaxiolid-route computes visibility graphs and shortest paths constrained to stay inside a polygon (with holes). Evidence: crates/algorithms/planar/route/src/lib.rs tested by crates/algorithms/planar/route/tests/route.rs.
F9snap roundingC:Snap_rounding_2 O:-absentNo snap-rounding algorithm found. Evidence: grep for snap_round/SnapRound: 0 hits.
F10polyline simplificationC:Polyline_simplification_2 O:-absentNo Douglas-Peucker/Ramer or Visvalingam-Whyatt implementation found. Evidence: grep for polyline_simplif/douglas_peucker/Douglas/Ramer: 0 hits.
F11sweep-line segment intersectionC:Surface_sweep_2,Intersections_2 O:-narrowOnly pairwise segment-segment and line-line intersection exist (axiolid-intersection-linear), certified via predicates; there is no Bentley-Ottmann-style sweep-line algorithm to report all intersections among a set of N segments in better-than-quadratic time — a caller needing that must call the pairwise test O(n²) times. Evidence: crates/algorithms/query/intersection/linear/src/segment_segment.rs tested by crates/algorithms/query/intersection/linear/tests/segment_segment.rs.

G. Point sets and reconstruction ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
G1convex hull 2D/3DC:Convex_hull_2/3 O:-implemented3D: convex_hull builds a closed outward-oriented TriMesh by incremental insertion, every visibility decision through certified orient3d, typed refusals for <4 points / all-collinear / all-coplanar. 2D hull exists in axiolid-reference. Evidence: crates/algorithms/construction/construct/src/hull.rs::convex_hull tested by crates/algorithms/construction/construct/tests/convex_hull.rs
G2bounding volumes (min sphere, OBB, min rect)C:Bounding_volumes,Optimal_bounding_box O:Bnd_OBBnarrow2D only: minimum-area oriented rectangle and strict 2D convex hull. No 3D OBB, no minimum enclosing circle/sphere. Evidence: crates/algorithms/reference/src/convex_hull.rs::minimum_area_rectangle
G3point set processing (normals, outliers, smoothing, simplify)C:Point_set_processing_3 O:-absentPointCloud (in representations/discrete/pointcloud) is a plain data container (points/normals/colours/intensities, with caller-supplied normals) with no processing algorithms — no normal estimation, outlier removal, smoothing, or simplification/subsampling function exists. Evidence: crates/representations/discrete/pointcloud/src/lib.rs::PointCloud (fields/accessors only, no estimate_normals/remove_outliers/simplify found).
G4surface reconstruction (Poisson, AF, scale-space)C:Poisson_,Advancing_front_,Scale_space_* O:-scopedReconstruction exists via a custom SDF-based method (nearest-neighbour-driven signed-distance field, then G5's level-set extraction) — not Poisson, not advancing-front, not scale-space. This is a legitimate reconstruction pipeline but a single, different algorithm family from all three CGAL variants named in the row. Evidence: crates/providers/pointcloud/sdf/src/lib.rs tested by crates/providers/pointcloud/sdf/tests/reconstruct.rs
G5isosurface extraction (marching cubes, dual contouring)C:Isosurfacing_3 O:-implementedLevel-set surface extraction from a signed scalar field (marching-cubes family); closes correctly even when the surface reaches the sample-grid bounds. Evidence: crates/algorithms/sampled/levelset/src/lib.rs tested by crates/algorithms/sampled/levelset/tests/extract.rs::a_surface_reaching_the_bounds_still_closes.
G6PCA / plane fittingC:Principal_component_analysis O:-absentNo PCA or least-squares plane-fitting function found anywhere in the workspace; fit.rs in axiolid-nurbs only fits B-spline curves/surfaces through explicit points (interpolation, not PCA). Evidence: grep for fn plane_fit/least_squares_plane/fit_plane/fn pca: 0 hits
G7kd-tree / k-NN / range searchC:Spatial_searching O:BVH(nearest), NCollection_UBTreescopedPointIndex provides exact k-NN and radius search, but via a UNIFORM GRID, not a kd-tree — the crate's own docs state this is deliberate ("every query has the same radius and cell arithmetic beats tree descent") and that no tree-based point index is provided; a caller with widely varying query radii or highly non-uniform point density does not get the adaptive behaviour a kd-tree/octree would give. Evidence: crates/algorithms/query/spatial/src/points.rs::PointIndex tested by crates/algorithms/query/spatial/tests/points.rs and tests/nearest.rs
G8AABB tree / box intersectionC:AABB_tree,Box_intersection_d O:BVH,BndimplementedBvh over bounded objects (triangles/solids), adapts to geometry distribution, used by clash/ray-cast/healing; also implements box-pair broad-phase queries. Evidence: crates/algorithms/query/spatial/src/bvh.rs::Bvh tested by crates/algorithms/query/spatial/tests/bvh.rs.

H. Spatial search and miscellany ​

RowCapabilityReference (O: OCCT, C: CGAL)AxiolidScope, refusals, evidence
H1BVH / spatial indexC:AABB_tree,Orthtree O:BVHscopedBvh for objects (general, IMPL — same as G8) and PointIndex for points (uniform grid, not an orthtree/adaptive octree — see G7's narrowing, which applies here too). No adaptive Orthtree-equivalent structure exists. Evidence: crates/algorithms/query/spatial/src/bvh.rs::Bvh
H23D Minkowski sumC:Minkowski_sum_3 O:-narrowExact for convex-convex pairs (hull of pairwise vertex sums) and for non-convex via decompose+pairwise-sum+boolean-union with an explicit pairwise-sum budget (4096) that refuses rather than runs unbounded work. Minkowski DIFFERENCE additionally requires the SUBJECT to be convex — refused by name for a non-convex subject (erosion via vertex-wise containment is only valid when the subject is convex). Curved operands refused (planar-faced solids only). Evidence: crates/algorithms/discrete/minkowski/src/lib.rs::minkowski_sum,minkowski_sum_with,minkowski_difference_with tested by crates/algorithms/discrete/minkowski/tests/minkowski.rs::a_non_convex_sum_differs_from_treating_the_operand_as_convex, erosion_refuses_a_non_convex_subject.
H3convex collision / distance (GJK/SAT)C:Polytope_distance_d O:-scopedFull SAT (separating axis theorem) distance/intersection for convex shapes, by deliberate design choice (documented reasoning: SAT over GJK for the model-checking use case). Deliberately does NOT report penetration depth (documented refusal — a caller wanting EPA/penetration depth for physics is told to use a physics engine instead). This is IMPL for "convex collision/distance" as literally asked, but the row also implies GJK-class capability which is a named, explicit non-goal; marking NARROW to flag the documented penetration-depth gap. Evidence: crates/algorithms/query/collide/src/lib.rs::distance,intersects,boxes_intersect,contains_point
H4Frechet / curve distancesC:Frechet_distance O:-absentNo Frechet distance or other curve-distance metric found anywhere in the workspace. Evidence: grep for frechet/Frechet: 0 hits.
H5interpolation / barycentric coordsC:Interpolation,Barycentric_coordinates_2/3 O:-narrowBarycentric coordinates exist only as an internal by-product of ray/triangle intersection (RayHit::barycentric) and of attribute-blend interpolation inside the mesh boolean provider (boolmesh/src/attributes.rs::barycentric) — neither is exposed as a general-purpose, reusable barycentric-coordinate or interpolation API for arbitrary points against arbitrary polygons/triangles. NURBS curve/surface interpolation (fit.rs::interpolate_curve3) is a different capability (curve fitting, not barycentric coordinates). Evidence: crates/algorithms/query/intersection/ray-mesh/src/lib.rs::RayHit::barycentric (field, computed in intersect_triangle) tested by crates/algorithms/query/intersection/ray-mesh/tests/nearest_hit.rs

Where the gaps are ​

Ordered by how much downstream work each one blocks.

  1. General surface intersection (B9, B10). Surface/surface and curve/surface intersection are certified but bounded: they refuse tangential, overlapping and general curved cases. Curved booleans, exact sections, offsets and fillets all sit downstream of this, so it gates most of C.
  2. Curved B-rep booleans (C9). The exact boolean covers any planar-faced solid; anything with a curved face goes through the mesh boolean, which is robust but approximate.
  3. Construction breadth (C4-C12). Extrude, revolve, sweep and loft are exact only for named profile families (#111 tracks the extrusion side); fillet and chamfer handle one straight edge or one polygon corner, not edge chains; no draft angle (C13). Surface filling is absent (B12).
  4. 3D triangulation and volume meshing (E3-E5). No 3D Delaunay, no constrained 3D Delaunay, no tetrahedral meshing. This is CGAL's largest area and Axiolid's widest gap. Whether it is in scope needs a named consumer (simulation meshing for CFD or FEM would be one).
  5. Mesh processing breadth (D6, D9-D13, D19). No hole filling, subdivision, UV parameterisation, geodesics, segmentation or shape detection. Repair, decimation and refinement exist but are opt-in and narrow.
  6. Point-set processing (G3, G6). No normal estimation, outlier removal, smoothing or plane fitting; reconstruction exists (signed-distance field) but has to be handed clean, oriented input.
  7. 2D algorithms (F3, F5, F7, F9, F10). No straight skeleton, polygon partition, snap rounding or polyline simplification. Straight skeleton is the one with an obvious building use: roof generation and offset without rounded corners.
  8. Measurement on curved B-rep (C17). Exact mass properties refuse any non-planar face; curved solids are measured only after tessellation.

Tracked work ​

Every gap cluster is a GitHub issue in the Geometry breadth milestone. The live, gate-checked version of this table is architecture/capability-ledger.toml; cargo xtask gaps prints it ordered by priority.

IssueWorkRowsWaits on
#111Exact-mode extrusion/revolve/sweep for arbitrary and composite profiles, not just rectangle/circleC4-
#1183D oriented bounding box and minimum enclosing sphereG2-
#119General curve/surface and surface/surface intersection, including tangent and overlapping casesB7, B8, B9, B10-
#120Exact B-rep boolean for solids with curved facesC9, D3#119
#121Fillet and chamfer over edge chains and networks, constant and variable radiusC10, C11#119, #120
#122Exact sweep along arbitrary curves and loft through arbitrary sectionsB5, C5, C6-
#123Solid offset, shell and thicken over curved faces, and draft angleC12, C13#119
#124Surface filling: Coons, Gordon and plate surfaces through boundary curvesB12-
#125Exact mass properties and distance over curved B-rep facesC17, C18#119
#1263D Delaunay and constrained 3D Delaunay triangulationE3, E4-
#127Tetrahedral volume meshing with quality boundsE5#126
#128Voronoi and power diagrams, alpha shapes and alpha wrappingE7, E8-
#129Mesh hole filling with fairing, and subdivision surfacesD6, D9#140
#130Mesh geodesics and UV parameterisationD10, D11#140
#131Mesh segmentation, skeletonisation and shape detection (planes, cylinders)D12, D19#140
#132Mesh deformation with fixed handlesD13-
#133Point-set processing: normals, outliers, smoothing, simplification and plane fittingG3, G6-
#134Straight skeleton and mitred polygon offsetF2, F3-
#135Polygon partition, polyline simplification and snap roundingF7, F9, F10-
#136Shared numeric substrate: root finding, quadrature, least squares and optimisationA5-
#137B-rep shape healing: sewing, tolerance repair and small-feature removalC15-
#138Hidden-line removal and 2D projection drawings of solidsC16-
#1392D medial axis, bisectors and hatchingC19, C20-
#140Halfedge mesh representation with O(1) adjacency for 3D surface meshesD1-
#141Surface knot removal, degree elevation and iso-curve extractionB4-
#142Torus and wedge B-rep primitive solidsC3-
#143Public barycentric and mean-value coordinatesH5-
#144Mesh genus with boundaries and components, and a homology cycle basisD20-
#1452D Minkowski sum for non-convex polygonsF6-
#146Bentley-Ottmann sweep for many-segment intersectionF11-
#147Discrete and continuous Frechet distance between polylinesH4-
#148Two-sided mesh Hausdorff distance with a certified error boundD15-
#149Isotropic remeshing: split, collapse, flip and tangential relaxationD7#140
#150Least-squares curve and surface fitting to pointsB11#136
#151Fair curves: minimum-energy interpolation and batten curvesB16#136
#152Form features: holes, pockets, slots and ribs on B-rep solidsC14#120
#153Surface meshing of smooth and implicit surfaces with quality boundsE6#126
#156Clip and split a triangle mesh by another meshD17-
#1572D arrangements of circular arcs and conic curvesF4-
#1583D Minkowski sum and difference for non-convex solidsH2-
#159Apollonius and tangent-circle constructionsB14-

Where Axiolid is ahead ​

  • Refusal over silent approximation. Every narrow row above refuses by name outside its subset, with a typed error.
  • Exact predicates under the B-rep side. OCCT's modelling runs on tolerances throughout; Axiolid's planar exact boolean and overlay decide every classification with certified predicates.
  • Both halves in one kernel. OCCT has no mesh-processing toolkit to speak of and CGAL has no B-rep; Axiolid covers both, behind one typed contract layer, in pure Rust.

How this was measured ​

  • Package lists and line counts: scripts under the author's scratch area, reproducible from the pinned revisions above with any line counter that drops blank and comment-only lines.
  • Capability grades: each row was graded from the public functions and tests of the crates listed in its evidence column. Grades were spot-checked by hand; one was corrected (G2, bounding volumes: the 2D minimum-area rectangle in axiolid-reference had been missed).
  • A known-defect note in axiolid-mesh-boolean-boolmesh says a depth-2 Menger sponge panics inside the mesh boolean. Re-run at cb8d203 as 63 sequential axis-aligned differences: all succeed, none refused. That does not prove the original construction is fixed, only that this one does not reproduce it.

Released under the Mozilla Public License 2.0.