From 92c01da36016e94ff20163806ddcbcf7e33d4031 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sat, 10 Oct 2020 22:19:36 +0200 Subject: =?UTF-8?q?Switch=20back=20to=20custom=20geometry=20types,=20unifi?= =?UTF-8?q?ed=20with=20layout=20primitives=20=F0=9F=8F=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/geom/point.rs | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/geom/point.rs (limited to 'src/geom/point.rs') diff --git a/src/geom/point.rs b/src/geom/point.rs new file mode 100644 index 00000000..31b84d81 --- /dev/null +++ b/src/geom/point.rs @@ -0,0 +1,102 @@ +use super::*; + +/// A point in 2D. +#[derive(Default, Copy, Clone, PartialEq)] +pub struct Point { + /// The x coordinate. + pub x: Length, + /// The y coordinate. + pub y: Length, +} + +impl Point { + /// The origin point. + pub const ZERO: Self = Self { x: Length::ZERO, y: Length::ZERO }; + + /// Create a new point from x and y coordinate. + pub fn new(x: Length, y: Length) -> Self { + Self { x, y } + } +} + +impl Get for Point { + type Component = Length; + + fn get(self, axis: SpecAxis) -> Length { + match axis { + SpecAxis::Horizontal => self.x, + SpecAxis::Vertical => self.y, + } + } + + fn get_mut(&mut self, axis: SpecAxis) -> &mut Length { + match axis { + SpecAxis::Horizontal => &mut self.x, + SpecAxis::Vertical => &mut self.y, + } + } +} + +impl Switch for Point { + type Other = Gen; + + fn switch(self, dirs: Gen) -> Self::Other { + match dirs.main.axis() { + SpecAxis::Horizontal => Gen::new(self.x, self.y), + SpecAxis::Vertical => Gen::new(self.y, self.x), + } + } +} + +impl Debug for Point { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f, "({}, {})", self.x, self.y) + } +} + +impl Neg for Point { + type Output = Self; + + fn neg(self) -> Self { + Self { x: -self.x, y: -self.y } + } +} + +impl Add for Point { + type Output = Self; + + fn add(self, other: Self) -> Self { + Self { x: self.x + other.x, y: self.y + other.y } + } +} + +sub_impl!(Point - Point -> Point); + +impl Mul for Point { + type Output = Self; + + fn mul(self, other: f64) -> Self { + Self { x: self.x * other, y: self.y * other } + } +} + +impl Mul for f64 { + type Output = Point; + + fn mul(self, other: Point) -> Point { + other * self + } +} + +impl Div for Point { + type Output = Self; + + fn div(self, other: f64) -> Self { + Self { x: self.x / other, y: self.y / other } + } +} + +assign_impl!(Point += Point); +assign_impl!(Point -= Point); +assign_impl!(Point *= f64); +assign_impl!(Point /= f64); -- cgit v1.2.3