use std::{
cmp::PartialEq,
fmt::{Display, Result},
};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Vec3D {
pub x: f64,
pub y: f64,
pub z: f64,
}
impl Vec3D {
impl_vec_single_value_const!(Vec3D, ZERO, 0.0, x, y, z);
impl_vec_single_value_const!(Vec3D, ONE, 1.0, x, y, z);
impl_vec_core!(Vec3D, f64, x, y, z);
pub fn dot(&self, other: Vec3D) -> f64 {
self.x * other.x + self.y * other.y + self.z * other.z
}
pub fn dot_self(&self) -> f64 {
self.x.powi(2) + self.y.powi(2) + self.z.powi(2)
}
pub fn magnitude(&self) -> f64 {
(self.x.powi(2) + self.y.powi(2) + self.z.powi(2)).sqrt()
}
}
impl Display for Vec3D {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result {
write!(f, "Vec3D({}, {}, {})", self.x, self.y, self.z)
}
}
impl<T: Into<f64>> From<(T, T, T)> for Vec3D {
fn from(value: (T, T, T)) -> Self {
Self {
x: value.0.into(),
y: value.1.into(),
z: value.2.into(),
}
}
}
impl_vec_add!(Vec3D, x, y, z);
impl_vec_sub!(Vec3D, x, y, z);
impl_vec_neg!(Vec3D, 0.0, x, y, z);
impl_vec_mul!(Vec3D, x, y, z);
impl_vec_mul_single!(Vec3D, f64, x, y, z);
impl_vec_div!(Vec3D, x, y, z);
impl_vec_div_single!(Vec3D, f64, x, y, z);
impl_vec_rem!(Vec3D, x, y, z);