diff --git a/tuples/src/lib.rs b/tuples/src/lib.rs index 29985ea..74115ae 100644 --- a/tuples/src/lib.rs +++ b/tuples/src/lib.rs @@ -59,6 +59,33 @@ fn tuple_sub(lhs: PointVector, rhs: PointVector) -> PointVector { ) } +fn tuple_neg(lhs: PointVector) -> PointVector { + ( + -lhs.0, + -lhs.1, + -lhs.2, + -lhs.3 + ) +} + +fn tuple_mult(lhs: PointVector, scalar: f32) -> PointVector { + ( + lhs.0 * scalar, + lhs.1 * scalar, + lhs.2 * scalar, + lhs.3 * scalar, + ) +} + +fn tuple_div(lhs: PointVector, divisor: f32) -> PointVector { + ( + lhs.0 / divisor, + lhs.1 / divisor, + lhs.2 / divisor, + lhs.3 / divisor, + ) +} + #[cfg(test)] mod tests { use super::*; @@ -153,4 +180,45 @@ mod tests { let result = vector(-2.0, -4.0, -6.0); assert_eq!(true, tuple_equals(result, tuple_sub(a1, a2))); } + + #[test] + fn subtract_vector_from_zero_vector() { + let a1 = vector(0.0, 0.0, 0.0); + let a2 = vector(5.0, 6.0, 7.0); + + let result = vector(-5.0, -6.0, -7.0); + assert_eq!(true, tuple_equals(result, tuple_sub(a1, a2))); + } + + #[test] + fn negate_tuple() { + let a = (1.0, -2.0, 3.0, -4.0); + let result = (-1.0, 2.0, -3.0, 4.0); + + assert_eq!(result, tuple_neg(a)); + } + + #[test] + fn multiply_tuple_by_scalar() { + let a = (1.0, -2.0, 3.0, -4.0); + let result = (3.5, -7.0, 10.5, -14.0); + + assert_eq!(true, tuple_equals(result, tuple_mult(a, 3.5))); + } + + #[test] + fn multiply_tuple_by_fraction() { + let a = (1.0, -2.0, 3.0, -4.0); + let result = (0.5, -1.0, 1.5, -2.0); + + assert_eq!(true, tuple_equals(result, tuple_mult(a, 0.5))); + } + + #[test] + fn divide_tuple() { + let a = (1.0, -2.0, 3.0, -4.0); + let result = (0.5, -1.0, 1.5, -2.0); + + assert_eq!(true, tuple_equals(result, tuple_div(a, 2.0))); + } }