use std;
use units::{self, Eval};
#[derive(Serialize, Deserialize, PartialEq, Debug, Copy, Clone)]
pub struct Vector<T: Eval>
where T: Copy
{
vector: [T; 3],
}
impl<T: Eval> Vector<T>
where T: Copy
{
pub fn new(input: [T; 3]) -> Vector<T> {
Vector { vector: input }
}
pub fn get(&self) -> &[T; 3] {
&self.vector
}
pub fn displacement(p0: &Vector<T>, p1: &Vector<T>) -> Vector<T> {
p0.vector
.iter()
.zip(p1.vector.iter())
.map(|(a, b)| T::new(b.eval() - a.eval()))
.collect()
}
pub fn distance(p0: &Vector<T>, p1: &Vector<T>) -> units::Length {
units::Length::new(Vector::displacement(p0, p1)
.vector
.iter()
.map(|x| x.eval().powi(2))
.sum::<units::Scalar>()
.sqrt())
}
pub fn magnitude(&self) -> units::Length {
let origin = Vector::new([T::new(0.0); 3]);
Vector::distance(&origin, self)
}
pub fn normalize(&self) -> Vector<T> {
let magnitude = self.magnitude();
self.vector
.iter()
.map(|x| x.eval() / magnitude.eval())
.map(T::new)
.collect()
}
}
impl<T: Eval> std::iter::FromIterator<T> for Vector<T>
where T: Copy
{
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut x = iter.into_iter();
Vector::new([x.next().unwrap(), x.next().unwrap(), x.next().unwrap()])
}
}
impl<T: Eval> std::ops::Add for Vector<T>
where T: Copy
{
type Output = Vector<T>;
fn add(self, other: Vector<T>) -> Vector<T> {
self.vector
.iter()
.zip(other.vector.iter())
.map(|(a, b)| T::new(a.eval() + b.eval()))
.collect()
}
}