use crate::{Float, Number};
pub mod consts;
mod impls;
#[derive(Debug, Clone, Copy)]
pub struct Vec2<T> {
pub x: T,
pub y: T,
}
pub fn vec2<T>(x: T, y: T) -> Vec2<T>
where
T: Number<T>,
{
Vec2 { x, y }
}
impl<S> Vec2<S>
where
S: Float<S>,
{
pub fn length(&self) -> S {
(self.x * self.x + self.y * self.y).sqrt()
}
pub fn normalize(&self) -> Self {
let len = self.length();
vec2(self.x / len, self.y / len)
}
pub fn distance(&self, rhs: &Self) -> S {
let x = self.x - rhs.x;
let y = self.y - rhs.y;
(x * x + y * y).sqrt()
}
}
impl<T> Vec2<T>
where
T: Number<T>,
{
pub fn dot(&self, rhs: &Self) -> T {
(self.x * rhs.x) + (self.y * rhs.y)
}
pub fn cross(&self, rhs: &Self) -> T {
self.x * rhs.y - self.y * rhs.x
}
}