Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

TECNM - Representación y Manipulación Tridimensional de una Figura en Python, Exámenes de Computación Gráfica y Animación

Práctica de laboratorio donde se realiza un proyecto en Python utilizando la librería Pillow para el procesamiento de imágenes, y trazar figuras geométricas con pixeles en un canva permitiendo su rotación en los ejes x, y, z.

Tipo: Exámenes

2022/2023

A la venta desde 16/06/2024

mayra-mendez-17
mayra-mendez-17 🇲🇽

26 documentos

1 / 13

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
TECNOLÓGICO NACIONAL DE MÉXICO
Instituto Tecnológico de Ensenada
Graficación
Nombres:
Mayra Dayana Méndez Robles.
Ilse Paloma Machado Gonzalez.
Profesor: Eddie Helbert Clemente Torres.
Tema: Examen no.02
Fecha: 02 de noviembre del 2023
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Vista previa parcial del texto

¡Descarga TECNM - Representación y Manipulación Tridimensional de una Figura en Python y más Exámenes en PDF de Computación Gráfica y Animación solo en Docsity!

TECNOLÓGICO NACIONAL DE MÉXICO

Instituto Tecnológico de Ensenada

Graficación

Nombres:

 Mayra Dayana Méndez Robles.

 Ilse Paloma Machado Gonzalez.

Profesor: Eddie Helbert Clemente Torres.

Tema: Examen no.

Fecha: 02 de noviembre del 2023

Introducción

En el siguiente reporte se detallará un proyecto de programación en Python que tuvo como objetivo crear la representación tridimensional de una figura geométrica dentro de un canvas y permitir la interacción del usuario para rotar esta figura en los ejes X, Y y Z. El proyecto se basó en el uso de bibliotecas de Python altamente utilizadas en el campo de la programación 3D y la visualización, como lo es tkinter, pillow y math; pero además se utilizaron funciones de nuestra propia librería llamada graflib. A lo largo de este reporte, se presentarán los pasos clave, el código fuente relevante y los resultados obtenidos, con el propósito de ofrecer una comprensión completa de cómo se logró este objetivo planteado.

Desarrollo

Para comenzar, necesitamos entender cómo crear una figura geométrica tridimensional para después plasmarla en un canvas; en este caso crearemos un cubo. Como primer paso, necesitamos importar las librerías que necesitaremos para dibujar nuestra figura, las cuales son las siguientes: Figura 1. Importación de librerías. Importaremos PIL para crear y mostrar la imagen del cubo, numpy para realizar operaciones matriciales, math para funciones matemáticas y graflib que sirve como nuestra librería personal. El siguiente paso es definir la clase Cubo en donde se inicializan los vértices y triángulos, al igual que los colores que estos tendrán.

Seguido de esto, se definirán varios métodos estáticos que realizarán las transformaciones en los vértices del cubo. El primer método que encontramos es scaleP3D. Figura 4. Método estático _scaleP3D. El propósito del método de la Figura 4 es aplicar una transformación de escala a un punto 3D. Este método toma dos argumentos que son:  P: Un punto 3D representado como un arreglo de coordenadas (x, y, z).  Fs: Factor de escala que se aplicará al punto en las tres dimensiones. Después se creó una matriz con numpy que representará el punto 3D; y se agregará un cuarto elemento con valor de 1 para asegurar que las operaciones de escala se realicen correctamente. Al igual que se creará una matriz de escala que servirá para escalar el punto ‘ p ’ en las tres dimensiones (x, y, z) de acuerdo al factor de escala proporcionado; y por último retornará una multiplicación matricial entre la matriz escala y el punto ‘ p ’ transpuesto. Figura 5. Método estático _rotateP3Dz.

El siguiente método estático que se utilizó fue _rotateP3Dz el cual es muy parecido al método anterior, con la diferencia de que este método realizará una rotación tridimensional alrededor del eje z. Los dos argumentos que toma son:  P: Un punto 3D representado como un arreglo de coordenadas (x, y, z).  Alpha: Ángulo de rotación en radianes que se aplicará alrededor del eje z. En este método se crea una matriz de rotación que realiza una rotación alrededor del eje z por un ángulo alpha utilizando las funciones trigonométricas cos y sin. Y retorna, de igual manera, una multiplicación matricial entre la matriz rotación y el punto ‘ p ’. Cabe mencionar que se realizará el mismo proceso para la rotación en el eje x, al igual que en el eje y. Figura 6. Método estático _rotateP3Dx. Figura 7. Método estático _rotateP3Dy.

El primer método toma un argumento position , que representa un punto de traslación en tres dimensiones (x, y, z). El propósito de este método es aplicar una traslación a todos los vértices del cubo desplazándolos según el punto de traslación especificado. Los vértices del cubo se actualizan en consecuencia utilizando el método ‘ _translateP3D’ , que ya se explicó previamente. El segundo método toma un argumento ax , que representa un ángulo de rotación en radianes alrededor del eje X. Si el ángulo ax no es igual a cero, se aplica una rotación alrededor del eje X a todos los vértices del cubo. Para cada vértice, se utiliza el método _‘rotateP3Dx’ para realizar la rotación alrededor del eje X. La condición if ax != 0 garantiza que la rotación solo se aplicará si el ángulo es diferente de cero. Así mismo será el tercer y cuarto método que tienen como propósito rotar alrededor del eje z y el eje y. Por último, el quinto método toma un argumento fs , que representa el factor de escala a aplicar a los vértices del cubo. Se utiliza el método _ scaleP3D’ para aplicar una transformación de escala a todos los vértices del cubo. El factor de escala fs determina cuánto se ampliarán o reducirán los vértices en las tres dimensiones. Figura 10. Creación de la figura para posteriormente mostrarla. Para concluir con el código, se define el tamaño y color de nuestro canvas. Además, se creará un objeto “cubo1” de la clase Cubo como se muestra en la Figura 10 y a este se le realiza una translación; después se hará uso de un método de nuestra librería personal es cual contiene lo siguiente: Figura 11. Método renderObject de la librería graflib.

Por último, se imprimen los valores de nuestros vértices y se muestra nuestro lienzo. El resultado que obtenemos es el siguiente: Figura 12. Resultado del objeto tridimensional. Ahora que conocemos el proceso para poder dibujar una figura tridimensional, debemos llevar dichos conocimientos a un entorno gráfico donde el usuario pueda manipular los tipos de rotación y traslación que quiera darle a la figura. Para esto haremos uso de la librería tkinter. Figura 13. Clase RootApp El primer paso para crear nuestro entorno gráfico es crear una clase llamada RootApp que hereda de tk.Tk. Dentro de esta clase se inicializará la aplicación y se llamará al método ‘ switch_frame’ para cambiar al marco de inicio (StartPage).

Figura 16. Método draw_cube que sirve para realizar modificaciones a la figura. En pocas palabras, el método ‘ draw_cube’ borra el lienzo y dibuja una nueva representación del cubo con las rotaciones aplicadas sin deformar el objeto original. Figura 17. Método draw_object Para concluir, el método ‘ draw_object’ tiene como propósito dibujar nuestra figura tridimensional tomando como argumentos nuestros arreglos de vértices y triángulos que habíamos definido anteriormente. Se itera a través de los triángulos, calculando así las coordenadas de los vértices en el lienzo y así coloreando los triángulos de acuerdo a los colores que definimos. Figura 18. Invocación de la aplicación RootApp.

Por último, se llama a la aplicación que acabamos de crear como se muestra en la Figura 18 y como resultado obtenemos las siguientes pantallas mostrando las diferentes combinaciones que se pueden obtener: Figura 19. Primera pantalla sin ninguna modificación. Figura 20. Segunda pantalla con una rotación en el eje x.

la biblioteca PIL para trabajar con imágenes, tkinter y nuestra librería que hemos ido enriqueciendo a lo largo de las prácticas. Por último, nuestra aplicación permitió que los usuarios pudieran experimentar con conceptos de gráficos 3D y transformaciones geométricas, lo que puede ser útil para fines educativos y de visualización. Además, muestra cómo una clase de cubo 3D puede ser utilizada para aplicar transformaciones de rotación a un objeto 3D en una aplicación de GUI.