use std::ops::{Add, Div, Mul, Neg, Sub}; use serde::{Deserialize, Serialize}; pub use super::numeric::{Float, Numeric}; /* Angle */ #[derive(Debug, Clone, Copy)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub enum Angle { Deg(T), Rad(T), } impl Angle where T: Numeric, { pub fn into_inner(self) -> T { match self { Self::Deg(v) => v, Self::Rad(v) => v, } } pub fn into_deg(self) -> Self { match self { Self::Deg(v) => Self::Deg(v), Self::Rad(v) => Self::Rad(T::to_degrees(v)), } } pub fn into_rad(self) -> Self { match self { Self::Deg(v) => Self::Deg(T::to_radians(v)), Self::Rad(v) => Self::Rad(v), } } pub fn abs(self) -> Self { match self { Self::Deg(value) => Self::Deg(value.abs()), Self::Rad(value) => Self::Rad(value.abs()), } } } impl Angle where T: Float, { pub fn sin(self) -> T { T::sin(self.into_rad().into_inner()) } pub fn cos(self) -> T { T::cos(self.into_rad().into_inner()) } } impl Neg for Angle where T: Neg + Numeric, { type Output = Angle; fn neg(self) -> Self::Output { match self { Self::Deg(value) => Self::Deg(-value), Self::Rad(value) => Self::Rad(-value), } } } impl Add for Angle where T: Add + Numeric, { type Output = Angle; fn add(self, v: Self) -> Self::Output { match self { Self::Deg(value) => Self::Deg(value + v.into_deg().into_inner()), Self::Rad(value) => Self::Rad(value + v.into_rad().into_inner()), } } } impl Sub for Angle where T: Sub + Numeric, { type Output = Angle; fn sub(self, v: Self) -> Self::Output { match self { Self::Deg(value) => Self::Deg(value - v.into_deg().into_inner()), Self::Rad(value) => Self::Rad(value - v.into_rad().into_inner()), } } } impl Mul for Angle where T: Mul + Numeric, { type Output = Angle; fn mul(self, factor: T) -> Self::Output { match self { Self::Deg(value) => Self::Deg(value * factor), Self::Rad(value) => Self::Rad(value * factor), } } } impl Div for Angle where T: Div + Numeric, { type Output = Angle; fn div(self, factor: T) -> Self::Output { match self { Self::Deg(value) => Self::Deg(value / factor), Self::Rad(value) => Self::Rad(value / factor), } } }