use std::ops::{Add, Div, Mul, Neg, Sub}; use num_traits::Float; #[derive(Clone, Copy, Debug, PartialEq)] pub struct Vector3 { pub x: T, pub y: T, pub z: T, } impl Vector3 { pub fn new(x: T, y: T, z: T) -> Self { Vector3 { x, y, z } } pub fn length_sqared(&self) -> T { self.x * self.x + self.y * self.y + self.z * self.z } pub fn add(&self, other: &Vector3) -> Self { Vector3 { x: self.x + other.x, y: self.y + other.y, z: self.z + other.z, } } pub fn sub(&self, other: &Vector3) -> Self { Vector3 { x: self.x - other.x, y: self.y - other.y, z: self.z - other.z, } } pub fn multiply(self, x: T, y: T, z: T) -> Self { Self { x: self.x * x, y: self.y * y, z: self.z * z, } } } impl Vector3 { pub fn length(&self) -> T { self.length_sqared().sqrt() } pub fn normalize(&self) -> Self { let length = self.length(); Vector3 { x: self.x / length, y: self.y / length, z: self.z / length, } } } impl Mul for Vector3 { type Output = Self; fn mul(self, scalar: T) -> Self { Self { x: self.x * scalar, y: self.y * scalar, z: self.z * scalar, } } } impl Add for Vector3 { type Output = Vector3; fn add(self, rhs: Self) -> Self::Output { Self { x: self.x + rhs.x, y: self.y + rhs.y, z: self.z + rhs.z, } } } impl Neg for Vector3 { type Output = Self; fn neg(self) -> Self { Vector3 { x: -self.x, y: -self.y, z: -self.z, } } } impl From<(T, T, T)> for Vector3 { fn from((x, y, z): (T, T, T)) -> Self { Vector3 { x, y, z } } } pub trait Math: Mul + Neg + Add + Div + Sub + Sized { } impl Math for f64 {} impl Math for f32 {} impl Math for i32 {} impl Math for i64 {}