diff options
Diffstat (limited to 'src/vector.rs')
-rw-r--r-- | src/vector.rs | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/vector.rs b/src/vector.rs new file mode 100644 index 0000000..d4e57cc --- /dev/null +++ b/src/vector.rs @@ -0,0 +1,83 @@ +use std::fmt; +use std::ops; + +#[derive(Debug, Clone, Copy)] +pub struct Vector { + pub x: f32, + pub y: f32, + pub z: f32, +} + +impl fmt::Display for Vector { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "({:.2}, {:.2}, {:.2})", self.x, self.y, self.z) + } +} + +impl ops::Add for Vector { + type Output = Vector; + fn add(self, rhs: Self) -> Self::Output { + Vector { + x: self.x + rhs.x, + y: self.y + rhs.y, + z: self.z + rhs.z, + } + } +} + +impl ops::Sub for Vector { + type Output = Vector; + fn sub(self, rhs: Self) -> Self::Output { + Vector { + x: self.x - rhs.x, + y: self.y - rhs.y, + z: self.z - rhs.z, + } + } +} + +impl ops::Mul<f32> for Vector { + type Output = Vector; + fn mul(self, rhs: f32) -> Self::Output { + Vector { + x: self.x * rhs, + y: self.y * rhs, + z: self.z * rhs, + } + } +} + +impl ops::Div<f32> for Vector { + type Output = Vector; + fn div(self, rhs: f32) -> Self::Output { + Vector { + x: self.x / rhs, + y: self.y / rhs, + z: self.z / rhs, + } + } +} + +impl Vector { + pub fn magnitude_squared(self) -> f32 { + self.x * self.x + self.y * self.y + self.z * self.z + } + + pub fn magnitude(self) -> f32 { + self.magnitude_squared().sqrt() + } + + pub fn normalized(self) -> Vector { + let mag = self.magnitude(); + self / mag + } + + pub fn rotate_z(self, angle: f32) -> Vector { + // TODO: multiply by a matirx + Vector { + x: self.x * angle.cos() + self.y * angle.sin(), + y: self.y * angle.cos() - self.x * angle.sin(), + z: self.z, + } + } +} |