f84a9734f158109ef5181c1c72b3d431dbed9705
[bug-basher.git] / src / geometry.rs
1 use std::ops::*;
2
3 #[derive(Debug, Clone, Copy, PartialEq)]
4 pub struct Vec2d {
5     pub x: f64,
6     pub y: f64
7 }
8
9 impl Vec2d {
10     pub fn distance(&self, other: Vec2d) -> f64 {
11         self.distance_squared(other).sqrt()
12     }
13     pub fn distance_squared(&self, other: Vec2d) -> f64 {
14         ((other.x-self.x).powi(2) + (other.y-self.y).powi(2))
15     }
16
17     pub fn magnitude(&self) -> f64 {
18         self.magnitude_squared().sqrt()
19     }
20     pub fn magnitude_squared(&self) -> f64 {
21         self.x.powi(2) + self.y.powi(2)
22     }
23
24     pub fn angle(&self) -> f64 {
25         self.y.atan2(self.x)
26     }
27
28     pub fn unit(&self) -> Vec2d {
29         let mag = self.magnitude();
30         Vec2d {
31             x: self.x / mag,
32             y: self.y / mag
33         }
34     }
35 }
36
37 impl Add for Vec2d {
38     type Output = Vec2d;
39
40     fn add(self, other: Self) -> Self {
41         Vec2d {
42             x: self.x + other.x,
43             y: self.y + other.y
44         }
45     }
46 }
47
48 impl Sub for Vec2d {
49     type Output = Vec2d;
50
51     fn sub(self, other: Self) -> Self {
52         Vec2d {
53             x: self.x - other.x,
54             y: self.y - other.y
55         }
56     }
57 }
58
59 impl Neg for Vec2d {
60     type Output = Vec2d;
61
62     fn neg(self) -> Self {
63         Vec2d {
64             x: -self.x,
65             y: -self.y
66         }
67     }
68 }
69
70 impl Mul<f64> for Vec2d {
71     type Output = Vec2d;
72
73     fn mul(self, rhs: f64) -> Self {
74         Vec2d {
75             x: self.x * rhs,
76             y: self.y * rhs
77         }
78     }
79 }