raytracers/bheisler/src/vector.rs

89 lines
1.6 KiB
Rust

use point::Point;
use std::ops::Add;
use std::ops::Div;
use std::ops::Mul;
use std::ops::Neg;
#[derive(Clone, Copy)]
pub struct Vector3 {
pub x: f32,
pub y: f32,
pub z: f32,
}
impl Vector3 {
pub fn normalize(&self) -> Vector3 {
self / self.length()
}
pub fn length_squared(&self) -> f32 {
self.x * self.x + self.y * self.y + self.z * self.z
}
pub fn length(&self) -> f32 {
self.length_squared().sqrt()
}
pub fn dot(&self, rhs: &Vector3) -> f32 {
self.x * rhs.x + self.y * rhs.y + self.z * rhs.z
}
}
impl<'a> Div<f32> for &'a Vector3 {
type Output = Vector3;
fn div(self, rhs: f32) -> Vector3 {
Vector3 {
x: self.x / rhs,
y: self.y / rhs,
z: self.z / rhs,
}
}
}
impl<'a> Mul<f32> for &'a Vector3 {
type Output = Vector3;
fn mul(self, rhs: f32) -> Vector3 {
Vector3 {
x: self.x * rhs,
y: self.y * rhs,
z: self.z * rhs,
}
}
}
impl Add for Vector3 {
type Output = Vector3;
fn add(self, rhs: Vector3) -> Vector3 {
Vector3 {
x: rhs.x + self.x,
y: rhs.y + self.y,
z: rhs.z + self.z,
}
}
}
impl Neg for Vector3 {
type Output = Vector3;
fn neg(self) -> Vector3 {
Vector3 {
x: -self.x,
y: -self.y,
z: -self.z,
}
}
}
impl From<Point> for Vector3 {
fn from(p: Point) -> Self {
Vector3 {
x: p.x,
y: p.y,
z: p.z,
}
}
}