| 1 | //! Geometry module. |
| 2 | |
| 3 | mod angle; |
| 4 | mod real; |
| 5 | |
| 6 | pub(crate) use angle::angle_consts; |
| 7 | pub(crate) use angle::Trigonometry; |
| 8 | pub use angle::{Angle, AngleUnit}; |
| 9 | pub use embedded_graphics_core::geometry::{ |
| 10 | AnchorPoint, AnchorX, AnchorY, Dimensions, OriginDimensions, Point, Size, |
| 11 | }; |
| 12 | pub(crate) use real::Real; |
| 13 | |
| 14 | pub(crate) trait PointExt { |
| 15 | /// Returns a point that is rotated by 90° relative to the origin. |
| 16 | fn rotate_90(self) -> Self; |
| 17 | |
| 18 | /// Calculates the dot product of two points. |
| 19 | fn dot_product(self, other: Point) -> i32; |
| 20 | |
| 21 | /// Calculates the determinant of a 2x2 matrix formed by this and another point. |
| 22 | /// |
| 23 | /// ```text |
| 24 | /// | self.x self.y | |
| 25 | /// result = | | |
| 26 | /// | other.x other.y | |
| 27 | /// ``` |
| 28 | fn determinant(self, other: Point) -> i32; |
| 29 | |
| 30 | /// Returns the squared length. |
| 31 | /// |
| 32 | /// The returned value is the square of the length of a vector from `(0, 0)` |
| 33 | /// to `(self.x, self.y)`. |
| 34 | fn length_squared(self) -> i32; |
| 35 | } |
| 36 | |
| 37 | impl PointExt for Point { |
| 38 | fn rotate_90(self) -> Self { |
| 39 | Self::new(-self.y, self.x) |
| 40 | } |
| 41 | |
| 42 | fn dot_product(self, other: Point) -> i32 { |
| 43 | self.x * other.x + self.y * other.y |
| 44 | } |
| 45 | |
| 46 | fn determinant(self, other: Point) -> i32 { |
| 47 | self.x * other.y - self.y * other.x |
| 48 | } |
| 49 | |
| 50 | fn length_squared(self) -> i32 { |
| 51 | self.x.pow(exp:2) + self.y.pow(exp:2) |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | #[cfg (test)] |
| 56 | mod tests { |
| 57 | use super::*; |
| 58 | |
| 59 | #[test ] |
| 60 | fn check_length_squared() { |
| 61 | let p = Point::new(3, 4); |
| 62 | |
| 63 | assert_eq!(p.length_squared(), 25); |
| 64 | } |
| 65 | |
| 66 | #[test ] |
| 67 | fn rotate_90() { |
| 68 | assert_eq!(Point::new(1, 0).rotate_90(), Point::new(0, 1)); |
| 69 | assert_eq!(Point::new(0, -2).rotate_90(), Point::new(2, 0)); |
| 70 | assert_eq!(Point::new(-3, 0).rotate_90(), Point::new(0, -3)); |
| 71 | assert_eq!(Point::new(0, 4).rotate_90(), Point::new(-4, 0)); |
| 72 | } |
| 73 | } |
| 74 | |