diff --git a/pong/src/geom.rs b/pong/src/geom.rs index bca4009..5b29678 100644 --- a/pong/src/geom.rs +++ b/pong/src/geom.rs @@ -11,7 +11,9 @@ pub mod geom { } pub fn unit() -> Vector { - Vector { x: 1., y: 1. } + let mut vector = Vector { x: 1., y: 1. }; + vector.normalize(); + vector } pub fn new(x: f64, y: f64) -> Vector { @@ -26,6 +28,18 @@ pub mod geom { self.y /= length; } + pub fn perpendicular_clockwise(&self) -> Vector { + let mut vector = Vector::new(self.y, -self.x); + vector.normalize(); + vector + } + + pub fn perpendicular_counter_clockwise(&self) -> Vector { + let mut vector = Vector::new(-self.y, self.x); + vector.normalize(); + vector + } + pub fn add(&mut self, other: &Vector) { self.x += other.x; self.y += other.y; diff --git a/pong/tests/vector_tests.rs b/pong/tests/vector_tests.rs index 9ce1753..fb8944a 100644 --- a/pong/tests/vector_tests.rs +++ b/pong/tests/vector_tests.rs @@ -41,3 +41,27 @@ pub fn should_calculate_angle_correctly( let res = vector_a.angle(&vector_b); assert_eq!(res, expected_angle); } + +#[rstest] +#[case(Vector::new(1., 0.), Vector::new(0., -1.))] +#[case(Vector::new(0., 1.), Vector::new(1., 0.))] +#[case(Vector::new(7., 7.), Vector::new(0.7071067811865476, -0.7071067811865476))] +pub fn should_get_perpendicular_clockwise( + #[case] vector: Vector, + #[case] expected: Vector +) { + let res = vector.perpendicular_clockwise(); + assert_eq!(res, expected); +} + +#[rstest] +#[case(Vector::new(0., -1.), Vector::new(1., 0.))] +#[case(Vector::new(1., 0.), Vector::new(0., 1.))] +#[case(Vector::new(7., 7.), Vector::new(-0.7071067811865476, 0.7071067811865476))] +pub fn should_get_perpendicular_counter_clockwise( + #[case] vector: Vector, + #[case] expected: Vector +) { + let res = vector.perpendicular_counter_clockwise(); + assert_eq!(res, expected); +}