use std::ops::{Add, AddAssign, Sub, SubAssign, Mul, MulAssign, Div, DivAssign, Neg};
-pub type Nanoseconds = u64;
-
#[macro_export]
macro_rules! point {
( $x:expr, $y:expr ) => {
}
impl Point2D<f64> {
- pub fn length(self) -> f64 {
+ pub fn length(&self) -> f64 {
((self.x * self.x) + (self.y * self.y)).sqrt()
}
+ pub fn normalized(&self) -> Self {
+ let l = self.length();
+ Self {
+ x: self.x / l,
+ y: self.y / l,
+ }
+ }
+
+ pub fn to_radians(&self) -> Radians {
+ Radians(self.y.atan2(self.x))
+ }
+
+ pub fn to_degrees(&self) -> Degrees {
+ self.to_radians().to_degrees()
+ }
+
pub fn to_i32(self) -> Point2D<i32> {
Point2D {
x: self.x as i32,
impl From<Degrees> for Point2D<f64> {
fn from(item: Degrees) -> Self {
+ let r = item.0.to_radians();
Point2D {
- x: (item.0 * std::f64::consts::PI / 180.0).cos(),
- y: (item.0 * std::f64::consts::PI / 180.0).sin(),
+ x: r.cos(),
+ y: r.sin(),
}
}
}
impl Degrees {
#[allow(dead_code)]
fn to_radians(&self) -> Radians {
- Radians(self.0 * std::f64::consts::PI / 180.0)
+ Radians(self.0.to_radians())
}
}
impl Radians {
#[allow(dead_code)]
fn to_degrees(&self) -> Degrees {
- Degrees(self.0 * 180.0 * std::f64::consts::FRAC_1_PI)
+ Degrees(self.0.to_degrees())
}
}
}
}
+#[macro_export]
+macro_rules! hashmap {
+ ($($k:expr => $v:expr),*) => {
+ {
+ let mut map = std::collections::HashMap::new();
+ $(map.insert($k, $v);)*
+ map
+ }
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;