Dado un sistema con
-
Genera una figura en 3 dimensiones y realiza una animación de una familia paramétrica continua que reproduzca desde la identidad hasta la transformación simultánea de una rotación de
$\theta = 3\pi$ y una translación con$v = (0, 0, d)$ , donde$d$ es el diámetro mayor de$S$ . -
Dado el sistema representado por la imagen digital arbol.png, considera el subsistema
$\sigma$ dado por el segund color (verde) cuando verde$< 240$ . ¿Dónde se sitúa el centroide? Realiza la misma transformación que en el apartado anterior, con$\theta = 3\pi$ y$v = (d, d, 0)$ , donde$d$ es el diámetro mayor de$\sigma$ .
La transformación isométrica afín es una operación matemática utilizada en geometría para transformar figuras geométricas en el plano. Es una transformación rígida que mantiene las distancias entre los puntos y las proporciones de las figuras, por lo que es útil para conservar la simetría y la estructura de las formas. Las transformaciones isométricas afines incluyen rotaciones, traslaciones, reflexiones y combinaciones de estas operaciones. Son herramientas importantes en la geometría, ya que permiten transformar figuras geométricas de manera precisa y eficiente.
- Lenguaje de programación: python.
- Material externo: arbol.png, imagen necesaria para la realización de la segunda parte.
- Librerías:
- matplotlib: para las gráficas.
- skimage: para cargar la imagen mencionada anteriormente en python como matriz de pixeles.
Para las traslaciones únicamente es necesario sumar a las componentes
El enunciado nos pide que sea una rotación respecto al centroide de la figura. Para ello, sean
- Definimos el centroide.
$c = (xc, yc, zc)$ donde
- Trasladamos los puntos al centro (0,0).
$X' = \lbrace x-xc \ |\ x\in X\rbrace$ ,$Y' = \lbrace y-yc \ |\ y\in Y\rbrace$ ,$Z' = \lbrace z-zc \ |\ z\in Z\rbrace$ . - Los rotamos.
- Los devolvemos a su posición original.
$Q = \lbrace w+c \ | w\in W\rbrace$
Para generar una figura 3d aleatoria, utilizamos la función axes3d.get_test_data() predefinada de python. Para las rotaciones y traslaciones, hemos definido las funciones Rotacion y Traslación respectivamente.
def Rotacion(X0, Y0, Z0, theta):
xc, yc = X0.mean(), Y0.mean()
X = np.dot(np.cos(theta), X0-xc) + np.dot(-np.sin(theta), Y0-yc) + xc
Y = np.dot(np.sin(theta), X0-xc) + np.dot(np.cos(theta), Y0-yc) + yc
Z = Z0
return X, Y, Z
def Traslacion(X0, Y0, Z0, t, a=0, b=0, c=0):
X, Y, Z = a*t+X0, b*t + Y0, c*t+Z0
return X, Y, Z
Una vez definidas y con los datos cargados podemos crear la animación. Además, para apreciar la subida de nivel en el eje
También podemos hacer rotaciones que no sean respecto al centroide, si no al punto (0,0) como por ejemplo la siguiente.
La imagen es de
Se puede observar que nuevamente he añadido el centroide en un plano más abajo de la imagen del árbol para poder seguir el movimiento de una forma más clara. Además también observar como la calidad de la imagen en el gráfico 3d (en la imagen 2d del centroide está completa) se mantiene la calidad bastante bien. Por lo que no perdemos resolución y ayudamos al procesamiento de la animación. Además al igual que en el apartado anterior cambiando la función rotación podemos obtener distintos resultados como el siguiente.
Por último, también nos piden observar el centroide del árbol, el cual se puede apreciar en la siguiente imagen.