1use core::ops;
2
3#[derive(Copy, Clone, Debug, Default, PartialOrd, Ord, PartialEq, Eq, Hash)]
18pub struct Point<N> {
19 pub x: N,
20 pub y: N,
21}
22
23#[derive(Copy, Clone, Debug, Default, PartialOrd, Ord, PartialEq, Eq, Hash)]
29pub struct Vector<N> {
30 pub x: N,
31 pub y: N,
32}
33
34#[inline]
36pub fn point<N>(x: N, y: N) -> Point<N> {
37 Point { x, y }
38}
39#[inline]
41pub fn vector<N>(x: N, y: N) -> Vector<N> {
42 Vector { x, y }
43}
44
45impl<N: ops::Sub<Output = N>> ops::Sub for Point<N> {
46 type Output = Vector<N>;
47 fn sub(self, rhs: Point<N>) -> Vector<N> {
48 vector(self.x - rhs.x, self.y - rhs.y)
49 }
50}
51
52impl<N: ops::Add<Output = N>> ops::Add for Vector<N> {
53 type Output = Vector<N>;
54 fn add(self, rhs: Vector<N>) -> Vector<N> {
55 vector(self.x + rhs.x, self.y + rhs.y)
56 }
57}
58
59impl<N: ops::Sub<Output = N>> ops::Sub for Vector<N> {
60 type Output = Vector<N>;
61 fn sub(self, rhs: Vector<N>) -> Vector<N> {
62 vector(self.x - rhs.x, self.y - rhs.y)
63 }
64}
65
66impl ops::Mul<f32> for Vector<f32> {
67 type Output = Vector<f32>;
68 fn mul(self, rhs: f32) -> Vector<f32> {
69 vector(self.x * rhs, self.y * rhs)
70 }
71}
72
73impl ops::Mul<Vector<f32>> for f32 {
74 type Output = Vector<f32>;
75 fn mul(self, rhs: Vector<f32>) -> Vector<f32> {
76 vector(self * rhs.x, self * rhs.y)
77 }
78}
79
80impl ops::Mul<f64> for Vector<f64> {
81 type Output = Vector<f64>;
82 fn mul(self, rhs: f64) -> Vector<f64> {
83 vector(self.x * rhs, self.y * rhs)
84 }
85}
86
87impl ops::Mul<Vector<f64>> for f64 {
88 type Output = Vector<f64>;
89 fn mul(self, rhs: Vector<f64>) -> Vector<f64> {
90 vector(self * rhs.x, self * rhs.y)
91 }
92}
93
94impl ops::Div<f32> for Vector<f32> {
95 type Output = Vector<f32>;
96 fn div(self, rhs: f32) -> Vector<f32> {
97 vector(self.x / rhs, self.y / rhs)
98 }
99}
100
101impl ops::Div<Vector<f32>> for f32 {
102 type Output = Vector<f32>;
103 fn div(self, rhs: Vector<f32>) -> Vector<f32> {
104 vector(self / rhs.x, self / rhs.y)
105 }
106}
107
108impl ops::Div<f64> for Vector<f64> {
109 type Output = Vector<f64>;
110 fn div(self, rhs: f64) -> Vector<f64> {
111 vector(self.x / rhs, self.y / rhs)
112 }
113}
114
115impl ops::Div<Vector<f64>> for f64 {
116 type Output = Vector<f64>;
117 fn div(self, rhs: Vector<f64>) -> Vector<f64> {
118 vector(self / rhs.x, self / rhs.y)
119 }
120}
121
122impl<N: ops::Add<Output = N>> ops::Add<Vector<N>> for Point<N> {
123 type Output = Point<N>;
124 fn add(self, rhs: Vector<N>) -> Point<N> {
125 point(self.x + rhs.x, self.y + rhs.y)
126 }
127}
128
129impl<N: ops::Sub<Output = N>> ops::Sub<Vector<N>> for Point<N> {
130 type Output = Point<N>;
131 fn sub(self, rhs: Vector<N>) -> Point<N> {
132 point(self.x - rhs.x, self.y - rhs.y)
133 }
134}
135
136impl<N: ops::Add<Output = N>> ops::Add<Point<N>> for Vector<N> {
137 type Output = Point<N>;
138 fn add(self, rhs: Point<N>) -> Point<N> {
139 point(self.x + rhs.x, self.y + rhs.y)
140 }
141}
142
143#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)]
146pub struct Rect<N> {
147 pub min: Point<N>,
148 pub max: Point<N>,
149}
150
151impl<N: ops::Sub<Output = N> + Copy> Rect<N> {
152 pub fn width(&self) -> N {
153 self.max.x - self.min.x
154 }
155 pub fn height(&self) -> N {
156 self.max.y - self.min.y
157 }
158}