From e523852cd48be561a3ecf812b98c95a1ae7682d3 Mon Sep 17 00:00:00 2001 From: Jon Janzen Date: Fri, 3 Sep 2021 19:42:49 -0600 Subject: [PATCH] added scaling --- features/src/transformations.rs | 45 ++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/features/src/transformations.rs b/features/src/transformations.rs index 4c069e2..01f9e57 100644 --- a/features/src/transformations.rs +++ b/features/src/transformations.rs @@ -5,9 +5,18 @@ use crate::structs::Tuple; impl Matrix { pub fn translation(x: f32, y: f32, z: f32) -> Self { Matrix::from_array([ - [1.0, 0.0, 0.0, x], - [0.0, 1.0, 0.0, y], - [0.0, 0.0, 1.0, z], + [1.0, 0.0, 0.0, x ], + [0.0, 1.0, 0.0, y ], + [0.0, 0.0, 1.0, z ], + [0.0, 0.0, 0.0, 1.0], + ]) + } + + pub fn scaling(x: f32, y: f32, z: f32) -> Self { + Matrix::from_array([ + [ x, 0.0, 0.0, 0.0], + [0.0, y, 0.0, 0.0], + [0.0, 0.0, z, 0.0], [0.0, 0.0, 0.0, 1.0], ]) } @@ -47,4 +56,34 @@ mod tests { assert_eq!(&transform * &v, v); } + + #[test] + fn scaling_matrix_applied_to_point() { + let transform = Matrix::scaling(2.0, 3.0, 4.0); + let p = Tuple::point(-4.0, 6.0, 8.0); + let expected = Tuple::point(-8.0, 18.0, 32.0); + assert_eq!(&transform * &p, expected); + } + + #[test] + fn scaling_matrix_apled_to_vector() { + let transform = Matrix::scaling(2.0, 3.0, 4.0); + let v = Tuple::vector(-4.0, 6.0, 8.0); + assert_eq!(&transform * &v, Tuple::vector(-8.0, 18.0, 32.0)); + } + + #[test] + fn multiplying_inverse_of_scaling_matrix() { + let transform = Matrix::scaling(2.0, 3.0, 4.0); + let inv = transform.inverse(); + let v = Tuple::vector(-4.0, 6.0, 8.0); + assert_eq!(&inv * &v, Tuple::vector(-2.0, 2.0, 2.0)); + } + + #[test] + fn reflection_is_scaling_by_a_negative_value() { + let transform = Matrix::scaling(-1.0, 1.0, 1.0); + let p = Tuple::point(2.0, 3.0, 4.0); + assert_eq!(&transform * &p, Tuple::point(-2.0, 3.0, 4.0)); + } }