Bridges NurbCurve<S, D>’s pair of concrete convex_hull()/size()
impls (D=4 → ConvexHull<S,3>, D=3 → ConvexHull<S,2>) so code
generic over D (e.g. curve_curve_intersect, curve_could_contain) can
call them via a where NurbCurve<S, D>: HasConvexHull<S, C> bound —
Rust’s stable const generics can’t express C = D - 1 directly in a
single generic function.
Bridges a NurbCurve<S, D>’s Cartesian evaluation (D = 4 -> 3-D points,
D = 3 -> 2-D pcurve points) so NurbCurve::refine_parameter_at_point
can be written once for both — stable Rust’s const generics cannot express
C = D - 1 directly.
Where, within interval i of intervals between consecutive samples, a
caller of interpolate_enclosing should locate its true points: these
fractions of the way from one sample to the next.