1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use std::ops::{Add, Div, Mul, Sub}; #[derive(Clone, Copy, Debug)] pub struct Vec3 { pub x: f64, pub y: f64, pub z: f64, } impl Vec3 { pub fn zero() -> Self { Vec3 { x: 0., y: 0., z: 0., } } pub fn new(x: f64, y: f64, z: f64) -> Self { Vec3 { x, y, z } } pub fn dot(self, other: Self) -> f64 { self.x * other.x + self.y * other.y + self.z * other.z } pub fn modulus(self) -> f64 { self.dot(self).sqrt() } pub fn distance(self, other: Self) -> f64 { ((self.x - other.x) * (self.x - other.x) + (self.y - other.y) * (self.y - other.y) + (self.z - other.z) * (self.z - other.z)) .sqrt() } pub fn unit(self) -> Self { self / self.length() } pub fn length(self) -> f64 { (self.x * self.x + self.y * self.y + self.z * self.z).sqrt() } } impl Add for Vec3 { type Output = Self; fn add(self, other: Self) -> Self { Vec3 { x: self.x + other.x, y: self.y + other.y, z: self.z + other.z, } } } impl Sub for Vec3 { type Output = Self; fn sub(self, other: Self) -> Self { Vec3 { x: self.x - other.x, y: self.y - other.y, z: self.z - other.z, } } } impl Mul<f64> for Vec3 { type Output = Self; fn mul(self, other: f64) -> Self { Vec3 { x: self.x * other, y: self.y * other, z: self.z * other, } } } impl Div<f64> for Vec3 { type Output = Self; fn div(self, other: f64) -> Self { Vec3 { x: self.x / other, y: self.y / other, z: self.z / other, } } }