Departament d’Enginyeria Informàtica i M atemàtiques Reconstrucción de objetos a partir de una malla de puntos Titulación: Ingeniería Técnica Informática de Gestión Autor: Joan Planas, Lluís Papió Directora: Maria Ferré, Bergadà Fecha: 06/10 Índice 1. Introducción ................................................................................................................... 4 2. Objetivos ........................................................................................................................ 6 3. 4. 2.1 Objetivo Principal ............................................................................................................... 6 2.2 Objetivos Secundarios ........................................................................................................ 6 Especificaciones ............................................................................................................. 7 3.1 Obtención de los Puntos .................................................................................................... 7 3.2 Organización y Estructuración de los Puntos ..................................................................... 7 3.3 Triangulación ...................................................................................................................... 7 3.4 Visor en Tres Dimensiones ................................................................................................. 7 3.5 Guardado del Modelo ........................................................................................................ 7 3.6 Casos de Uso ...................................................................................................................... 8 Diseño........................................................................................................................... 13 4.1 Elección del Lenguaje ...................................................................................................... 13 4.1.1 Portabilidad .............................................................................................................. 13 4.1.2 Facilidad.................................................................................................................... 13 4.1.3 Experiencia ............................................................................................................... 13 4.1.4 Librerías .................................................................................................................... 13 4.2 Librería Grafica ................................................................................................................. 14 4.2.1 Escenario Grafico...................................................................................................... 14 4.2.2 Clases de Alto Nivel Java3D ...................................................................................... 16 4.2.3 Estructura Básica ...................................................................................................... 17 4.3 Elección de Algoritmos ..................................................................................................... 18 4.3.1 Ganapathy ................................................................................................................ 18 4.3.2 Delaunay................................................................................................................... 25 4.4 Procesos Auxiliares ........................................................................................................... 27 4.4.1 Ordenación de los Puntos por Contornos ................................................................ 27 4.4.2 Calculo Normales...................................................................................................... 27 4.4.3 Caras Interiores ........................................................................................................ 28 4.5 Estructura Ficheros........................................................................................................... 29 4.6 Estructuras de Datos ........................................................................................................ 30 4.6.1 Punto ........................................................................................................................ 30 4.6.2 Contorno .................................................................................................................. 31 4.6.3 Triangulo................................................................................................................... 32 2 5. 6. 4.6.4 Nodo ......................................................................................................................... 33 4.6.5 Polígono.................................................................................................................... 36 4.6.6 Ordena ...................................................................................................................... 38 4.6.7 LeerFichero ............................................................................................................... 38 4.6.8 MenúPrincipal .......................................................................................................... 39 Desarrollo ..................................................................................................................... 40 5.1 Primeros Pasos ................................................................................................................. 40 5.2 Pruebas Iniciales ............................................................................................................... 40 5.3 Carga Ficheros .................................................................................................................. 40 5.4 Visualización de Contornos .............................................................................................. 41 5.5 Triangulación Contornos .................................................................................................. 41 5.6 Visualización de Triángulos .............................................................................................. 42 5.7 Triangulación Puntos ........................................................................................................ 42 5.8 Obtención de las Caras Externas ...................................................................................... 42 5.9 Creación de la GUI ............................................................................................................ 43 5.10 Guardado Datos ............................................................................................................... 43 5.11 Carga de Datos ................................................................................................................. 43 Evaluación .................................................................................................................... 44 6.1 Phantom ........................................................................................................................... 44 6.2 Ruinas ............................................................................................................................... 46 6.3 Forma 1 ............................................................................................................................ 48 6.4 Forma 2 ............................................................................................................................ 50 6.5 Forma 3 ............................................................................................................................ 52 6.6 Forma 4 ............................................................................................................................ 53 6.7 Análisis de Resultados ...................................................................................................... 55 7. Conclusiones ................................................................................................................ 58 8. Recursos Utilizados ...................................................................................................... 59 9. Manual .......................................................................................................................... 60 9.1 Manual del Usuario .......................................................................................................... 60 9.2 Manual del Administrador ............................................................................................... 64 9.2.1 Recursos Necesarios ................................................................................................. 64 9.2.2 Instalación ................................................................................................................ 65 9.2.1 Manipulación de Ficheros ........................................................................................ 69 10. Agradecimientos........................................................................................................... 70 3 1. Introducción En el mundo real existen muchos problemas para resolver computacionalmente, algunos más complicados y otros no tanto. En este trabajo se trata el problema de la reconstrucción de edificios a partir de datos en forma de puntos, que son proporcionados por un escáner. Para poner un punto de partida nos imaginamos una cantidad de puntos en el espacio, luego con dichos puntos detectamos sus caras exteriores y después obtenemos un triangulo para cada una de las caras exteriores detectadas. Esto es el principio de cualquier reconstrucción en tres dimensiones, no solo de edificios sino de cualquier objeto de cual se tenga su especificación formada por puntos en el espacio tridimensional. Este es un campo bastante complicado ya que la mayoría de soluciones ofrecidas no están completas, es decir que casi nunca satisfacen por completo los requerimientos deseados. Esto ocurre porque la cantidad de información que se tiene que tratar es bastante abundante, con lo cual se necesitan maquinas muy potentes para poder hacer una buena reconstrucción, cuando hablamos de buena nos referimos a que contenga todos los detalles necesarios y que además se pueda utilizar con cualquier tipo de librearía 3D. También existen motivos más técnicos como pueden ser que la cantidad de triángulos no sea la adecuada como para obtener la calidad de imagen deseada, o que la cantidad de puntos no permita más calidad debido a la imprecisión del escáner y podría ser también el caso contrario donde haya un exceso de triángulos o de puntos. En este último es donde se originan los problemas, ya que si bien la triangulación de la estructura puede ser un proceso que se ejecute solo una vez, a la hora de poder visualizar el resultado se pueden originar las caídas de FPS frames per second. Como todos sabemos los objetos que se mueven en una pantalla, no son más que una sucesión de imágenes que van pasando una detrás de otra a una velocidad elevada, con lo que se consigue el efecto de movimiento, aplicando así el mismo principio que en el cine. Los FPS son una variable obtenida a partir de contar el numero de imágenes que pasan por la pantalla durante un segundo, este baremo también se mide en el cine. Para que una película de la sensación de movimiento tiene que tener al menos 24,5 FPS, por esto cuando las antes comentadas caídas de FPS suceden obtenemos un movimiento tosco de nuestra reconstrucción que en algunos casos puede originar también el bloqueo del PC. Dichas caídas se producen cuando la cantidad de cálculos a realizar supera la capacidad de obtener resultados de nuestro CPU, un símil a esto sería un marinero sacando agua con un tobo a un barco que se hunde. 4 Para comenzar a comprender todas estas cuestiones técnicas se utilizo un programa diseñado y programado por un departamento de investigación. El programa en cuestión es el MeshLab, que como su nombre indica es un editor de mallas. Una malla es un conjunto de triángulos que forman una superficie de un objeto. Con este programa pudimos observar la diferencia entre malla y colección de puntos. Una malla se suele guardar en un fichero con los triángulos ya asignados a los puntos, la colección de puntos como su nombre indica son los puntos sin triangulación. Este programa contiene diversas opciones de visualización, triángulos, caras etc. Con lo que se obtuvo una información ya más concreta de cómo funcionan estos entornos. MeshLab es una herramienta muy potente, pero tiene algunos de los fallos antes comentados, el problema radica en que los modelos presentados contienen el cien por cien de los puntos facilitados por los ficheros .ply, que son un estándar en la representación de la información para reconstrucciones tridimensionales. Al contener tantos puntos se generan también una gran cantidad de triángulos, lo que ocasiona que en el momento de mostrar el modelo por pantalla con cualquier tipo de movimiento nuestro equipo tenga enormes problemas para mostrar algo que se vea bien y con soltura. La solución de estos problemas radica en la simplificación de las mallas cosa que es bastante compleja. También existen otras soluciones que pasan por construir la malla de triángulos ya simplificada, en este proyecto tendremos la oportunidad las diferencias entre una solución que utiliza el cien por cien de los puntos y otra que solo se queda con el treinta o cuarenta por cien del total de puntos proporcionados. Evidentemente al eliminar puntos perdemos calidad, pero a la vez ganamos velocidad de ejecución, la solución está en encontrar un equilibrio entre velocidad y calidad. 5 2. Objetivos Dentro del mundo de la reconstrucción de edificios, los que necesitamos es estudiar los algoritmos que nos permiten pasar de una nube de puntos a la reconstrucción tridimensional de dicho edificio. Así pues se trata del diseño e implementación, de una aplicación capaz de hacer transformaciones sobre los puntos en el espacio, proporcionados a partir de un cierto tipo de escáner o reconstrucciones computacionales con el fin de obtener la figura que forma dichos puntos. Para ello se han tenido que aplicar diversos algoritmos de los cuales también se ha realizado un análisis, para poder evaluar la calidad de los resultados obtenidos. Dentro de dichos algoritmos podemos encontrar la Triangulación de Ganapathy y la de Delaunay, aparte de estos también se han tenido que diseñar soluciones que ayudan a la aplicación de los mismos. Dentro de estas funcionalidades se incluye toda la parte en la que se da el formato a los datos de entrada, así como también las herramientas de visualización. 2.1 Objetivo Principal Diseñar e implementar una aplicación capaz de reconocer una nube de puntos para obtener su visualización en tres dimensiones. 2.2 Objetivos Secundarios o Conocer el mundo de la reconstrucción en tres dimensiones. o Estudiar los algoritmos existentes sobre la obtención del cierre convexo o Aplicar conocimientos geométricos a la implementación de cada una de las funciones. o Analizar los resultados de cada uno de los algoritmos por separado y establecer las diferencias entre Ganaphaty y Delaunay. o Buscar la mayor simplificación de la figura resultante. o Aplicar los diversos conocimientos obtenidos durante toda la carrera, al diseño desarrollo e implementación de este proyecto. 6 3. Especificaciones Las características específicas de este proyecto se pueden identificar por fases bien definidas, las cuales se presentan a continuación: 3.1 Obtención de los Puntos En esta fase se trata de obtener los puntos en tres dimensiones provenientes de un escáner o bien de una construcción geométrica computacional. Esto se hace mediante los ficheros proporcionados a partir de uno de estos dos métodos. Estos ficheros cabe destacar que son de tipo de texto plano en la implementación diseñada para el proyecto, donde cada una de las líneas representa un punto en el espacio, aunque en el resto de reconstrucciones los ficheros no tiene porque ser de este tipo, también podrían ser de tipo binario. 3.2 Organización y Estructuración de los Puntos Como su nombre indica en esta etapa se buscara la mejor estrategia de organización de puntos, para que posteriormente los algoritmos aplicados funcionaran correctamente con el formato proporcionado. 3.3 Triangulación En este punto se trata de escoger e implementar algoritmos que utilicen dicha nube de puntos para transformarla en una estructura formada por polígonos triangulares. De esta fase se obtiene la figura definida por triángulos. 3.4 Visor en Tres Dimensiones Para que todo esto se pueda apreciar, se tendrá que realizar también un visor donde se podrán mostrar los modelos en 3D. Este visor debe incluir varias funcionalidades como pueden ser cambiar de punto de vista, rotar el objeto, acercar alejar etc. También debe permitir visualizar puntos, triángulos y la figura con la iluminación aplicada. 3.5 Guardado del Modelo Se construirá también un fichero donde se guardara los datos del modelo ya triangulado, para así la próxima vez que se necesite observar dicho modelo no haga falta ejecutar todo el proceso desde el principio. 7 3.6 Casos de Uso En este apartado presentamos el diagrama de casos de uso. Con este diagrama se representa la interacción entre el usuario y la maquina. Como es evidente dicha interacción se produce con la GUI. En la Figura 1 podemos observar el diagrama en cuestión, que partiremos en dos, el primero para la barra menú del programa y otro para el resto de opciones. Figura 1. Caso de uso Barra Menú 8 En la Figura 2 podemos observar el caso de uso aplicado a las opciones de visualización. Figura 2. Caso de uso Opciones Visualización Para una mayor comprensión de las acciones realizadas en cada uno de los casos a continuación se presenta la especificación textual de cada uno de ellos. Guardar i. ii. iii. iv. El usuario hace clic sobre archivo y luego sobre Guardar. El sistema responde llamando a la ventana de selección de archivo. El usuario eligen un directorio y escribe el nombre del archivo, luego hace clic en guardar. El sistema crea un archivo con el nombre proporcionado con la terminación .triángulos y con la información del objeto que se está visualizando actualmente. Cargar i. ii. iii. iv. El usuario hace clic sobre archivo y luego sobre Cargar. El sistema responde llamando a la ventana de selección de archivo. El usuario selecciona el archivo y presiona abrir. El sistema inicializa las estructuras de puntos y muestra por la consola el número de puntos cargados. 9 Leer i. ii. iii. iv. v. El usuario hace clic sobre archivo y luego sobre Leer. El sistema responde llamando a la ventana de selección de archivo. El usuario selecciona el archivo y presiona abrir. El sistema crea una estructura triangular a partir de la información obtenida del fichero seleccionado. El sistema visualiza dicha estructura. Salir i. ii. El usuario hace clic sobre archivo y luego sobre Salir. El sistema termina la ejecución del programa. Delaunay i. ii. iii. El usuario hace clic sobre Triangulación y luego sobre Delaunay. El sistema crea una figura nueva, ejecutando el código perteneciente al algoritmo escogido. Seguidamente el sistema muestra la figura por pantalla. Ganapathy i. ii. iii. El usuario hace clic sobre Triangulación y luego sobre Ganapathy. El sistema crea una figura nueva, ejecutando el código perteneciente al algoritmo escogido. Seguidamente el sistema muestra la figura por pantalla. Modelo i. ii. iii. El usuario hace clic sobre Visualización y luego sobre Modelo. El sistema comprueba la si la opción es posible en ese instante. Seguidamente el sistema muestra la figura por pantalla con todos sus características y opciones disponibles. Contornos i. ii. iii. El usuario hace clic sobre Visualización y luego sobre Contornos. El sistema comprueba que se trate de una figura triangulada por Ganapathy. Seguidamente el sistema muestra únicamente los contornos que forman dicha figura. Instrucciones i. ii. iii. iv. El usuario hace clic sobre Ayuda y luego sobre Instrucciones. El sistema abre una ventana donde se muestra un pequeño manual de uso rápido. El usuario hace clic en aceptar. El sistema cierra la ventana. 10 Sobre el Autor i. ii. iii. iv. El usuario hace clic sobre Ayuda y luego sobre Sobre el Autor. El sistema abre una ventana donde se muestra la información relativa al autor del proyecto. El usuario hace clic en aceptar. El sistema cierra la ventana. Único i. ii. iii. El usuario hace clic sobre Único. El sistema realiza los cambios en la escena grafica para que la figura acabe pintada de blanco. El sistema muestra la figura con los cambios. Fondo i. ii. iii. El usuario hace clic sobre Fondo. El sistema realiza los cambios en la escena grafica para que la figura acabe pintada del color definido como fondo que en nuestro caso es verde. El sistema muestra la figura con los cambios. Iluminación i. ii. iii. El usuario hace clic sobre Iluminación. El sistema realiza los cambios en la escena grafica para que la luz definida inicialmente actúe sobre el objeto que se esta visualizando. El sistema muestra la figura con los cambios. Puntos i. ii. iii. El usuario hace clic sobre Puntos. El sistema realiza cambios sobre la apariencia de la figura que se visualiza, para visualizar únicamente los puntos de la misma. El sistema muestra la figura con los cambios. Líneas i. ii. iii. El usuario hace clic sobre Líneas. El sistema realiza cambios sobre la apariencia de la figura que se visualiza, para visualizar únicamente las líneas que unen los puntos de la misma. El sistema muestra la figura con los cambios. Polígono i. ii. iii. El usuario hace clic sobre Único. El sistema muestra los triángulos generados por nuestros algoritmos, la diferencia es que las caras están pintadas. El sistema muestra la figura con los cambios. 11 Rotación i. ii. iii. El usuario hace clic sobre Rotación. El sistema comprueba si el botón ya estaba seleccionado, en caso afirmativo lo deselecciona y pone el Alpha de la rotación en pause, en el caso contrario selecciona el radiButton y pone el Alpha de la rotación en run. El sistema muestra la figura rotando o no. X i. ii. iii. El usuario hace clic sobre X. El sistema cambia la asignación de una variable hacia x, esta luego es comprobada a la hora de realizar la triangulación. El sistema muestra la figura rotando o no. Y i. ii. iii. El usuario hace clic sobre Y. El sistema cambia la asignación de una variable hacia y, esta luego es comprobada a la hora de realizar la triangulación. El sistema muestra la figura rotando o no. Z i. ii. iii. El usuario hace clic sobre Z. El sistema cambia la asignación de una variable hacia z, esta luego es comprobada a la hora de realizar la triangulación. El sistema muestra la figura rotando o no. Borrar i. ii. iii. El usuario hace clic sobre Borrar. El sistema elimina todas las figuras del marco de visualización. El sistema se mantiene a la espera de la carga de otro archivo para poder seguir mostrando figuras. 12 4. Diseño En esta fase del proyecto se tuvieron que barajar unas cuantas posibilidades, ya que hay diversas maneras de implementar este sistema. A continuación se comentan las decisiones tomadas para cada problema presentado en el diseño. 4.1 Elección del Lenguaje No hubieron muchas dudas a lo hora de elegir el lenguaje de programación, ya que solo se presentaron como candidatos C y Java. Este proyecto se ha decidido implementar usando Java por varias razones entre las cuales encontramos: 4.1.1 Portabilidad Como todos sabemos hoy en día la portabilidad de una aplicación es muy importante ya que nos permite usarla en cualquier sistema informático incluso con sistema operativo diferente. Java es uno de los principales lenguajes de programación que permite portabilidad entre entornos como Windows, Linux o en móviles. Todo esto lo permite gracias a que todas las llamadas pasan primero por una maquina virtual que centraliza toda la ejecución del programa. Cosa que también conlleva a una pérdida de potencia. 4.1.2 Facilidad Se trata de un lenguaje de programación orientado a objetos proveniente del C que es bastante sencillo de codificar, así como también es fácilmente legible. 4.1.3 Experiencia A la hora de elegir un lenguaje de programación también se tiene que tener en cuenta en cuál de ellos nos desenvolvemos mejor, para así obtener resultados lo más rápido y eficiente posible. Por ello dado que la mayoría de las prácticas de materias de la carrera han sido implementadas en Java, existe una mayor relación y adaptación con este lenguaje. 4.1.4 Librerías Java posee sus propias librerías dedicadas a la representación visual en tres dimensiones Java3D, estas librerías utilizan OpenGl que es una librería grafica de las más conocidas junto con Direct3D. Presenta al usuario una idea clara e intuitiva de cómo tratar la información y como se representa en tres dimensiones. 13 4.2 Librería Grafica Como antes se ha mencionado la librería grafica es Java3D, la cual nos servirá para transformar a imágenes todos los cálculos realizados. A continuación se explica brevemente como funciona dicha librería. Como todo programa, Java3D está al menos parcialmente instanciado por objetos del árbol de clases nativas. Esta colección de objetos representa el Universo Virtual que va a ser renderizado posteriormente. Dichas clases se encuentran disponibles en el paquete javax.media.j3d.También existen en Java3D las clases de utilidades que se encuentran en el paquete com.sun.j3d.utils, que al ser utilizadas podemos llegar a reducir considerablemente las líneas de código. 4.2.1 Escenario Grafico En el proceso de construcción de un escenario grafico que es una estructura de datos que está compuesta de componentes y arcos de relación, se pueden encontrar clases como Group que puede tener cualquier número de hijos, pero solo puede ser hijo de una padre, a esto se le llama relación de herencia. El otro tipo de relación son referencias a objetos como NodeComponent. Dichos objetos definen la geometría y los atributos de apariencia usados para renderizar los objetos visuales. Un escenario grafico en Java3D está construido de objetos nodos con relaciones padre-hijo formando una estructura arbolar. En un árbol un nodo es la raíz, se puede acceder a otros nodos siguiendo los arcos desde la raíz. Solo existe un camino desde la raíz de un árbol a cada una de las hojas; por lo tanto, solo hay un camino desde la raíz hasta el escenario grafico de cada nodo hoja. Existe un camino de escenario grafico por cada hoja del árbol. Dicho camino especifica completamente ola información del estado de su hoja, que puede ser la localización, la orientación y el tamaño del objeto visual. Los escenarios gráficos se dibujan usando símbolos gráficos estándar como se ve en la Figura 3. Figura 3. Símbolos gráficos estándar 14 Cada uno de los símbolos que se ven en el lado izquierdo de la Figura 1, representa un solo objeto cuando se usa en un escenario gráfico. Los dos primeros símbolos representan objetos de clases especificas: VirtualUniverse y Locale. Los siguientes 3 símbolos representan objetos de las clases Group, Leaf y NodeComponent. Estos tres símbolos normalmente tienen anotaciones para indicar la subclase del objeto específico. El último símbolo se utiliza para representar otras clases de objetos. El símbolo de la flecha sólida representa una relación padre-hijo entre dos objetos, la flecha punteada es una referencia a otro objeto. Los objetos referenciados pueden ser compartidos entre diferentes ramas de un escenario grafico. Un ejemplo de escenario gráfico se presenta en la Figura 4. Figura 4. Ejemplo escenario grafico 15 4.2.2 Clases de Alto Nivel Java3D En la Figura 5 podemos ver los tres primeros niveles del árbol de clases de Java3D. Este árbol contiene las clases VirtualUniverse, Locale, Group y Leaf. Figura 5. Clases de alto nivel Java3D SceneGraphObject es la superclase de casi todas las clases centrales de utilidad. Contiene dos subclases Node y NodeComponent. Dichas subclases proporcionan la mayoría de los objetos de un escenario grafico. Un objeto nodo puede ser un objeto nodo Group o un objeto nodo Leaf La clase Node es un superclase abstracta de las clase Group y Leaf. Esta clase define algunos métodos importantes de sus subclases. La subclases de esta componen lo que luego serán los escenarios gráficos. La clase Group es la superclase usada en la especificación de localización y orientación de objetos visuales en el universo virtual. Dos de las subclases de Group son: BranchGroup y TransformGroup. La clase Leaf es la superclase usada para especificar la forma sonido y comportamiento de los objetos visuales en el universo virtual. Algunas de las subclases de Leaf son: Shape3D (construcción geométrica), Light, Behavior y Sound. Dichas clases podrían o no tener hijos pero podrían referenciar a NodeComponents. 16 La clase NodeComponent es la superclase usada para especificar la geometría, la apariencia, la textura y las propiedades de material de un nodo Shape3D (Leaf). Los NodeComponents no forman parte del escenario grafico, pero son referenciados por él. Un NodeComponent podría ser referenciado por más de un objeto si se quiere que las figuras tengan todas o algunas el mismo aspecto. 4.2.3 Estructura Básica Así pues una estructura básica de un programa con esta librería pasaría por seguir los siguientes pasos: - - Crear un objeto Canvas3D. Crear un objeto VirtualUniverse. Crear un objeto Locale, adjuntarlo al objeto VirtualUniverse. Construir la rama de vista grafica que incluye: o Crear un objeto View o Crear un objeto ViewPlatform o Crear un objeto ViewPlatform o Crear un objeto PhysicalEnviorment Adjuntar los objetos ViewPlatform , ViewPlatform, PhysicalEnviorment y Canvas3D al objeto View. Construir las ramas graficas de contenido. Compilar las ramas graficas. Insertar los subgráficos dentro del objeto Locale. 17 4.3 Elección de Algoritmos Para la implementación de este proyecto existen una gran variedad de maneras de comprender el problema de traspasar una nube de puntos a un objeto en tres dimensiones, a continuación vamos a hacer un resumen y de dichas soluciones y características. Básicamente se estudian dos maneras de hacer una triangulación de un conjunto de puntos en el espacio 3D, la primera se trata de obtener los puntos por contornos construir su cierre convexo y triangular por parejas de cierres convexos; La segunda manera de ver el problema sería haciendo la proyección de los puntos en 3D a un plano, en este plano hacer la triangulación en 2D y luego devolver la altura a los puntos triangulados. Se han elegido los dos algoritmos más conocidos que realizan dichas tareas Ganapathy y Delaunay. Las características de los cuales presentamos a continuación. 4.3.1 Ganapathy Este algoritmo que consiste en obtener primeramente los puntos ordenados por contornos, es decir que la figura este fileteada en rodajas, donde cada rodaja represente una altura que puede ser en cualquiera de las tres coordenadas x y z. Entendemos por contorno al conjunto de puntos que comparten una de las tres coordenadas en el espacio un ejemplo de ello lo podemos apreciar en la Figura 6. Figura 6. Ejemplo de contornos 18 A la obtención ordenada de los puntos, de forma de que el punto siguiente sea el que es mas exterior y a la vez el más cercano, se le llama Cierre Convexo. Un ejemplo de cierre convexo de la Figura 7 es el representado por la Figura 8. Figura 7. Ejemplo de nube de puntos Figura 8. Ejemplo de cierre convexo 19 Hay una gran cantidad de algoritmos que calculan el cierre convexo a continuación explicaremos algunos de ellos. • Algoritmo de Jarvis: su cometido es encontrar el cierre convexo a través del cálculo de ángulos entre los puntos que conforman el conjunto de puntos de un plano. Un ejemplo de su ejecución lo podemos apreciar en la Figura 9. Como podemos observar la finalización del algoritmo viene dada por el hecho de volver a llegar al vértice de partida. Como se puede apreciar este algoritmo tendrá un coste de O (n2) donde la n representa el número de puntos que contiene el plano al cual se le quiere calcular el cierre convexo. Figura 9. Algoritmo Jarvis • Algoritmo QuickHull: con este método lo que se busca es asignar a cada punto una situación según la zona donde se encuentren (NE, SE, SW, NW) y luego ir recortando los puntos sobrantes. Primero se encuentran los puntos extremos encontrando también su cierre convexo lo cual es bastante sencillo ya que si un punto es el extremo de su lado no hay más que unirlo con los demás. A continuación se buscan los puntos extremos de cada lado del cierre, luego se unen los puntos con dichos extremos y así hasta quedarnos sin puntos que excluir. En la Figura 10 podemos ver como funcionaria este algoritmo. Podemos ver que el coste de este método es O (n2). Figura 10. Algoritmo QuickHull 20 • Algoritmo de Graham: en este caso también se utilizan los ángulos pero se calculan en la inicialización del algoritmo, escogemos el vértice que sea lexicográficamente más pequeño y calculamos los ángulos hacia el resto de puntos. A partir de ahí escogemos el vértice en función de si es un giro a izquierda o a derecha, un ejemplo de ello lo podemos ver en la Figura 11. Como podemos apreciar el coste de este algoritmo de O (n logn) donde n es el número de puntos. Figura 11. Algoritmo Graham • Algoritmo Incremental: este proceso está basado en primeramente la obtención de tres puntos, a partir de los cuales se elijen aquellos que se encuentran exteriores al polígono que forma la unión de los mismos. En la Figura 12 encontramos la manera de actuar de dicho algoritmo. Podemos ver que el coste de este procedimiento se sitúa en O (n log n) donde n es el número de puntos. Figura 12. Algoritmo Incremental 21 • Dividir para Vencer: se trata de una variante de todos estos algoritmos en la que se divide la figura en dos partes, en cada una de las cuales se calcula su cierre convexo especifico y luego se une calculando la tangente común exterior a dichos polígonos convexos, una vez hecho esto se eliminan las cadenas que han quedado en el interior del polígono. Apreciamos que este algoritmo tiene un coste de O (n log n), como se puede observar en la Figura 13. Figura 13. Dividir para Vencer Después de haber estudiado todos estos algoritmos se ha decido implementar primero un algoritmo recomendado por la tutora al cual citamos como ordenación por rectas. Y luego el algoritmo de Graham para realizar una ejecución un poco más rápida. • Algoritmo Ordenación Rectas: este algoritmo consiste en encontrar a partir de un conjunto de puntos situados en plano, aquel que tenga la y mínima, en el caso de empate se escoge aquel que sea más exterior de todos. Una vez hecho esto se comprueba que la recta formada por este punto y otro cualquiera de la lista se la mas exterior. Esto se consigue a partir de la formula general de la recta Formula 1. {(x-x1) / (x2-x1)}-{(y-y1) / (y2-y1)} (1) A partir de la cual despejamos la Formula 2 para poder evitar los errores de división por cero. {(x-x1)*(y2-y1)}-{(y-y1)*(x2-x1)} (2) Donde el punto elegido como menor tiene por coordenadas x1 y1, el punto elegido de la lista de puntos tiene por coordenadas x2 y2, el punto x y son todo el resto de puntos que se prueban dentro de la formula, lo que da origen a un numero el cual denotaremos como calculo, a continuación se comprueba si dicho calculo es mayor o menor que cero, que sea menor que cero quiere decir que el punto de coordenadas x y esta por la parte izquierda de la recta y si por el contrario este cálculo es mayor que cero quiere decir que este punto está por la derecha de la recta .Si la recta que estamos probando consigue obtener todos los cálculos con el mismo resultado para la comparación quiere decir que es la más exterior, por tanto devolvemos el punto que consigue esto y volvemos a empezar desde este ultimo. 22 Una vez calculado el cierre convexo el algoritmo de Ganapathy nos dice que para construir el objeto en tres dimensiones debemos unir cada dos cierres de puntos con una hilera de triángulos como representa la Figura 14. Esto no es que se realice aleatoriamente, primero se empieza por cualquiera de los cierres ya que están obtenidos a partir del mismo algoritmo, ósea que están ordenados por igual. Figura 14. Ejemplo de Cierres Se escoge por ejemplo el punto P0 se une con el Q0 y con el P1 entonces formamos el triangulo formado por dichos vértices, el siguiente punto a escoger ya depende del largo abarcado por cada triangulo dividido por el perímetro del cierre, para una mejor ilustración de esto observar la Figura 15. Figura 15. Triangulación Contornos 23 En la figura podemos que ɸ’h es la distancia acumulada por los triángulos formados en la parte superior así como ɸ’v es de la parte inferior, en este algoritmo se busca un equilibrio en la repartición de triángulos entre un lado y otro. Para ello se establece la condición de que el siguiente triangulo a formarse será el que posea la menor distancia calculada como en la Formula 3 y Formula 4. Dh= (ɸ’v+ ɸv)-(ɸ’h / perimetroh) (3) Dv= (ɸ’h+ ɸh)-(ɸ’v / perimetrov) (4) Se establece que si Dh< Dv entonces el triangulo tendrá dos puntos hacia el lado h y si no será justamente lo contrario, volviendo al caso principal donde teníamos el triangulo P0-Q0-P1 aplicando estas formulas obtenemos que el siguiente triangulo debería estar formado por el trío de puntos Q0-Q1-P1. 24 4.3.2 Delaunay Dado un conjunto de puntos P en un plano de dos dimensiones como por ejemplo el de la Figura 16, tomaremos como triangulación de Delaunay al grafo rectilíneo formado por el diagrama de Voronoi como podemos observar en la Figura 17. Figura 16. Conjunto de puntos 2D Figura 17. Diagrama de Voronoi 25 Se definen también dos características primordiales, una pareja de puntos forman una arista de Delaunay si y solo si la circunferencia solamente incluye dichos puntos, también podemos decir entonces que tres puntos forman un triangulo de Delaunay si y solo si dichos puntos que forman una circunferencia no contienen ninguno mas de el conjunto P, como podemos observar en la Figura 18. Figura 18. Caracterización de Delaunay El algoritmo de Delaunay está diseñado especialmente para trabajar en 2D, entonces para poder utilizarlo en 3D hay que hacer la proyección de los puntos en 3D a 2D como podemos observar en la Figura 19, esto significa para este caso, quitar una de las coordenadas antes de pasarle la lista de puntos al algoritmo y el momento en que devuelva la lista de triángulos, a los puntos de los mismos volverles a añadir la tercera coordenada. Figura 19. Proyección de puntos a 2D 26 4.4 Procesos Auxiliares En este punto se expone el diseño de los métodos que ayudan a que el programa pueda funcionar correctamente, se más atractivo y complete su funcionalidad respectivamente. 4.4.1 Ordenación de los Puntos por Contornos Esta ordenación se realiza de manera que si un fichero de puntos, no viene ordenado de ninguna manera se puedan extraer los contornos en cualquier coordenada elegida por el usuario. Para realizar esta ordenación se ha utilizado el método sort de java.list al cual solo hay que pasarle una instancia de la clase Comparator, que define como se va a realizar las comparaciones dentro de la lista. Gracias a esto podemos ejecutar con tranquilidad el algoritmo de Ganapathy ya que tiene como clausula que sus puntos vengan dados por contornos ordenados. 4.4.2 Calculo Normales Una vez construida la estructura triangular, la intención es asignarle un color, pues bien al hacer esto nos damos cuenta de que no hay diferencias plausibles entre una esquina y un trazo horizontal de figura. Esto se debe a la iluminación del objeto, como todos sabemos que la luz nos permite apreciar el color en sus diferentes tonalidades, en función de la intensidad de la misma y asi conseguir el efecto de profundidad. Para solucionar este problema hay que calcular el vector normal asociado a un plano, ya que la luz incide en un ángulo y con mayor o menor medida dependiendo del vector definido como normal. A través de Formula 5, Formula 6 y Formula 7 podemos realizar dicho calculo. Nx=∑𝑛𝑛𝑖𝑖=1(𝑦𝑦𝑖𝑖 − 𝑦𝑦𝑗𝑗 ) ∗ (𝑧𝑧𝑖𝑖 − 𝑧𝑧𝑗𝑗 ) Ny=∑𝑛𝑛𝑖𝑖=1(𝑧𝑧𝑖𝑖 − 𝑧𝑧𝑗𝑗 ) ∗ (𝑥𝑥𝑖𝑖 − 𝑥𝑥𝑗𝑗 ) Nz=∑𝑛𝑛𝑖𝑖=1(𝑥𝑥𝑖𝑖 − 𝑥𝑥𝑗𝑗 ) ∗ (𝑦𝑦𝑖𝑖 − 𝑦𝑦𝑗𝑗 ) (5) (6) (7) Como podemos observar el subíndice i pertenece al número de puntos del plano, en nuestro caso utilizaremos los tres puntos del triangulo para generar el vector. Nótese también que el subíndice j hace referencia al siguiente punto después de i en la lista. Con este cálculo conseguimos el vector normal a cada triangulo que seria a cada cara de nuestra figura, pero hay otro problema, cada una se ilumina 27 independientemente de la que esta contigua, por lo tanto el resultado no será el esperado. Para solucionar este problema es necesario calcular por cada uno de los puntos de nuestra figura la normal asociada, pero con la diferencia que esta normal será la media de las normales de los triángulos adyacentes que contengan dicho punto. Para realizar este cálculo de normales medias, hubo que crear una estructura de datos donde apuntamos por cada punto que triángulos tiene contiguos, esto se realiza durante la creación de triángulos es decir en una de las dos triangulaciones, de esta manera en el momento que tengamos que calcular la normal podremos saber con qué vectores hacer la media. Con este cálculo obtenemos la media de la normal para cada punto y así obtenemos que cada una de las caras de la figura se ilumine a partir del conjunto de iluminación de las caras adyacentes y así conseguir una imagen más realista. 4.4.3 Caras Interiores Uno de los problemas presentados después de la triangulación, es el que lo triángulos mostraban sus caras hacia la parte interior de la figura. Esto pasa por que en el mundo de la representación en 3D existen unos estándares para el pintado de los triángulos. Si pintamos el triangulo en sentido anti horario veremos la cara superior de dicho triangulo, pero si por el contrario pintamos en sentido horario veremos la cara inferior del triangulo. Este problema se origina por el hecho de que en la triangulación no se toma en cuenta el sentido en que se añaden los puntos. Para solucionar esto y aprovechando el cálculo de la normal, se han tomado las coordenadas de la normal como las capitales A, B y C de la Formula 8 que es la formula elemental de un plano. A*x+B*y+C*z+D (8) Obtenemos D a partir de la Formula 8 y nos da como resultado la Formula9 D=-(A*x)-(B*y)-(C*z) (9) Donde las coordenadas x y z vienen dadas por los puntos que forman cada uno de los triángulos. Una vez tenemos este cálculo realizado basta con sustituir en la ecuación del plano del triangulo las tres coordenadas x y z de otro triangulo y analizar el resultado, que si es mayor que cero entonces dicho triangulo es interior y se debe de pintar en sentido contrario, además también debemos negar el vector normal para así conseguir que la luz alumbre por la parte visible de la cara. 28 4.5 Estructura Ficheros Para este proyecto se definen dos tipos de fichero .putos y .triángulos, en el caso del primero y como su nombre indica proporciona una lista de los puntos en 3D que forman un objeto concreto una estructura típica seria como la mostrada por la Figura 20. Figura 20. Ejemplo fichero puntos Cabe destacar que este fichero es el que proviene de un escáner que devuelve los puntos en altura de una superficie cualquiera, o bien de reconstrucciones geométricas computarizadas. Una vez este fichero este cargado, triangulado y renderizado no tiene porque volvernos a hacer falta, ya que la información pasara a fichero .triángulos el cual contendrá toda la estructura del objeto triangulada para así no tener que volver a cargar y perder el tiempo triangulando los puntos. Este fichero poseerá una copia exacta de los puntos del fichero de puntos, pero con la diferencia de que luego, una vez terminada la especificación de los puntos, vendrá la lista de triángulos, en la cual solamente habrá tres índices por cada triangulo donde cada índice será una posición de la lista que se formara nuevamente a la hora de cargar. Un ejemplo de este fichero seria como el de la Figura 21. Figura 21. Ejemplo fichero triángulos 29 4.6 Estructuras de Datos Para implementar todo lo que se expuesto anteriormente vamos a necesitar unas cuantas estructuras de datos, bien diferenciadas. A continuación presentamos una lista con todos las ED. 4.6.1 Punto La primera y la principal de las estructuras es el punto, esta estructura nos sirve para almacenar otra estructura de datos llamada Point3d y un entero que será el índice donde se encuentra dicho punto dentro de una lista como podemos observar en la Figura 22. Con respecto a sus métodos todos son consultores, es decir simplemente devuelve el valor de los atributos contenidos. Esta estructura se diseño con la intención de solucionar el problema de cómo exportar la información de una figura ya triangulada. El problema estaba en que si se imprimía un fichero con los puntos que forman los triangulo directamente, estaríamos repitiendo información y por lo tanto malbaratando recursos, lo cual en el mundo de la informática y en el real no tiene ningún sentido. Una LinkedList es una estructura de datos proporcionada por java, la cual implementa una lista dinámica doblemente encadena, la cual nos permite recorrer uno a uno, así como también consultar el primero y el ultimo, así como utilizar los métodos de ordenación nativos sobre ella. Un Point3d es una ED proporcionada por la librería grafica Java3D, que representa un punto en tres dimensiones, así pues contiene entre otros datos, las coordenadas x y z en formato de doublé para tener la mayor precisión posible. También incluye ciertos métodos bastante útiles como la distancia entre dos puntos etc. Con el uso de dicha estructura nos evitamos tener que implementar todas las estructuras de datos y así poder dedicar más tiempo en la implementación de código lógico. Figura 22. ED Punto 30 4.6.2 Contorno Se trata a de una estructura de datos que sirve únicamente para la encapsulación de Puntos. Como ya sabemos uno de los algoritmos utilizados trabaja con contornos, entonces se ha tenido que crear esta estructura que contiene una lista de Puntos para mantener la estructuración del código. También contiene una lista de puntos ordenada que es utilizada por el método ordenarRecta, una variable de tipo doublé perímetro y por cuestiones técnicas una seria de variables globales para hacer más fácil la programación. Podemos ver un ejemplo de la estructura en la Figura 23. Con respecto a los métodos podemos decir que son todos consultores excepto los siguientes: • • • odernarRecta: que se encarga de ordenar los puntos de manera que si trazamos una línea uniéndolos todos forme el cierre convexo la manera de actuar de este método esta explicada en el punto 4.3.1 es el ultimo algoritmo explicado de todos los que calculan el cierre convexo. calcularDestino: este método es llamado por el método ordenarRecta tantas veces como sea necesario mientras el punto retornado por este método sea diferente del punto inicial proporcionado por parámetro. perímetro: como ya sabemos para la otra parte del algoritmo de Ganapahthy necesitaremos el perímetro del contorno para saber si trazar de una manera u otra un triangulo entre los 2 contornos es cuestión. Figura 23. ED Contorno 31 4.6.3 Triangulo Es una estructura utilizada para almacenar los datos relativos a los triángulos generados por los diferentes algoritmos, como es normal incluye tres puntos de tipo Punto, donde se almacenan las coordenadas del triangulo. Contiene también las variables nx, ny y nz que son los valores de la normal que se calculan en el constructor del objeto justo después de inicializar los valores x y z con los que nos pasan por parámetro al crear el objeto. También almacenamos las variables A B C D que son las pertenecientes a las capitales de la ecuación del plano, que también se calcula en el constructor justo después de haber calculado las normales. Cabe destacar que la ecuación del plano la necesitamos para saber si el triangulo en cuestión es una cara interior o no. Posee un Vector3f normalVector que es una estructura proporcionada por la librería grafica para representar la normal a asociada a un objeto y así poder iluminarlo. Este vector también contiene la operación negate que es utilizada para cambiar la iluminación de una cara a su la do exterior o interior dependiendo de la posición inicial. Incluye también un bolean que nos ayudara en el momento de pintar las caras a saber si el triangulo mira hacia adentro o hacia fuera. Con respecto a operaciones solo tenemos calcular normales, comprobar que la cara del triangulo sea interior o exterior y calcular plano, las demás son operaciones consultoras de los datos almacenados en cada una de las instancias de la clase triangulo. La estructura del triangulo seria como la de la Figura 24. Figura 24. ED Triangulo 32 4.6.4 Nodo Es una estructura utilizada como solución al problema de la media de las normales en cada punto de una figura. Al calcular la normal asociada a un triangulo ósea una cara del objeto se produce un efecto bastante indeseado, ya que cada una se ilumina si tomar en cuenta la posición de las caras adyacentes como podemos observar en la Figura 25. Figura 25. Iluminación Incorrecta Como podemos observar en esta imagen cada triángulo tiene su propio vector normal a consecuencia de esto obtenemos una iluminación más bien poco realista. Para solucionar este problema se aplica una solución a la cual se la conoce como el alisado, que consiste en calcular la normal para cada uno de los puntos del polígono, haciendo la media de las normales adyacentes. Para hacer esto necesitamos saber por cada uno de los puntos que triángulos convergen en el mismo. Por ello se dio paso a la creación de esta estructura de datos en la que se almacena un punto y todos los triángulos donde se encuentra. El resultado a diferencia del anterior se puede ver en la Figura 26. 33 Figura 26. Iluminación Correcta En esta imagen podemos observar que la iluminación del objeto es más realista ya que hemos hecho el suavizado por cada uno de los puntos. Volviendo a la ED, podemos comentar que contiene dos estructuras complejas en su interior, una referencia a Punto y una lista de referencias a Triangulo, que están contenidas dentro de una LinkedList. Todos los métodos que contiene esta estructura son para consultar la información contenida, excepto tres, addTriangulo, calcularNormal y esIgual. • • • addTriangulo: se encarga de añadir en la lista de referencias una nueva hacia el triangulo que nos pasan por parámetro, siempre y cuando este no haya sido añadido aun. calcularNormal: el cálculo de la normal como antes ya se ha comentado se realiza consultado toda la lista de referencias a triángulos, extrayendo sus normales, calculando el sumatorio y dividiendo el por el numero de triángulos que hayan intervenido en el cálculo. esIgual: este método devuelve un bolean con el resultado de comprobar que el objeto en cuestión es igual al pasado por parámetro, en este caso para saber si un nodo es igual a otro comparamos el Punto. 34 Para hacernos una idea de cómo sería la estructura y lo que contendría podemos mirar la Figura 27. Figura 27. Iluminación Correcta Como podemos ver en la figura anterior el cuadro superior seria una cara de un cubo, o una pirámide vista desde arriba, que contiene seis triángulos. En los nodos podemos ver que es lo que se guarda realmente en cada una de las estructuras comentadas. 35 4.6.5 Polígono En esta estructura de datos es donde se lleva a cabo casi toda la lógica del programa. Contiene una lista de puntos, la cual se la proporcionamos por parámetro a partir del constructor en la fase de instanciación del objeto. Incluye además una serie de listas, como son contornos para que cuando se ejecute Ganapathy lea de una variable global sin tener que utilizar el paso de parámetros, refPuntos que es una lista de nodos utilizada para solucionar el problema de la iluminación y la media de las normales, dos listas de triángulos una para cada algoritmo en las que se guardan instancias de Triangulo para luego poder traspasar dicha información a un fichero y por ultimo triangulosS que es de tipo TriangleArray. En la Figura 28 se muestra la estructura básica de un polígono. Figura 28. ED Triangulo Una TriangleArray es una estructura proporcionada por la librería grafica para formar lo que son las Shape3D, es decir las figuras en sí, que además de triángulos contiene una serie de atributos necesarios para poder obtener una buena visualización como por ejemplo los Vector3f para la iluminación. Por lo tanto en los métodos de construcción de triángulos tenemos un método que incluye el traspaso de una estructura a otra, calculando además las normales para cada unos de los puntos. Para poder calcular las normales se ha tenido que crear una lista de nodos que guardan por cada punto en que triángulos se encuentra y así después poder calcular la media de las normales asociadas a dichos triángulos y obtener el suavizado en la iluminación. 36 En la siguiente lista analizaremos cada uno de los métodos de esta estructura: • • • • • • • • • Guardar: este método devuelve un String con todos los datos que se van a escribir en el fichero de salida, esto se hace mediante un recorrido primero por la lista de puntos y añadiéndolos al String de retorno, luego te recorre una de las dos listas de triángulos en función de cual este inicializada y copian por cada uno los tres índices de la estructura Punto. Así conseguimos evitar el exceso de información. Leer: esta operación es justamente el caso contrario a guardar, simplemente nos pasan una lista de índices la cual recorremos leyendo de tres en tres ya que son los índices de los triángulos con que formaremos la figura. Ordenar: se encarga de organizar cada uno de los contornos por aquellos que forman el cierre convexo como ya se ha explicado en capítulos anteriores. Contornos: a partir del fichero de puntos, detectamos los contornos en función de la altura seleccionada por el usuario. Como ejemplo decir que si el usuario elije la z entonces este algoritmo ordena los puntos de menor a mayor en función del parámetro elegido y seguidamente realiza una lista con todos aquellos que coinciden en este, lo cual da origen a la estructura contorno, entonces la lista de contornos es actualizada. Ganapathy: se trata del método que implementa el algoritmo de triangulación de contornos, que se ha detallado en el punto 4.3.1. Únicamente añadir que en este método cada vez que acabamos el emparejamiento de dos contornos, ejecutamos el método comprobarCaras y seguidamente ejecutamos el pintarTriangulos. Delaunay: implementa la llamada a la librería Delaunay, y devuelve los puntos en dos dimensiones a los cuales se les añade la 3ra dimensión. Al igual que Ganapathy se llaman a sendos métodos, para conseguir la visualización. ComprovarCaras: es un método utilizado para saber si una cara es interior o exterior esto se consigue aplicando la teoría comentada en el punto 4.6.3. Con el único añadido que es llamado por los métodos Ganapathy y Delaunay, pasándole una lista de triángulos por parámetro. Dentro de este método hacemos un recorrido por dicha lista y encontrar cuales son o no interiores entonces marcamos el bolean cierto o falso. PintarTriangulos: utiliza una de las listas de triángulos para transformarlos en la TangleArray y aplicarle la normal a cada uno de ellos, comprobando el bolean que comentábamos en el apartado anterior, con esto se consigue escribir la variable triangulosS, que es precisamente la que consultamos desde el MenuPrincipal para crear el Shape3D utilizando el método getTriangulos. ActualizarRefPuntos: este método se ejecuta cada vez que se añade un triangulo al polígono, se encarga de mantener la lista de nodos actualizada para saber que triángulos tiene cada punto. 37 4.6.6 Ordena Es una estructura de datos que se sirve para ser usada por el método sort, que es implementado por una clase interna de Java. Básicamente sirve para indicarle a java como tiene que ordenar los elementos que están dentro de una lista. Po ejemplo en nuestro caso las listas de puntos. La ordenación se realiza en función de una de las coordenadas, para ellos hay que indicarle las salidas en cada caso. Todo se implementa en el único método que posee la ED el compare, es precisamente el método que java llama a la hora de comparar un elemento con otro dentro de la operación de ordenación. 4.6.7 LeerFichero Cuando instanciamos esta clase obtenemos un objeto que no contiene ningún tipo de datos, solo contiene un par de métodos que reciben un String por parámetro que es le path de un archivo. Los métodos son los presentados a continuación. • • LeerPuntos: se trata de una operación que devuelve una lista de tipo Punto, a partir de una dirección proporcionada por parámetro. La manera de leer es bastante sencilla, tenemos un FileReader y un bufferReader. El primero se utiliza para abrir el canal con el archivo en el dispositivo solido y el segundo lo utilizamos para ir guardando la información de cada una de las líneas del archivo. Luego se utiliza una estructura llamada StringTokenizer que nos sirve para separar el String que equivale a una línea del fichero en las partes que están separadas por espacio, que en este caso son las coordenadas x y z de uno de nuestros puntos. Una vez obtenemos los valores los normalizamos, ya que nuestro visualizador para tener una mayor precisión trabaja con números fraccionarios. Después se crea una estructura Point3d y otra Punto, al Punto se le asigna su Point3d y la posición que es el índice o altura de línea dentro del fichero. LeerTriangulos: funciona de manera similar el método leerPuntos, con la diferencia que cuando se recorre el fichero se comprueba si se ha llegado al carácter centinela, que no es más que un símbolo el elegido para que el programa pueda saber cómo actuar. En este caso el carácter centinela es “T” que nos sirve para saber donde comienzan los índices de los triángulos. El modo de funcionar es muy sencillo guardamos los índices de los mismos en una lista de enteros de tres en tres. Luego cuando tenemos los puntos y los índices creamos un polígono el cual construimos con los puntos obtenidos y luego le aplicamos el método leer, que se encarga de reconstruir la figura. Una vez echo esto devolvemos el polígono que será recibido por el programa principal para visualizarlo. 38 4.6.8 MenúPrincipal Esta clase como su nombre indica implementa el menú que vemos por pantalla, pero además también se encarga de almacenar las llamadas a la librería grafica Java3D. Como en todas las aplicaciones hechas en java que llevan interfaz grafica, esta clase contiene en forma de variables globales todas las estructuras necesarias para poder crear el entorno visual, en las que incluimos todo tipos de elementos como pueden ser paneles, botones, checkbox, radioButton, etc. La programación de cada uno de estos botones se ha realizado con clases anidadas. Como ya sabemos la respuesta a una interrupción realizado por un usuario en java a través de los eventos, dichos eventos se controlan a través de las clases antes mencionadas. También hay otras maneras de hacerlo, pero conllevan también un exceso de comprobaciones que son totalmente ilógicas en la capa superior de un programa. Para la construcción de la interfaz grafica se utilizo IDE llamado NetBeans el cual nos permite, crear fácilmente la GUI de un programa, usando principalmente el ratón. Esta clase incluye un MainFrame que es el sitio donde van incluidas todos los contenedores visuales, para java un mainframe es una ventana que utilizan los applets para ejecutarse. Dentro de los cuales podemos encontrar el Canvas3D que es la zona de dibujo proporcionada por la librearía grafica para poder dibujar. También se almacenan los objetos necesarios para la creación de un escenario virtual como se ha explicado anteriormente. En métodos tenemos: • • • Init: que se encarga de inicializar todos los elementos visuales, pasando por la GUI, hasta la creación de un entorno tridimensional preparado para cuando se haga la carga de un archivo de puntos. crearEscenario: esto método devuelve un BranchGroup elemento necesario para la creación de la escena dentro del simpleUnivers. Main: este método lo único que hace es crear un mainframe y pasarle como contenedor de objetos visuales, un MenuPrincipal. Cabe destacar que el método main es aquel que todo programa escrito en java, busca el primero cuando se hace una ejecución. 39 5. Desarrollo En este apartado se trata de realizar un recopilatorio en orden de todas las tareas realizadas durante la ejecución del proyecto. Desde el estudio previo junto con las pruebas iniciales hasta la construcción de la Gui. 5.1 Primeros Pasos Este proyecto comenzó por una fase documental donde el autor, tuvo que buscar mucha información sobre todo lo relacionado con el tema, ya que era bastante desconocido para si mismo. Primero y como el proyecto al principio fue enfocado de otra manera la documentación iba mas enfocada a la simplificación de mallas de triángulos ya construidas. Después se decidió que el alcance seria más bien la construcción de dichas mallas. Entonces comenzó la recolecta de información que trataba sobre triangulación, entornos 3D (Java3D), algoritmos etc. 5.2 Pruebas Iniciales Una vez delimitados los colindares del proyecto, entonces se paso a probar el entorno en 3D elegido. Para realizar esta pruebas se utilizaron infinidad de ejemplos, pero los más importes y más claros fueron el paquete de ejemplos creado por Sun Microsystem que se llama Java 3d Programing. En dicho paquete se encuentra toda la información relativa al visualizador, donde se explica detalladamente cómo funcionan todas las estructuras. Los ejemplos en código también fueron de mucha ayuda, dada la inexperiencia del autor en este tipo de entornos. 5.3 Carga Ficheros Luego cuando el panel visual estaba controlado, se paso a la primera parte de todo programa informático que es la obtención de los datos para pode trabajar. Al principio se hacia un simple recorrido por el fichero, se obtenían los puntos y luego se mostraban por pantalla, luego a medida que se fue avanzando, a parte de la lectura se requería que los puntos proporcionados vinieran en forma de contornos, para ello se tuvo que crear la clase Contorno, en la cual se guarda una lista de los puntos pertenecientes a cada uno de los contornos, así como también otros datos para poder realizar cálculos posteriores. La manera de ordenar estos puntos hace referencia al método explicado en el punto 4.6.3. 40 5.4 Visualización de Contornos Después de haber obtenido la lista de puntos ordenada por contornos, había que visualizarla en este caso había varias opciones. El entorno visual nos proporcionaba dos estructuras de datos ideales para hacer esta representación. Se trata de LineArray y LineStripArray, la primera funciona por pareja de puntos, ósea que traza una línea cada dos puntos, por lo que fue necesario pasarle siempre el punto anterior para que quedara una línea uniforme. En el caso del LineStripArray pudimos observar que la funcionalidad que ofrecía era exactamente la que antes se describe pero ya estaba implementada por la librería grafica con el fin de hacer más fácil la programación. Además luego de hacer esto se utilizo el algoritmo de Graham para obtener el mismo resultado pero con más eficiencia. 5.5 Triangulación Contornos Una vez teníamos los contornos teníamos que aplicar el método de Ganapthy a los mismos para poder obtener los triángulos. Para esta fase fueron necesarias bastantes horas de programación ya que las pruebas de estos algoritmos son básicamente visuales y numéricas, es decir el resultado ofrecido es un punto con sus tres coordenadas o es la representación de las mismas en el espacio 3D que es muy complicado de observar. En este punto se dio una restructuración del proyecto ya que se creó la clase Polígono que iba a ser la encargada de ejecutar los métodos de triangulación, por tanto contiene todos los datos necesarios para esto, una lista de contornos, puntos, triángulos etc. También fue necesaria la creación de la estructura Triangulo el cual contiene tres puntos en tres dimensiones, un vector normal, las capitales de la ecuación del plano que forma dicho triangulo y un booleano que nos indica si es cara positiva o negativa para posteriores comprobaciones. Luego se dio paso a la codificación del método de Ganapathy, donde encontramos unos cuantos problemas. Java3D tiene implementadas unas estructuras de datos que contienen los triángulos y a partir de ellos generan automáticamente la visión de este objeto construido a base de triángulos. Primero se intento utilizar la estructura TriangleStripArray que parecía la mas adecuada ya que como en el LineStripArray une el ultimo triangulo añadido al vector con el que se está añadiendo, pero esto ocasiono problemas a la hora de girar los triángulos. Entonces se decidió usar la TriangleArray que genera los triángulos uno a uno añadiendo de tres en tres puntos, con lo que el problema de cambiar el orden en que se añaden los triángulos tenía una solución trivial. Otro punto importante estaba en la actualización de una lista de nodos la cual contenía la información necesaria para posteriormente calcular la media de las normales como comentaba en el punto 4.6.1. 41 5.6 Visualización de Triángulos Luego de tener las estructuras de datos proporcionadas por Java3D bien inicializadas, solamente hace falta crear un BrachGroup, el cual contiene dentro un TransformGroup es propiamente al que se le agrega la figura. Primero hay que crear una estructura Shape3D a la cual se le pasa la TriangleStripArray genrada anteriormente, luego añadir esta al TransformGroup. Tambien se aplican al Tg las propiedades de escala, iluminación, niebla etc. Luego se compila el BrachGroup y entonces esta lista visualización del objeto. 5.7 Triangulación Puntos Una vez realizados todos los pasos anteriores, quedaba comparar la triangulación de Ganapathy con la de otro algoritmo que no simplificara tanto los puntos del objeto. Entonces se realizo la implementación de un paquete que contiene Delaunay, la dificultad de esta tarea estuvo en comprender que este algoritmo funciona en 2D y que nosotros necesitamos la proyección de nuestro modelado en 3D como se explica en el apartado 4.3.2, por esta razón también se tuvo que adaptar para que admitiera que la altura del objeto fuese cualquier coordenada x y z. A raíz de esto se han producido problemas que no se han podido resolver como el hecho de que haya figuras que no acaban de cerrar todas sus posiciones con triángulos. Se pensó en las soluciones para resolver el problema, las cuales pasan por tratar el objeto de manera en que se puedan detectar sus caras exteriores por cada una de las coordenadas y así aplicar el algoritmo a cada una, luego detectar los puntos de unión entre los objetos generados y aplicar un cierre de triángulos. 5.8 Obtención de las Caras Externas Como ya se ha comentado en el punto 4.6.3, cada vez que se genera una figura a partir de triángulos caemos en el problema de que estos estén orientados hacia adentro o hacia el exterior de la figura. Este problema se soluciono aplicando la teoría presentada en el apartado antes mencionado, pero surgió otro problema, si la figura fuese de contornos no cerrados, es decir que no formara un polígono cosa que se origina aplicando Delaunay, esta solución no funciona correctamente, ya que la comprobación de un triangulo se realiza con triángulos ubicados en el lado contrario, en este caso dichos triángulos no se encuentran en la posición adecuada. Por lo que entonces se planteo que la solución sería calcular el centro del objeto algo que no es trivial, porque depende de la situación en que se encuentren los puntos que forman al mismo. 42 5.9 Creación de la GUI Este fue uno de los pasos más fáciles como en casi todos los programas. Se ha creado una GUI fácil de usar intuitiva que contiene básicamente las opciones básicas de visualización en 3D. Fue realizada en netBeans y adaptada para poder pasar a Eclipse e integrarla con el programa ya acabado. 5.10 Guardado Datos Luego de hacer la GUI, se hicieron los últimos retoques para que el proyecto tuviera un poco más de usabilidad, como por ejemplo el guardado de la figura que se estuviera visualizado, esto se realiza mediante la creación de una estructura que encapsula un punto3D y que guarda en qué posición de la lista se encuentra. Así a la hora de construir un triangulo sabemos en posición de la lista esta cada punto. Por consiguiente si queremos guardar el esta de los triángulos, lo único que tenemos que hacer es guardar la lista de puntos intacta sin hacer ningún cambio y luego consultar la lista de triángulos uno a uno para imprimir los índices en que se encuentra cada uno de los puntos. 5.11 Carga de Datos Ya tenemos el fichero con sus datos, la manera de leerlo será muy sencilla, ya que cuando empezamos a escribir los triángulos dejamos una marca, para que a la hora de leer sea más sencillo identificar a partir de donde están definidos los triángulos. Primero cargamos la lista de puntos, y luego simplemente ensamblamos los triángulos a partir de los índices proporcionados por el fichero. 43 6. Evaluación El análisis de los resultados de este proyecto se realiza a partir de la observación de algunos modelos. Primero vamos a enseñar la figura que usamos como phantom y luego mostraremos algunas figuras un poco más complejas. Seguidamente se hará el análisis de resultados y sus conclusiones. 6.1 Phantom En la Figura 29 podemos observar lo que sería una colección de puntos simplificada del un modelo creado a partir de computación geométrica. Figura 29. Estado Inicial 44 Aplicando el algoritmo de Ganapathy obtenemos la triangulación de la Figura 30 Figura 30. Triangulado Por último en la Figura 31 podemos apreciar la figura con la iluminación aplicada. Figura 31. Iluminación 45 6.2 Ruinas Podemos observar en la Figura 32 la estructura de puntos de una ruina creada a partir de un modelo computado. Figura 32. Puntos Ruina En la Figura 33 podemos observar el modelo triangulado por Delaunay. Figura 33. Triángulos Ruina Delaunay 46 En la Figura 34 podemos observar el modelo triangulado por Ganapathy. Figura 34. Triángulos Ruina Ganapathy Por último en la Figura 35 encontramos el modelo con iluminación aplicada. Figura 35. Iluminación Ruina 47 6.3 Forma 1 En este se ha tomado un fichero de puntos de una figura real, analizada con un escáner de rayos. La figura original la podemos aprecia en la Figura 36. Figura 36. Figura real La triangulación de Delaunay es la que se encuentra en la imagen que se muestra en la Figura 37. La triangulación por Ganapathy se encuentra en la imagen que muestra la Figura 38. Figura 37. Triangulación Delaunay 48 Figura 38. Triangulación Ganapathy 49 6.4 Forma 2 Igual que en el apartado anterior presentamos un ejemplo real y sus respectivas triangulaciones. La foto de la figura es la Figura 39 y sus respectivas triangulaciones de Delaunay y Ganapathy son la Figura 40 y 41. Figura 39. Ejemplo Real Cilindro 50 Figura 40. Triangulación Delaunay Figura 41. Triangulación Ganapathy 51 6.5 Forma 3 Seguimos analizando figuras reales con nuestros dos algoritmos, en el orden Figura 42 forma real, Delaunay Figura 43, Ganapathy Figura 44. Figura 42. Figura Real Figura 43. Triangulación Delaunay 52 Figura 44. Triangulación Ganapathy 6.6 Forma 4 Por último presentamos la última reproducción de un objeto real en la Figura 45 y sus triangulaciones Figura 46 y Figura 47. Figura 45. Figura real 53 Figura 46. Triangulación Delaunay Figura 47. Triangulación Ganapathy 54 6.7 Análisis de Resultados A continuación se presenta los resultados numéricos obtenidos en todas las pruebas realizadas para poder realizar la comparación entre un algoritmo y otro. Los resultados vienen dados por los Puntos Originales de cada una de las piezas trianguladas, los Puntos que se obtienen después de triangular y el número de triángulos. También se incluyen el porcentaje de simplificación y calidad para poder hacer comparaciones entre los dos algoritmos. El porcentaje de simplificación indica el número de puntos perdidos durante la simplificación y el porcentaje de calidad indica justamente lo contrario, el número de puntos que cumplen con los iníciales. La calidad en este caso es medida como la cantidad de parecido a los puntos reales que tiene la triangulación. La Figura 48 contiene los resultados pertenecientes al algoritmo de Delaunay. Puntos Modelo Originales Phantom 7855 Ruina 5226 Forma1 450 Forma2 550 Forma3 450 Forma4 900 Puntos Obtenidos 4310 1414 450 550 450 900 Triángulos Obtenidos 8492 2732 786 993 786 1605 Porcentaje de simplificación 45,13 72,94 0,00 0,00 0,00 0,00 Porcentaje de calidad 54,86950987 27,05702258 100 100 100 100 9000 8000 7000 6000 5000 4000 Puntos Originales 3000 Puntos Obtenidos 2000 Triangulos Obtenidos 1000 0 Figura 48. Resultados Delaunay 55 La Figura 49 contiene los resultados pertenecientes al algoritmo de Ganapathy. Puntos Modelo Originales Phantom 7855 Ruina 5226 Forma1 450 Forma2 550 Forma3 450 Forma4 900 Puntos Obtenidos 2007 381 84 99 93 211 Triángulos Obtenidos 4035 766 140 174 159 398 Porcentaje de simplificación 74,45 92,71 81,33 82,00 79,33 76,56 Porcentaje de cailidad 25,55060471 7,290470723 18,66666667 18 20,66666667 23,44444444 9000 8000 7000 6000 5000 4000 Puntos Originales 3000 Puntos Obtenidos 2000 Triangulos Obtenidos 1000 0 Figura 49. Resultados Ganapathy 56 Una vez realizada la recogida de resultados se procede a la comparación de los mismos, para ello nos ayudamos con el grafico de la Figura 50. 120,00 100,00 80,00 Porcentaje Simplificación Ganapathy 60,00 Porcentaje Calidad Ganapathy 40,00 Porcentaje Simplificación Delaunay Porcentaje Calidad Delaunay 20,00 0,00 Figura 50. Comparativa Resultados En grafico podemos ver que los porcentajes de simplificación en general del algoritmo de Ganapathy son bastante más elevados y constantes que los proporcionados por Delaunay, pero como también podemos observar la pérdida de calidad aplicando Ganapathy es bastante amplia en comparación con los resultados obtenidos por Delaunay. Por lo tanto se concluye que cada una de los algoritmos se utilizara en función de los requerimientos, si lo que se necesita es una figura aproximada a la realidad y que no necesite muchos recursos se utilizará Ganapathy. Pero por el contrario si lo que de necesita es una figura con el máximo de detalles posible sin importar el coste se utilizara Delaunay. 57 7. Conclusiones Una de las conclusiones seria que el mundo de la reconstrucción en tres dimensiones, a partir de nubes de puntos, es bastante complicado y extenso. Con lo cual la solución dada por este proyecto parece ínfima ante la cantidad de información y problemas que se pueden llegar a tratar relacionados con este tema. No obstante se ha ofrecido de una manera sencilla y clara una solución al problema presentado. Por otro lado y basándonos puramente en los colindares del proyecto, podemos decir que el objetivo de conseguir una clara comparación entre dos maneras de entender el problema planteado ha sido conseguido con éxito. Con lo que surgen dos conclusiones más, que no son más que la explicación de para que se debe utilizar cada una de las soluciones propuestas. En el caso de los contornos podemos concluir, que será una solución muy ágil, rápida y que simplifica muy bien la figura con la que vamos a tratar, siempre y cuando los puntos de nuestra nube vengan dados en forma de contornos, es decir que tres puntos como mínimo compartan siempre un plano, ya que si no sería imposible de aplicar esta solución. En el otro caso podemos decir que es una solución muy válida y que refleja de una manera lo más realista posible lo que se quiere representar con la figura obtenida a partir de los puntos. El problema está en que este método estaba pensado para una triangulación de puntos que vienen todos en 2D como los de la superficie de un terreno, entonces es cuando esta triangulación se complica ya que hay que aplicar métodos bastante difíciles para obtener la triangulación completa en 3D. Para comparar estos algoritmos solo hace falta ver la manera en que se ejecutan, cuanta información llegan a tratar y cuanto tiempo tardan en hacerlo. Por ejemplo el problema de los contornos funciona más rápidamente, ya que al aplicar la ordenación de los puntos y construir el cierre convexo se eliminan el 60% de los puntos, cosa que hace que seguidamente en la triangulación no hagan falta tantas vueltas de CPU, pero sin embargo en este problema se ofrece la realidad de una manera muy vaga debido a la perdida de información. El caso de Delaunay tarda bastante más porque trata con el 100% de la información dada y porque la estructura interna del algoritmo función a base de fuerza, es decir prueba y error, en cambio y a diferencia de Ganapathy ofrece la realidad tal y como es sin ningún tipo de reducción de calidad. Po lo tanto si lo que se quiere es una vista rápida de un objeto en tres dimensiones es preferible usar la solución de los contornos, pero por el contrario si lo que se desea es precisión a la hora de visualizar los datos, es mejor usar la triangulación directa de todos los puntos sin simplificar. A este se le pueden añadir muchas otras conclusiones como, si lo que se desea es un sistema compatible con móviles y que pueda ser reproducido fácilmente desde una navegador web es mejor utilizar una versión simplificada del objeto, ya que estos dispositivos no poseen la suficiente potencia de cálculo como para dar un tiempo de respuesta adecuado. 58 8. Recursos Utilizados Para la realización del proyecto se han utilizado básicamente apuntes y algunas páginas web como ayuda. A continuación se presenta una lista: A New General Triangulation Method for Planar Contours - S.Ganapathy Visualitzacio de Dades en 2 i 3 Dimensions - Maria Ferré Bergadà - URV Elements Bàsics en la Representació Gràfica - Maria Ferré Bergadà - URV Envolupant Convexa - Vera Sacristan - UPC Triangulacions de Núvols de Punts - Vera Sacristan - UPC Computer Graphics Using Java 2D and 3D - Hong Zhang -Atlantic State University The Java 3D API Specification - Sun Microsystems http://www.elai.upm.es/spain/Investiga/GCII/personal/lrodriguez/web3D/ http://gts.sourceforge.net/samples.html http://www.java3d.org/ Para el desarrollo del proyecto en la parte de software se ha utilizado básicamente el editor Eclipse y para la realización de la GUI el Net Beans. En la parte de hardware se ha utilizado un portátil genérico. 59 9. Manual Este apartado se subdivide en dos partes el manual de usuario y el de administrador, a continuación se presentan los dos tipos de manuales. 9.1 Manual del Usuario Como en todos los manuales en este se explicara cómo hacer que la aplicación funcione y como aprovechar al máximo sus prestaciones. Una vez tenemos la aplicación en ejecución nos encontramos un menú donde hay una seria de opciones, si hacemos clic en la primera Archivo se despliega un menú contextual donde podremos elegir varias opciones como se expresa en la Figura 51. Figura 51. Archivo Tenemos cuatro opciones Guardar que en el estado inicial no está permitido ya que no existe ningún modelo en el área de dibujo, Cargar que se encarga de almacenar en memoria todos los puntos provenientes del fichero indicado, Leer que importa un fichero .triángulos para así no tener que realizar toda la triangulación y salir que es evidente. 60 El siguiente paso sería el de cargar un modelo, inmediatamente después de cargarlo nos aparece por la Consola el número de puntos que posee el modelo como podemos ver en la Figura 52. Figura 52. Carga modelo Luego nos encontramos en situación de poder hacer la primera triangulación, para ello nos vamos al menú triangulación y escogeremos una de las dos opciones en este y para este manual escogeremos Ganapathy, una vez escogida la triangulación el programa responde con el cálculo on-line de dicha triangulación y seguidamente la muestra por la zona de pintado negra como podemos observar en la Figura 53. Figura 53. Archivo cargado 61 Una vez hecho esto tenemos todas las opciones que se encuentran en la parte inferior de la interfaz de usuario. Altura es un parámetro que se debe utilizar antes de la triangulación ya que determina porque eje va a triangular el algoritmo elegido. El modo hace referencia a la manera en que se muestra la figura por puntos, líneas, el poligo cerrado o se debe de rotar, un ejemplo en la Figura 54 y Figura 55. . Figura 54. Puntos Figura 55. Polígono 62 También está el menú de coloreado, que muestra la figura de color Único que sería blanco, color Fondo que es el verde y si se quiere más realismo se selecciona Iluminación como se puede ver en la Figura 56. Figura 56. Polígono con iluminación Una vez hecho esto podemos guardar el modelo triangulado con el botón de Archivo-Guardar o si no podemos borrar toda la escena para volver a cargar otra con el botón Borrar. Luego de haber guardado el modelo podemos hacer Archivo-Leer seleccionamos una archivo .triángulos y automáticamente tendremos la figura antes guardada visualizándose por la pantalla. Existe también otro submenú llamado visualización en cual encontramos las opciones Modelo y contornos. Estas opciones hacen referencia a lo que se ve por pantalla, en el caso de haber triangulado por Ganapathy tendremos disponible también la visualización de los contornos relativos a la figura. 63 9.2 Manual del Administrador 9.2.1 Recursos Necesarios En esta sección hablaremos de lo que hace falta, para que esta aplicación funcione correctamente, es decir que características tiene que tener nuestro ordenador para poder ejecutar el programa. Las especificaciones mínimas recomendadas por la librería grafica son las siguientes: • • • 500Mhz de frecuencia del procesador principal. Una tarjeta grafica dedicada con al menos 16MB de memoria. Tiene que incluir compatibilidad adecuada con OpenGl, cosa que hoy en día cualquier tarjeta grafica cumple. 128MB de RAM en el sistema. Ahora bien estas especificaciones se refieren solo al visualizador en tres dimensiones, no incluye la memoria gastada por los cálculos realizados para obtener la malla de triángulos. Para poder hacernos una idea de que recursos vamos a necesitar, tendremos que contar con los gastos incluso del sistema operativo, basándonos en el ordenador donde se ha realizado las pruebas. Hoy en día un sistema operativo común “Windows Vista”, consume alrededor de 1GB de memoria RAM sin utilizar ningún programa. Con este dato y con los requerimientos mínimos del visualizador obtenemos que se necesitan 1128MB. Pero en este cálculo aun falta por incluir lo que consume el resto de la aplicación, a continuación se realiza un cálculo estimado del consumo de memoria de la aplicación. Si contamos que consume unos 80MB en estado inicial es decir sin ningún modelo cargado, y además contamos que cuando ejecutamos el algoritmo más pesado Delaunay consume 261MB más desde el momento de ejecución del algoritmo hasta la visualización. Cabe destacar que estos cálculos se han realizado con el modelo phantom el cual contiene unos 7855 puntos, mientras mas puntos se tengan mayor será la exigencia de memoria del programa. En conclusión estamos hablando de que la maquina necesita 1,5 GB de memoria RAM para poder optar a una figura como esta, que es considerada bastante pequeña. El consumo absoluto para este caso sería 469MB. Este programa también da la posibilidad de cargar varios modelos a la vez, por lo que si cargáramos unas cuantas figuras como este necesitaríamos una maquina bastante actual para poder hacerlo todo con suavidad. Hablando de la memoria surge el tema de la memoria asignada a la maquina virtual, la cual tiene por defecto 128MB de RAM asignados, lo cual quiere decir que el programa no funcionaria, ya que podríamos arrancarlo pero a lo hora de ejecutar cualquiera de los 2 algoritmos de triangulación encontraríamos que salta una 64 excepción donde la maquina virtual nos informad de la memoria ha sido excedida. Para esto java incluye una opción de ejecución, con la que le podemos decir a la maquina virtual cuanta memoria tendrá que reservar para que el programa funcione con normalidad. El comando es –Xmx1024m donde 1024 es la cantidad de memoria que se quiere asignar. En este caso se ha decido asignar esta cantidad para así no tener ningún tipo de problema a la hora de cargar varios modelos a la vez. Hay que recordar que si se quieren varias instancias del programa abiertas cada uno de ellos reservara una cantidad de 1GB de memoria, por lo que depende de la maquina solo nos permitirá un par de instancias como máximo. 9.2.2 Instalación Para hacer la instalación del programa basta con ejecutar el archivo .jar proporcionado, o también está la opción de ejecutar a través de un .bat que también ha sido incluido en la entrega digital, caso de sea otro sistema operativo como por ejemplo cualquiera de los provenientes de UNIX se tendrá que hacer la ejecución a través de una consola empleando línea de comandos. Dicha instalación es tan sencilla porque trabajamos con java, que como comentábamos en la parte de diseño, es un lenguaje parcialmente interpretado. Casi todos los lenguajes de este tipo se ejecutan sobre una maquina virtual. Dicha maquina funciona a modo de un pequeño sistema operativo que solo entiende de programas escritos en java. De ahí que el mismo programa funcione en tantos dispositivos diferentes sin necesidad de hacer copias especializadas en uno u otro sistema operativo general. Un fichero .jar es una compresión de un conjunto de ficheros .java llamados clases, para la maquina virtual de java estos ficheros comprimidos son como para un sistema operativo lo que sería un archivo .exe un ejecutable común, que igual que el jar contiene toda la lógica de aplicación. Un fichero .bat es un fichero que contiene un conjunto de comandos de la consola de Windows, con estos .bat lo que se consigue es poder hacer la compilación del programa con tan solo tener los ficheros base, es decir los .java. Para la ejecución por líneas de comandos también se suelen utilizar .bat ya que las llamadas para ejecutar un programa en java suelen contener muchos paquetes. Esto paquetes no son más que una agrupación ce clases para poder obtener una mejor estructuración del código fuente. Para un sistema operativo diferente como por ejemplo cualquiera que sea proveniente de UNIX, podemos también crear un script que se encargue de ejecutar los comandos necesarios. Evidentemente todos estos procesos necesitan que antes haya sido instalada la maquina virtual de java, para ello tenemos la web oficial desde donde podemos descargarla específica para casi cualquier sistema operativo. La dirección web es http://www.java.com/es/download/index.jsp que se muestra también en la Figura 57. 65 Figura 57. Maquina Virtual Si lo que queremos es ejecutar el fichero .bat para compilar el código antes de ejecutarlo, necesitaremos también el JDK que es el kit de desarrollo de java. Para conseguirlo también podemos entrar a la siguiente web y seguir los pasos, que incluyen cambiar variables de entorno de nuestro sistema operativo, la Figura 58 muestra la dirección web http://java.sun.com/javase/downloads/index.jsp y que JDK se debe de elejir. Figura 58. JDK 66 También se proporciona en formato digital un fichero .zip que contiene los ficheros del proyecto creado por eclipse. Para poder cargar estos ficheros en eclipse es necesario seguir los siguientes pasos exactamente: i. ii. Abrir eclipse Una vez abierto seleccionar de la barra la opción file y luego import tal y como se muestra en la Figura 59. Figura 59. Eclipse Import iii. Luego en el wizard seleccionar en la carpeta General la opción Archive File como se muestra en la Figura 60. Figura 60. Import 67 iv. Una vez hecho esto nos aparecerá otra ventana con el selector del proyecto guardado en .zip y luego en que proyecto queremos depositarlo, evidentemente antes de hacer esto tendremos que haber creado un proyecto vacio, un ejemplo de ello lo vemos en la Figura 61. Figura 61. Import Con esto tendríamos el proyecto cargado en eclipse, a partir de aquí podemos hacer ejecutar el código con el botón run con el tipo icono de la flecha. También hay que decir que eclipse es un entorno de desarrollo que se encarga de revisar la sintaxis continuamente y la compilación la realiza en el momento antes de ejecutar el programa. 68 9.2.1 Manipulación de Ficheros Como ya se explico en el apartado 4.6 la información tratada por este programa viene dada en forma de ficheros, se han creado dos tipos de ficheros los de entrada .puntos y los de salida .triángulos. Esta terminaciones son solamente identificativas podemos utilizar cualquier fichero .txt para cargar sus datos en la aplicación, siempre que posea la estructura comentada en el punto mencionado. Hay que decir que puede que los ficheros de puntos pueden variar en función de los programas que los crean, por ejemplo los puntos de nuestro programa viene cada uno en una línea, pero también existen modelos donde los puntos se separan por comas y caben muchos más por línea. También hay que recordar que si las estructuras de ficheros no son las adecuadas el programa podría presentar respuestas inesperadas. Por ejemplo un fichero .triángulos que contenga el carácter centinela T para delimitar donde empiezan los triángulos solo leería puntos. 69 10.Agradecimientos Para finalizar recordar a todas las personas que han hecho posible la realización y culminación de este proyecto con buen pie. He contando con un grupo de personas que son a mi manera de ver inigualables, que son, mis padres, hermana, la tutora, los amigos, otros profesores que han sido de mucha ayuda y a ti cariño por estar ahí siempre. Gracias a todos ellos por su comprensión y gran valía, Gracias... 70