1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! Intersection: where curves and surfaces meet.
//!
//! *Elsewhere:* `IntPatch`, `GeomInt`, `IntAna`, `IntCurve`, `IntCurveSurface`,
//! `IntWalk`, `IntSurf`, `ApproxInt` and `Extrema`.
//!
//! The entry points, by what is being intersected:
//!
//! - [`intersect_surfaces`]: surface/surface, the one `ogeom-bool` builds on.
//! Analytic closed forms where they exist, with exact same-parameter
//! pcurves; the marching-and-fitting pipeline where they do not, with the
//! tolerance reported as a sum of stated parts.
//! - [`intersect_curves_2d`] / [`intersect_curves`]: curve/curve in the
//! plane and in space. The planar one is what boolean face splitting runs
//! on; the spatial one reports the gap each crossing achieved, because
//! space curves generically miss.
//! - [`intersect_curve_surface`]: curve/surface, the well-posed system, and
//! what the point-in-solid classifier casts its rays with.
//!
//! The stages underneath are public because each is separately measurable:
//! [`surface_surface`] (the closed forms), [`seeds`]/[`trace`]/[`branches`]
//! (the marcher), [`trace_tangential`] (a contact, where the surfaces touch
//! along a curve without crossing), [`approximate_branch`] (polyline to
//! curves).
//!
//! # The instruments
//!
//! The crate is held to instruments rather than trusted. They live in
//! `tests/support/`, because measuring an intersector is not something a
//! caller of one wants to do. What a caller wants is an intersector that has
//! been measured.
//!
//! One scores accuracy: every point of every reported curve against both
//! surfaces, with ground truth being the surfaces themselves rather than
//! anyone else's answer. The other scores completeness: the surfaces are
//! asked, by signed distance and the intermediate value theorem, where the
//! intersection *must* be, and every such cell had better be reached by some
//! branch. The second exists because the first cannot catch a missing answer:
//! an intersector that finds one circle of two and traces it perfectly scores
//! perfectly on accuracy alone. Both have negative controls in
//! `tests/instruments.rs`. They demonstrably fail when something is genuinely
//! missing.
pub use ;
pub use trace_tangential;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;