matriz.py también contendrá una clase llamada Transformador, que hará uso de objetos Matriz para llevar a cabo las transformaciones de traslación, rotación y escalamiento.
class Transformador:
El método trasladar tomará cuatro parámetros: px y py, la ubicación de un punto P en un plano bidimensional; y tx y ty, los valores de traslación en ambos ejes.
def trasladar(self, px, py, tx, ty):
p = Matriz(1, 3)
p.matriz = [[px, py, 1]]
t = Matriz(3, 3)
t.matriz = [
[1, 0, 0],
[0, 1, 0],
[tx, ty, 1]
]
p_prima = p * t
return [p_prima.matriz[0][0], p_prima.matriz[0][1]]
Se declara a P como un objeto matriz de 1x3, y la matriz de traslación T como una matriz de 3x3 predefinida con los valores de tx y ty. Después, simplemente se multiplican ambas matrices, y se devuelve una lista de dos elementos que representan los valores x y y del vector resultante.
Los métodos rotar y traslación siguen el mismo patrón.
def rotar(self, px, py, angulo, cx=0, cy=0):
p = Matriz(1, 3)
p.matriz = [[px, py, 1]]
c_negativa = Matriz(3, 3)
c_negativa.matriz = [
[1, 0, 0],
[0, 1, 0],
[-cx, -cy, 1]
]
grados = math.radians(angulo)
r = Matriz(3, 3)
r.matriz = [
[math.cos(grados), math.sin(grados), 0],
[-math.sin(grados), math.cos(grados), 0],
[0, 0, 1]
]
c_positiva = Matriz(3, 3)
c_positiva.matriz = [
[1, 0, 0],
[0, 1, 0],
[cx, cy, 1]
]
p_prima = p * c_negativa * r * c_positiva
return [p_prima.matriz[0][0], p_prima.matriz[0][1]]
def escalar(self, px, py, sx, sy, cx=0, cy=0):
p = Matriz(1, 3)
p.matriz = [[px, py, 1]]
c_negativa = Matriz(3, 3)
c_negativa.matriz = [
[1, 0, 0],
[0, 1, 0],
[-cx, -cy, 1]
]
s = Matriz(3, 3)
s.matriz = [
[sx, 0, 0],
[0, sy, 0],
[0, 0, 1]
]
c_positiva = Matriz(3, 3)
c_positiva.matriz = [
[1, 0, 0],
[0, 1, 0],
[cx, cy, 1]
]
p_prima = p * c_negativa * s * c_positiva
return [p_prima.matriz[0][0], p_prima.matriz[0][1]]
rotar necesita, además de las coordenadas del punto, un ángulo y las coordenadas de un punto C para tomar como centro de rotación. El ángulo necesita ser convertido a radianes para poder usarlo con las funciones de seno y coseno. Similarmente, escalar toma las coordenadas para P y C, junto con los valores sx y sy como los valores escalares en ambos ejes. Se declaran dos matrices adicionales para la transformación con respecto a C, que se multiplican con la matriz de transformación y P.
Con estas clases, ya se pueden llevar a cabo transformaciones y obtener sus resultados de manera automática. Se invita a que el lector realice diferentes pruebas.