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
72
73
74
75
76
77
78
79
80
//! # cadcore-math
//!
//! Fundamental numeric primitives for the **cadcore** CAD kernel.
//!
//! This crate has **zero external dependencies** — everything is built on
//! `std` and const-generic arithmetic.
//!
//! ## Design rules
//!
//! * All lengths are in **millimetres** unless noted otherwise.
//! * All angles are in **radians** unless noted otherwise.
//! * [`Point3`] and [`Vec3`] are distinct types — the compiler will not let
//! you confuse a location with a direction.
//! * Every function is pure; no global mutable state.
//!
//! ## Types at a glance
//!
//! | Type | Description |
//! |---|---|
//! | [`Point3`] | A location in 3-D space |
//! | [`Vec3`] | A free vector (direction + magnitude) |
//! | [`UnitVec3`] | A `Vec3` guaranteed to have length 1 |
//! | [`Mat3`] | Column-major 3×3 matrix (rotations, linear maps) |
//! | [`Frame3`] | Right-handed orthonormal frame (origin + 3 axes) |
//! | [`Transform3`] | Rigid-body transform: rotation + translation |
//! | [`Interval`] | Closed real interval `[lo, hi]` |
//!
//! ## Quick example
//!
//! ```rust
//! use cadcore_math::{Point3, Vec3, UnitVec3, Frame3};
//!
//! let origin = Point3::new(1.0, 2.0, 3.0);
//! let dir = UnitVec3::try_from_vec(Vec3::new(0.0, 0.0, 1.0)).unwrap();
//! let frame = Frame3::from_origin_z(origin, dir);
//!
//! let world_pt = Point3::new(4.0, 5.0, 6.0);
//! let local_pt = frame.to_local_point(world_pt);
//! let back = frame.to_world_point(local_pt);
//! assert!((world_pt - back).length() < 1e-10);
//! ```
pub use Interval;
pub use Mat3;
pub use Point3;
pub use Transform3;
pub use UnitVec3;
pub use Vec3;
pub use Frame3;
/// Machine epsilon for `f64` comparisons.
pub const EPS: f64 = 1e-10;
/// π
pub const PI: f64 = PI;
/// 2π
pub const TAU: f64 = TAU;
/// Return `true` when two `f64` values are within [`EPS`] of each other.
/// Clamp `v` into `[lo, hi]`.
/// Linearly interpolate: `(1-t)*a + t*b`.