use ga2::{Bivector, Rotor, Vector};
use scalars::{Inv, One, Zero};
use spatial_motion::{Movement, Transform};
type Transform2 = Transform<Vector<f32>, Rotor<f32>>;
type Movement2 = Movement<Vector<f32>, Bivector<f32>>;
#[test]
fn identity() {
let transform = Transform2::one();
let point = Vector::new(1.0, 2.0);
assert_eq!(transform.apply(point), point);
}
#[test]
fn composition_with_identity() {
let transform = Transform2 {
position: Vector::new(3.0, 4.0),
orientation: Rotor::one(),
};
let identity = Transform2::one();
assert_eq!((transform * identity).position, transform.position);
}
#[test]
fn inverse() {
let transform = Transform2 {
position: Vector::new(3.0, 4.0),
orientation: Rotor::one(),
};
let result = transform * transform.inv();
assert!(result.position.x.abs() < 1e-6);
assert!(result.position.y.abs() < 1e-6);
assert!(result.orientation.is_one());
}
#[test]
fn movement_application() {
let mut transform = Transform2::one();
let movement = Movement2 {
velocity: Vector::new(1.0, 2.0),
spin: Bivector::zero(),
};
transform += movement;
assert_eq!(transform.position, Vector::new(1.0, 2.0));
assert!(transform.orientation.is_one());
}
#[test]
fn apply_point() {
use vector_space::Transform;
let transform = Transform2 {
position: Vector::new(10.0, 20.0),
orientation: Rotor::one(),
};
let point = Vector::new(1.0, 2.0);
assert_eq!(transform.apply_point(point), Vector::new(11.0, 22.0));
}