melius_vectors/
vector2.rs

1use std::{fmt::Display, ops::{Add, AddAssign, Sub, SubAssign, Mul, MulAssign, Div, DivAssign}};
2use crate::vector3::Vector3;
3
4#[derive(Copy, Clone, Debug)]
5pub struct Vector2<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> {
6    pub x: T,
7    pub y: T,
8}
9
10impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Vector2<T> {
11    pub fn new(x: T, y: T) -> Self {
12        Self {
13            x,
14            y,
15        }
16    }
17
18    pub fn empty() -> Self {
19        Self {
20            x: Default::default(),
21            y: Default::default(),
22        }
23    }
24
25    pub fn from_vector3(vec3: Vector3<T>) -> Vector2<T> {
26        Vector2::new(vec3.x, vec3.y)
27    }
28
29    pub fn from_vector4(vec4: Vector3<T>) -> Vector2<T> {
30        Vector2::new(vec4.x, vec4.y)
31    }
32}
33
34impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Add for Vector2<T> {
35    type Output = Self;
36
37    fn add(self, rhs: Self) -> Self::Output {
38        Self {
39            x: self.x + rhs.x,
40            y: self.y + rhs.y,
41        }
42    }
43}
44
45impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> AddAssign for Vector2<T> {
46    fn add_assign(&mut self, rhs: Self) {
47        self.x += rhs.x;
48        self.y += rhs.y;
49    }
50}
51
52impl <T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Sub for Vector2<T> {
53    type Output = Self;
54
55    fn sub(self, rhs: Self) -> Self::Output {
56        Self {
57            x: self.x - rhs.x,
58            y: self.y - rhs.y,
59        }
60    }
61}
62
63impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> SubAssign for Vector2<T> {
64    fn sub_assign(&mut self, rhs: Self) {
65        self.x -= rhs.x;
66        self.y -= rhs.y;
67    }
68}
69
70impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Mul for Vector2<T> {
71    type Output = Self;
72
73    fn mul(self, rhs: Self) -> Self::Output {
74        Self {
75            x: self.x * rhs.x,
76            y: self.y * rhs.y
77        }
78    }
79}
80
81impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> MulAssign for Vector2<T> {
82    fn mul_assign(&mut self, rhs: Self) {
83        self.x *= rhs.x;
84        self.y *= rhs.y;
85    }
86}
87
88impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Div for Vector2<T> {
89    type Output = Self;
90
91    fn div(self, rhs: Self) -> Self::Output {
92        Self {
93            x: self.x / rhs.x,
94            y: self.y / rhs.y,
95        }
96    }
97}
98
99impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> DivAssign for Vector2<T> {
100    fn div_assign(&mut self, rhs: Self) {
101        self.x /= rhs.x;
102        self.y /= rhs.y;
103    }
104}
105
106impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Display for Vector2<T> {
107    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
108        write!(f, "{{{}, {}}}", self.x, self.y)
109    }
110}