use std::ops::{Add, Sub, Neg, Mul, Div}; #[derive(Debug, Copy, Clone, PartialEq)] pub struct Vec { v: [f64; N], } impl Vec { pub const fn new(v: [f64; N]) -> Vec { Vec { v } } pub const fn new_zero() -> Vec { Vec { v: [0.; N] } } pub const fn new_one(i: usize) -> Vec { let mut v = [0.; N]; v[i] = 1.; Vec { v } } pub const fn v(&self, i: usize) -> f64 { self.v[i] } pub fn magnitude(self) -> f64 { let mut x = 0.; for i in 0..N { let v = self.v[i]; x += v*v; } f64::sqrt(x) } pub fn unit(self) -> Vec { self / self.magnitude() } pub fn distance_to(self, other: Vec) -> f64 { (self - other).magnitude() } pub fn member_mul(self, other: Vec) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = self.v[i] * other.v[i]; } Vec { v } } } impl Add for Vec { type Output = Vec; fn add(self, other: Vec) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = self.v[i] + other.v[i]; } Vec { v } } } impl Sub for Vec { type Output = Vec; fn sub(self, other: Vec) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = self.v[i] - other.v[i]; } Vec { v } } } impl Neg for Vec { type Output = Vec; fn neg(self) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = -self.v[i]; } Vec { v } } } impl Mul for Vec { type Output = Vec; fn mul(self, k: f64) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = self.v[i] * k; } Vec { v } } } impl Div for Vec { type Output = Vec; fn div(self, k: f64) -> Vec { let mut v = [0.; N]; for i in 0..N { v[i] = self.v[i] / k; } Vec { v } } }