Tarea 1

Traslación y rotación

Regresar a Teoría

Traslación y rotación

Se muestra como modificar y trasladar origenes en el espacio aplicando rotaciones en X,Y,Z y movimientos de traslación. Se plantean matrices homogéneas para unir rotaciones y traslaciones.

Descargar teoría PDF
...

Código 1

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def rotacion_y(angulo_grados):
    angulo_rad = np.radians(angulo_grados)
    R_y = np.array([
        [np.cos(angulo_rad), 0, np.sin(angulo_rad)],
        [0, 1, 0],
        [-np.sin(angulo_rad), 0, np.cos(angulo_rad)]
    ])
    return R_y

def rotacion_x(angulo_grados):
    angulo_rad = np.radians(angulo_grados)
    R_x = np.array([
        [1, 0, 0],
        [0, np.cos(angulo_rad), -np.sin(angulo_rad)],
        [0, np.sin(angulo_rad), np.cos(angulo_rad)]
    ])
    return R_x

# Ángulos de rotación
angulo_y = 45  # grados
angulo_x = 60  # grados

# Matrices de rotación individuales
R_y = rotacion_y(angulo_y)
R_x = rotacion_x(angulo_x)

# Matriz de rotación compuesta (primero R_y, luego R_x)
R_total = R_x @ R_y

# Imprimir resultados
print("Matriz de rotación alrededor de Y:")
print(R_y)
print("\nMatriz de rotación alrededor de X:")
print(R_x)
print("\nMatriz de rotación total (primero Y, luego X):")
print(R_total)

Código 2

import numpy as np
def rotacion_x(angulo_grados):
    """Genera una matriz de rotación alrededor del eje X."""
    angulo_rad = np.radians(angulo_grados)
    R_x = np.array([
        [1, 0, 0],
        [0, np.cos(angulo_rad), -np.sin(angulo_rad)],
        [0, np.sin(angulo_rad), np.cos(angulo_rad)]
    ])
    R_x = np.round(R_x, 4)
    return R_x

def matriz_transformacion_homogenea(R, t):
    """Construye la matriz de transformación homogénea dada una rotación y una traslación."""
    T = np.eye(4)  # Matriz identidad 4x4
    T[:3, :3] = R  # Inserta la matriz de rotación
    T[:3, 3] = t   # Inserta el vector de traslación
    #imprimir matriz de transformación homogénea a 2 decimales
    T = np.round(T, 4)
    return T

# Ángulo de rotación y vector de traslación
angulo_x = 30  # grados
traslacion = np.array([5, 10, 0])  # Vector de traslación

# Matriz de rotación alrededor de X
R_x = rotacion_x(angulo_x)

# Construcción de la matriz de transformación homogénea
T = matriz_transformacion_homogenea(R_x, traslacion)

# Imprimir resultados
print("Matriz de rotación alrededor de X:")
print(R_x)
print("\nMatriz de transformación homogénea:")
print(T)

Código 3

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def rotacion(ang_z, ang_y, ang_x, sx, sy, sz):
    # Definir la matriz de rotación en 3D
    alpha_z = np.radians(ang_z)
    beta_y = np.radians(ang_y)
    gamma_x = np.radians(ang_x)

    rot_z = np.array([
        [np.cos(alpha_z), -np.sin(alpha_z), 0, sx],
        [np.sin(alpha_z), np.cos(alpha_z), 0, sy],
        [0, 0, 1, sz],
        [0, 0, 0, 1]
    ])  # Matriz de rotación en Z
    #print(rot_z)

    rot_x = np.array([
        [1, 0, 0, 0],
        [0, np.cos(gamma_x), -np.sin(gamma_x), 0],
        [0, np.sin(gamma_x), np.cos(gamma_x), 0],
        [0, 0, 0, 1]
    ])  # Matriz de rotación en X
    #print(rot_x)

    rot_y = np.array([
        [np.cos(beta_y), 0, np.sin(beta_y), 0],
        [0, 1, 0, 0],
        [-np.sin(beta_y), 0, np.cos(beta_y), 0],
        [0, 0, 0, 1]
    ])  # Matriz de rotación en Y
    #print(rot_y)
    return rot_z @ rot_x @ rot_y

def traslacion(sx, sy, sz):
    tras_m = np.array([
        [1, 0, 0, sx],
        [0, 1, 0, sy],
        [0, 0, 1, sz],
        [0, 0, 0, 1]
    ])  # Matriz de traslación en 3D
    return tras_m

def crear_plot():
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    # Graficar las flechas de los ejes principales
    ax.quiver(0, 0, 0, 5, 0, 0, color='r', linewidth=1, arrow_length_ratio=0.1)  # Eje X
    ax.quiver(0, 0, 0, 0, 5, 0, color='g', linewidth=1, arrow_length_ratio=0.1)  # Eje Y
    ax.quiver(0, 0, 0, 0, 0, 5, color='b', linewidth=1, arrow_length_ratio=0.1)  # Eje Z

    # Etiquetas de los ejes
    ax.text(5.2, 0, 0, 'X', fontsize=12, color='black')
    ax.text(0, 5.2, 0, 'Y', fontsize=12, color='black')
    ax.text(0, 0, 5.2, 'Z', fontsize=12, color='black')

    # Configurar los límites de los ejes
    plot_limit_inf = 5
    plot_limit_sup = 5
    ax.set_xlim(-plot_limit_inf, plot_limit_sup)
    ax.set_ylim(-plot_limit_inf, plot_limit_sup)
    ax.set_zlim(-plot_limit_inf, plot_limit_sup)

    # Configurar los ejes
    ax.set_xlabel('Eje X')
    ax.set_ylabel('Eje Y')
    ax.set_zlabel('Eje Z')
    return fig, ax

def trasladar_y_rotar_ejes(tras_m, rot_m, eje_x, eje_y, eje_z):
    rot_eje_x = tras_m @ rot_m @ eje_x
    rot_eje_y = tras_m @ rot_m @ eje_y
    rot_eje_z = tras_m @ rot_m @ eje_z
    return rot_eje_x, rot_eje_y, rot_eje_z

# Crear la figura
fig, ax = crear_plot()

#---------------------------------------------------------------#

# Transformación A -> B
print('Transformación A -> B')

# Punto inicial AP en 3D
x1, y1, z1 = 0, 0, 0
P1_A = np.array([x1, y1, z1, 1])  # Punto inicial en coordenadas homogéneas

eje_x = np.array([1, 0, 0, 0])
eje_y = np.array([0, 1, 0, 0])
eje_z = np.array([0, 0, 1, 0])

# Definir el vector de traslación en 3D
sx, sy, sz = 3, 0, 0
tras_m = traslacion(sx, sy, sz)

# Definir los ángulos de rotación en grados
ang_z, ang_y, ang_x= 180, 0, 0
rot_m = rotacion(ang_z, ang_y, ang_x, sx, sy, sz)
P2_B = rot_m @ P1_A

# Imprimir resultados
print("Resultados de la transformación P2_B:")
print(f'Matriz homogenea: \n{np.round(rot_m, 2)}')
print(f"Punto inicial (x, y, z): ({P1_A[0]:.2f}, {P1_A[1]:.2f}, {P1_A[2]:.2f})")
print(f"Punto final (x, y, z): ({P2_B[0]:.2f}, {P2_B[1]:.2f}, {P2_B[2]:.2f})")


# Dibujar ejes en el punto inicial (trasladados, pero no rotados)
tras_eje_x = eje_x
tras_eje_y = eje_y
tras_eje_z = eje_z
ax.quiver(P1_A[0], P1_A[1], P1_A[2], tras_eje_x[0], tras_eje_x[1], tras_eje_x[2], color='r', linewidth=1, arrow_length_ratio=0.1)  # Eje X inicial trasladado
ax.quiver(P1_A[0], P1_A[1], P1_A[2], tras_eje_y[0], tras_eje_y[1], tras_eje_y[2], color='g', linewidth=1, arrow_length_ratio=0.1)  # Eje Y inicial trasladado
ax.quiver(P1_A[0], P1_A[1], P1_A[2], tras_eje_z[0], tras_eje_z[1], tras_eje_z[2], color='b', linewidth=1, arrow_length_ratio=0.1)  # Eje Z inicial trasladado

# Dibujar el punto
ax.scatter(P2_B[0], P2_B[1], P2_B[2], color='red', s=25, label='B')
ax.text(P2_B[0], P2_B[1], P2_B[2], 'B', color='red', fontsize=12)

# Dibujar ejes trasladados y rotados
rot_eje_x1, rot_eje_y1, rot_eje_z1 = trasladar_y_rotar_ejes(tras_m, rot_m, eje_x, eje_y, eje_z)
ax.quiver(P2_B[0], P2_B[1], P2_B[2], rot_eje_x1[0], rot_eje_x1[1], rot_eje_x1[2], color='r', linewidth=1, arrow_length_ratio=0.1)  # Eje X
ax.quiver(P2_B[0], P2_B[1], P2_B[2], rot_eje_y1[0], rot_eje_y1[1], rot_eje_y1[2], color='g', linewidth=1, arrow_length_ratio=0.1)  # Eje Y
ax.quiver(P2_B[0], P2_B[1], P2_B[2], rot_eje_z1[0], rot_eje_z1[1], rot_eje_z1[2], color='b', linewidth=1, arrow_length_ratio=0.1)  # Eje Z

#----------------------------------------------------------------#

# Transformación A -> C
print('\nTransformación A -> C')

# Punto inicial AC en 3D
x1, y1, z1 = 0, 0, 0
P1_A = np.array([x1, y1, z1, 1])  # Punto inicial en coordenadas homogéneas

# Definir el vector de traslación en 3D
sx, sy, sz = 3, 0, 2
tras_m = traslacion(sx, sy, sz)

# Definir los ángulos de rotación en grados
ang_z, ang_y, ang_x= 30, 90, 0
rot_m = rotacion(ang_z, ang_y, ang_x, sx, sy, sz)

P3_C = rot_m @ P1_A

# # Imprimir resultados
print("Resultados de la transformación P3_C:")
print(f'Matriz homogenea: \n{np.round(rot_m, 2)}')
print(f"Punto inicial (x, y, z): ({P1_A[0]:.2f}, {P1_A[1]:.2f}, {P1_A[2]:.2f})")
print(f"Punto final (x, y, z): ({P3_C[0]:.2f}, {P3_C[1]:.2f}, {P3_C[2]:.2f})")


# ----------------------------------------------------------------#

# Dibujar el punto inicial
ax.scatter(x1, y1, z1, color='green', s=25, label='A')
ax.text(x1, y1, z1, 'A', color='green', fontsize=12)

# Dibujar el punto
ax.scatter(P3_C[0], P3_C[1], P3_C[2], color='orange', s=25, label='C')
ax.text(P3_C[0], P3_C[1], P3_C[2], 'C', color='orange', fontsize=12)

# Dibujar ejes trasladados y rotados
rot_eje_x2, rot_eje_y2, rot_eje_z2 = trasladar_y_rotar_ejes(tras_m, rot_m, eje_x, eje_y, eje_z)
ax.quiver(P3_C[0], P3_C[1], P3_C[2], rot_eje_x2[0], rot_eje_x2[1], rot_eje_x2[2], color='r', linewidth=1, arrow_length_ratio=0.1)  # Eje X
ax.quiver(P3_C[0], P3_C[1], P3_C[2], rot_eje_y2[0], rot_eje_y2[1], rot_eje_y2[2], color='g', linewidth=1, arrow_length_ratio=0.1)  # Eje Y
ax.quiver(P3_C[0], P3_C[1], P3_C[2], rot_eje_z2[0], rot_eje_z2[1], rot_eje_z2[2], color='b', linewidth=1, arrow_length_ratio=0.1)  # Eje Z

# Mostrar la leyenda
plt.legend()
plt.show()

Referencias Bibliográficas