







Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
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
1 / 13
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
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.
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.