affn 0.5.0

Affine geometry primitives: strongly-typed coordinate systems, reference frames, and centers for scientific computing.
Documentation
use affn::cartesian::{Displacement, Position};
use affn::prelude::*;
use qtty::*;

#[derive(Debug, Copy, Clone, ReferenceFrame)]
struct LocalFrame;

#[derive(Clone, Debug, Default, PartialEq)]
struct Observer {
    lat_deg: f64,
    lon_deg: f64,
}

#[derive(Debug, Copy, Clone, ReferenceCenter)]
#[center(params = Observer)]
struct Topocentric;

fn main() {
    let site = Observer {
        lat_deg: 41.0,
        lon_deg: 2.0,
    };

    let a =
        Position::<Topocentric, LocalFrame, Meter>::new_with_params(site.clone(), 0.0, 0.0, 0.0);
    let b =
        Position::<Topocentric, LocalFrame, Meter>::new_with_params(site.clone(), 10.0, 0.0, 0.0);

    let d: Displacement<LocalFrame, Meter> = &b - &a;
    println!("distance = {}", d.magnitude());
    assert!((d.magnitude().value() - 10.0).abs() < 1e-12);
}