axiolid-evaluate
Analytic and spline curve/surface evaluation, jets, and inversion.
| Latest release | 0.3.22 (2026-11-14) |
| crates.io | axiolid-evaluate |
| Facade | axiolid feature evaluate |
| Layer | algorithms (algorithm.parametric) |
| API documentation | rustdoc · docs.rs |
| Source | crates/algorithms/parametric/evaluate/ |
Overview
The scalar evaluation oracle for parametric geometry (ADR 0012, ADR 0036): native-domain evaluation of analytic and B-spline curves and surfaces, derivatives, jets, adaptive flattening, elementary surface inversion, arc-length evaluation of intrinsic (natural-equation) and elevated curves and of arc-length chains, arc length and its inverse on any curve, the section frames of banked curves, the derivatives and certified chord and derivative bounds of elevated and banked curves in plan distance (over an intrinsic plan with certified points, #393), certified chord bounds of the pcurves a section is read through (graphs, implicit and intrinsic curves, lifted curves and pair sections, #414), stations (a section frame at a distance along a curve, or along pieces of curves laid end to end), and ReferenceCurveEvaluator, the reference implementation of the curve-evaluation contract (ADR 0063). It has no mesh, spatial, measure or provider dependency, so a parametric consumer gets evaluation without the axiolid-reference umbrella. It favours obvious correctness over speed: no intrinsics, threading or feature gates.
Depends on
Changes
Latest release, 0.3.22 (2026-11-14):
Added
bound::ChainPositionTableandbound::SeamSide(#438): certified points, unit tangents and curvature vectors of an arc-length chain, read in any order, each with a bound on its distance from the exact one. The exact chain is the representation's: an intrinsic piece's points come from anIntrinsicPositionTable; a line, circle, ellipse or B-spline piece is read at the parameter whose certified arc length (chord panels) encloses the distance, the evaluator's inverse only a guess that is bisected when its enclosure misses; placements carry the position and the turn error from piece to piece. A parametric piece may start up toPIECE_FRAME_TOLERANCEoff its local origin: a read at a join takes the piece that starts there (SeamSide::Outgoing, what the evaluator reads) or the piece that ends there (SeamSide::Incoming).Nonefor a family without a certified arc length, a piece longer than its curve and a budget that runs out.bound::ElevatedPositionTabletakes an elevated or banked curve over a chain plan (#438; 0.3.21 returnedNonefor one): the plan is read from aChainPositionTable.point3_on(d, side)reads a join from either side,jet3_onreturns the point with the first and second derivatives (the plan's from the chain table, the profile's and the pivot's in closed form; over an intrinsic plan the curve's own, bit for bit) andjet_errorsbounds how far the three can be from the exact ones.
Changed
chain::chain_certifiesisfalsefor a chain with a parametric piece other than a line, a circle, an ellipse or a B-spline (a sinusoid or a polyline, #438): no certified arc length exists to charge its evaluated ends against, soflatten2no longer claims such a chain.bound::certifies_flattening3claims an elevated curve over a chain plan again, exactly wherechain_certifiesdoes (#438; 0.3.21 refused it, #393, because its chord bound under-reported the evaluated ends).
Fixed
chain::chain_chord_bound,bound::chord_bound2over a chain andbound::chord_bound3of an elevated or banked curve over a chain plan bound the distance to the chord of the evaluated ends (#438): the exact-chord bound plus the larger distance of an evaluated end from a certifiedChainPositionTablepoint, the lower end read as the piece that starts there, the upper end as the piece that ends there. They reported only the exact chord: 1.95e-5 over[116.4375, 116.5625]of a chain of a line andk = 0.01 sin(50 s), where the exact curve lies 2.835e-3 from the chord of the evaluated ends, and 0 for a point span whose evaluated point is 1.4e-2 off; a parametric piece that starts off the end of the one before it (up toPIECE_FRAME_TOLERANCE) is charged its jump.curve::flatten2andflatten3no longer accept a span of a claimed family (certifies_flattening2/3) whose chord bound isNoneon its sagitta alone (#438): the span is refined and, at the depth limit, refused withBudgetExceeded. A chain under a stretched start frame (stretch 2 or 4) had its table refuse reads near its own bound, because a rounding allowance grew with the square of the stretch; the resultingNonebounds passed as proven and the polyline lay 3.9e-3 from the curve at a 3e-3 tolerance.
Full history: crates/algorithms/parametric/evaluate/CHANGELOG.md