From 6e2242f58793b9229359f51a58fc4c7373667d0a Mon Sep 17 00:00:00 2001 From: Tom Russell Date: Fri, 13 Sep 2024 12:46:42 +0100 Subject: [PATCH] Add Segment for point-to-point straight line --- extension-rust/src/geometry.rs | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/extension-rust/src/geometry.rs b/extension-rust/src/geometry.rs index 6b12874..953f203 100644 --- a/extension-rust/src/geometry.rs +++ b/extension-rust/src/geometry.rs @@ -65,9 +65,27 @@ impl Div for Point { } } +pub struct Segment { + start: Point, + end: Point, +} + +impl Segment { + fn length(self) -> f64 { + let dx = self.end.x - self.start.x; + let dy = self.end.y - self.start.y; + (dx * dx + dy * dy).sqrt() + } +} + mod tests { use super::*; + #[test] + fn origin() { + assert_eq!(Point { x: 0.0, y: 0.0 }, Point::origin()); + } + #[test] fn magnitude() { assert_eq!(5.0, Point { y: 3.0, x: 4.0 }.magnitude()); @@ -100,4 +118,31 @@ mod tests { assert_eq!(Point { x: 7.0, y: 2.0 } / 2.0, Point { x: 3.5, y: 1.0 }); } + #[test] + fn segment_length() { + assert_eq!( + 0.0, + Segment { + start: Point::origin(), + end: Point::origin() + } + .length() + ); + assert_eq!( + 5.0, + Segment { + start: Point::origin(), + end: Point { x: 3.0, y: 4.0 } + } + .length() + ); + assert_eq!( + 13.0, + Segment { + start: Point { x: 17.0, y: 4.0 }, + end: Point { x: 22.0, y: 16.0 } + } + .length() + ); + } }