2022-04-12 19:14:11 +02:00
|
|
|
use std::ops::*;
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub struct Vec3 {
|
|
|
|
pub e: [f64; 3],
|
2022-04-07 23:04:50 +02:00
|
|
|
}
|
|
|
|
|
2022-04-20 18:58:58 +02:00
|
|
|
pub type Color = Vec3;
|
|
|
|
pub type Point3 = Vec3;
|
2022-04-07 23:04:50 +02:00
|
|
|
|
|
|
|
impl Vec3 {
|
|
|
|
pub fn new(x: f64, y: f64, z: f64) -> Self {
|
|
|
|
Vec3 { e: [x, y, z] }
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:14:11 +02:00
|
|
|
pub fn length(&self) -> f64 {
|
2022-04-07 23:04:50 +02:00
|
|
|
self.length_squared().sqrt()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn length_squared(&self) -> f64 {
|
|
|
|
self.e[0]*self.e[0]
|
|
|
|
+ self.e[1]*self.e[1]
|
|
|
|
+ self.e[2]*self.e[2]
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:14:11 +02:00
|
|
|
pub fn cross(a: Vec3, b: Vec3) -> Vec3 {
|
|
|
|
Vec3::new(a.y()*b.z() - a.z()*b.y(),
|
|
|
|
a.z()*b.x() - a.x()*b.z(),
|
|
|
|
a.x()*b.y() - a.y()*b.x())
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn dot(a: Vec3, b: Vec3) -> f64 {
|
|
|
|
a.x()*b.x() + a.y()*b.y() + a.z()*b.z()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn unit_vector(a: Vec3) -> Vec3 {
|
|
|
|
a / a.length()
|
|
|
|
}
|
|
|
|
|
2022-04-07 23:04:50 +02:00
|
|
|
pub fn x(&self) -> f64 { self.e[0] }
|
|
|
|
pub fn y(&self) -> f64 { self.e[1] }
|
|
|
|
pub fn z(&self) -> f64 { self.e[2] }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Add for Vec3 {
|
|
|
|
type Output = Vec3;
|
|
|
|
|
|
|
|
fn add(self, rhs: Self) -> Vec3 {
|
2022-04-12 19:14:11 +02:00
|
|
|
Vec3::new(self.x()+rhs.x(), self.y()+rhs.y(), self.z()+rhs.z())
|
2022-04-07 23:04:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl AddAssign for Vec3 {
|
|
|
|
fn add_assign(&mut self, rhs: Self) {
|
|
|
|
self.e[0] += rhs.x();
|
|
|
|
self.e[1] += rhs.y();
|
|
|
|
self.e[2] += rhs.z();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Sub for Vec3 {
|
|
|
|
type Output = Vec3;
|
|
|
|
|
|
|
|
fn sub(self, rhs: Self) -> Vec3 {
|
|
|
|
Vec3::new(self.x()-rhs.x(), self.y()-rhs.y(), self.z()-rhs.z())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:14:11 +02:00
|
|
|
impl SubAssign for Vec3 {
|
|
|
|
fn sub_assign(&mut self, rhs: Self) {
|
|
|
|
self.e[0] -= rhs.x();
|
|
|
|
self.e[1] -= rhs.y();
|
|
|
|
self.e[2] -= rhs.z();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-07 23:04:50 +02:00
|
|
|
impl Mul<Vec3> for f64 {
|
|
|
|
type Output = Vec3;
|
|
|
|
|
|
|
|
fn mul(self, rhs: Vec3) -> Vec3 {
|
2022-04-12 19:14:11 +02:00
|
|
|
Vec3::new(self*rhs.x(), self*rhs.y(), self*rhs.z())
|
2022-04-07 23:04:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MulAssign<f64> for Vec3 {
|
|
|
|
fn mul_assign(&mut self, rhs: f64) {
|
|
|
|
self.e[0] *= rhs;
|
|
|
|
self.e[1] *= rhs;
|
|
|
|
self.e[2] *= rhs;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl DivAssign<f64> for Vec3 {
|
2022-04-12 19:14:11 +02:00
|
|
|
fn div_assign(&mut self, rhs: f64) {
|
2022-04-07 23:04:50 +02:00
|
|
|
self.e[0] /= rhs;
|
|
|
|
self.e[1] /= rhs;
|
|
|
|
self.e[2] /= rhs;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:14:11 +02:00
|
|
|
impl Div<f64> for Vec3 {
|
|
|
|
type Output = Vec3;
|
|
|
|
|
|
|
|
fn div(self, rhs: f64) -> Vec3 {
|
|
|
|
Vec3::new(self.x()/rhs, self.y()/rhs, self.z()/rhs)
|
|
|
|
}
|
|
|
|
}
|