melius_vectors/
vector2.rs1use 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}