diff --git a/linear_algebra/src/transformations_2d.py b/linear_algebra/src/transformations_2d.py new file mode 100644 index 000000000..9ee238fd7 --- /dev/null +++ b/linear_algebra/src/transformations_2d.py @@ -0,0 +1,62 @@ +""" +2D Transformations are regularly used in Linear Algebra. + +I have added the codes for reflection, projection, scaling and rotation 2D matrices. + + scaling(5) = [[5.0, 0.0], [0.0, 5.0]] + rotation(45) = [[0.5253219888177297, -0.8509035245341184], + [0.8509035245341184, 0.5253219888177297]] +projection(45) = [[0.27596319193541496, 0.446998331800279], + [0.446998331800279, 0.7240368080645851]] +reflection(45) = [[0.05064397763545947, 0.893996663600558], + [0.893996663600558, 0.7018070490682369]] +""" +from math import cos, sin +from typing import List + + +def scaling(scaling_factor: float) -> List[List[float]]: + """ + >>> scaling(5) + [[5.0, 0.0], [0.0, 5.0]] + """ + scaling_factor = float(scaling_factor) + return [[scaling_factor * int(x == y) for x in range(2)] for y in range(2)] + + +def rotation(angle: float) -> List[List[float]]: + """ + >>> rotation(45) # doctest: +NORMALIZE_WHITESPACE + [[0.5253219888177297, -0.8509035245341184], + [0.8509035245341184, 0.5253219888177297]] + """ + c, s = cos(angle), sin(angle) + return [[c, -s], [s, c]] + + +def projection(angle: float) -> List[List[float]]: + """ + >>> projection(45) # doctest: +NORMALIZE_WHITESPACE + [[0.27596319193541496, 0.446998331800279], + [0.446998331800279, 0.7240368080645851]] + """ + c, s = cos(angle), sin(angle) + cs = c * s + return [[c * c, cs], [cs, s * s]] + + +def reflection(angle: float) -> List[List[float]]: + """ + >>> reflection(45) # doctest: +NORMALIZE_WHITESPACE + [[0.05064397763545947, 0.893996663600558], + [0.893996663600558, 0.7018070490682369]] + """ + c, s = cos(angle), sin(angle) + cs = c * s + return [[2 * c - 1, 2 * cs], [2 * cs, 2 * s - 1]] + + +print(f" {scaling(5) = }") +print(f" {rotation(45) = }") +print(f"{projection(45) = }") +print(f"{reflection(45) = }")