#![forbid(unsafe_code)]
use std::f64::consts::FRAC_PI_2;
use approx::assert_abs_diff_eq;
use la_stack::prelude::*;
fn main() -> Result<(), LaError> {
let x = Vector::try_new([1.0, 0.0, 0.0])?;
let y = Vector::try_new([0.0, 2.0, 0.0])?;
let angle = x.angle(&y)?;
assert_abs_diff_eq!(angle, FRAC_PI_2, epsilon = f64::EPSILON);
println!(
"Fixed vectors: {angle} radians ({} degrees)",
angle.to_degrees()
);
let large = [f64::MAX, f64::MAX, 0.0, 0.0];
let small = [-f64::MIN_POSITIVE, f64::MIN_POSITIVE, 0.0, 0.0];
let angle = large.as_slice().angle(small.as_slice())?;
assert_abs_diff_eq!(angle, FRAC_PI_2, epsilon = f64::EPSILON);
println!("Borrowed slices with different magnitudes: {angle} radians");
let tiny = f64::from_bits(1);
let left = [1.0, 0.0, 0.0, 0.0];
let right = [1.0, tiny, 0.0, 0.0];
let angle = left.as_slice().angle(right.as_slice())?;
assert_eq!(angle, tiny);
println!("Nearly parallel slices: {angle:e} radians");
Ok(())
}