Expand description
§affn - Affine Geometry Primitives
This crate provides strongly-typed coordinate systems with compile-time safety for scientific computing applications. It defines the mathematical foundation for working with positions, directions, and displacements in various reference frames.
§Domain-Agnostic Design
affn is a pure geometry kernel that contains no domain-specific vocabulary.
Concrete frame and center types (e.g., astronomical frames, robotic frames)
should be defined in downstream crates that depend on affn.
See conic for the dedicated guide to the conic geometry layer.
§Core Concepts
§Reference Centers
A ReferenceCenter defines the origin point of a coordinate system.
Some centers require runtime parameters (stored in ReferenceCenter::Params).
§Reference Frames
A ReferenceFrame defines the orientation of coordinate axes.
§Coordinate Types
- Position: An affine point in space (center + frame + distance)
- Direction: A unit vector representing orientation (frame only)
- Displacement/Velocity: Free vectors (frame + magnitude)
- Conic geometry: Reusable conic-family classification plus shape and orientation containers without time or propagation semantics
§Creating Custom Frames and Centers
Use derive macros for convenient definitions:
use affn::prelude::*;
#[derive(Debug, Copy, Clone, ReferenceFrame)]
struct MyFrame;
#[derive(Debug, Copy, Clone, ReferenceCenter)]
struct MyCenter;
assert_eq!(MyFrame::frame_name(), "MyFrame");
assert_eq!(MyCenter::center_name(), "MyCenter");§Algebraic Rules
The type system enforces mathematical correctness:
| Operation | Result | Meaning |
|---|---|---|
Position - Position | Displacement | Displacement between points |
Position + Displacement | Position | Translate point |
Displacement + Displacement | Displacement | Add displacements |
Direction * Length | Displacement | Scale direction |
normalize(Displacement) | Direction | Extract orientation |
§Example
use affn::cartesian::{Position, Displacement};
use affn::frames::ReferenceFrame;
use affn::centers::ReferenceCenter;
use qtty::*;
// Define domain-specific types
#[derive(Debug, Copy, Clone)]
struct WorldFrame;
impl ReferenceFrame for WorldFrame {
fn frame_name() -> &'static str { "WorldFrame" }
}
#[derive(Debug, Copy, Clone)]
struct WorldOrigin;
impl ReferenceCenter for WorldOrigin {
type Params = ();
fn center_name() -> &'static str { "WorldOrigin" }
}
let a = Position::<WorldOrigin, WorldFrame, Kilometer>::new(100.0, 200.0, 300.0);
let b = Position::<WorldOrigin, WorldFrame, Kilometer>::new(150.0, 250.0, 350.0);
// Positions subtract to give displacements
let displacement: Displacement<WorldFrame, Kilometer> = b - a;Re-exports§
pub use centers::AffineCenter;pub use centers::NoCenter;pub use centers::ReferenceCenter;pub use frames::ReferenceFrame;pub use ops::Isometry3;pub use ops::Rotation3;pub use ops::Translation3;pub use cartesian::CenterParamsMismatchError;pub use cartesian::Direction as CartesianDirection;pub use cartesian::Displacement;pub use cartesian::Position;pub use cartesian::Vector;pub use cartesian::Velocity;pub use conic::ClassifiedPeriapsisParam;pub use conic::ClassifiedSemiMajorAxisParam;pub use conic::ConicKind;pub use conic::ConicOrientation;pub use conic::ConicShape;pub use conic::ConicValidationError;pub use conic::Elliptic;pub use conic::EllipticPeriapsis;pub use conic::EllipticSemiMajorAxis;pub use conic::Hyperbolic;pub use conic::HyperbolicPeriapsis;pub use conic::HyperbolicSemiMajorAxis;pub use conic::KindMarker;pub use conic::NonParabolicKindMarker;pub use conic::OrientedConic;pub use conic::Parabolic;pub use conic::ParabolicPeriapsis;pub use conic::PeriapsisParam;pub use conic::SemiMajorAxisParam;pub use conic::TypedPeriapsisParam;pub use conic::TypedSemiMajorAxisParam;pub use spherical::Direction as SphericalDirection;pub use spherical::Position as SphericalPosition;pub use ellipsoidal::Position as EllipsoidalPosition;
Modules§
- cartesian
- Cartesian Coordinates Module
- centers
- Reference Centers Module
- conic
- Domain-agnostic conic geometry primitives.
- ellipsoid
- Ellipsoid Module
- ellipsoidal
- Ellipsoidal coordinate types.
- frames
- Reference Frames Module
- ops
- Affine Operators Module
- prelude
- Prelude module for convenient imports.
- spherical
- Spherical coordinate types.
Derive Macros§
- Derive
Reference Center - Derive macro for implementing
ReferenceCenter. - Derive
Reference Frame - Derive macro for implementing
ReferenceFrame.