import numpy as np
import math as m
def despliega(c,m):
    rens=(m.shape)[0]
    cols=(m.shape)[1]
    print ("** "+c+" **")
    for i in range(0,rens):
        for j in range(0,cols):
            print(f"{m[i,j]:8.4f}",end="")
        print("")   
    print("--------------------------------")

def rotacionX(ang):
    ang=np.radians(ang)    
    return np.matrix([
    [1, 0, 0, 0],
    [0,  m.cos(ang), m.sin(ang),0],
    [0, -m.sin(ang), m.cos(ang),0],
    [0,0,0,1]
    ])

def rotacionY(ang):
    ang=np.radians(ang)    
    return np.matrix([
    [m.cos(ang), 0, -m.sin(ang),0],
    [0, 1, 0, 0],
    [m.sin(ang), 0, m.cos(ang),0],
    [0,0,0,1]
    ])

def rotacionZ(ang):
    ang=np.radians(ang)    
    return np.matrix([
    [m.cos(ang),m.sin(ang),0,0],
    [-m.sin(ang),m.cos(ang),0,0],
    [0,0,1,0],
    [0,0,0,1]
    ])  
    
def escalacion(sx,sy,sz):
    return np.matrix([
    [sx,0,0,0],
    [0,sy,0,0],
    [0,0,sz,0],
    [0,0,0,1]
    ]) 
    
def traslacion(tx,ty,tz):
    return np.matrix([
    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [tx,ty,tz,1]
    ]) 
    
def reflexionXY():
    return np.matrix([
    [1,0,0,0],
    [0,1,0,0],
    [0,0,-1,0],
    [0,0,0,1]
    ]) 
    
def reflexionXZ():
    return np.matrix([
    [1,0,0,0],
    [0,-1,0,0],
    [0,0,1,0],
    [0,0,0,1]
    ]) 

def reflexionYZ():
    return np.matrix([
    [-1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,1]
    ])

def identidad():
    return np.matrix([
    [1,0,0,0],
    [0,1,0,0],
    [0,0,1,0],
    [0,0,0,1]
    ])

def inversa(m):
    return np.linalg.inv(m)
    
def vector(x,y,z):
    return np.matrix([x,y,z,1])
 
## Escribir cÃ³digo a partir de aquÃ­
Mt=traslacion(-1,0,-1)
Me=escalacion(2/3,2,1)
Mr=rotacionY(90)
Mt2=traslacion(5,-6,0)
Mab=Mt*Me*Mr*Mt2
despliega("Matriz AB: ",Mab)
despliega("Matriz BA: ",inversa(Mab))

Mt=traslacion(-5,2,0)
Me=escalacion(1,0.5,1.5)
Mr=rotacionY(-90)
Mt2=traslacion(1,2,1)
Mba2=Mt*Me*Mr*Mt2
despliega("Matriz Mba",Mba2)
despliega("Matriz I:",Mab*Mba2)

