República de Venezuela Universidad del Zulia Facultad de Arquitectura y Diseño División de Estudios para Graduados
Trabajo de Ascenso
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones. Trabajo de Ascenso para optar a la categoría de profesor titular.
Autor:
Arquitecto Iván Burgos Peña, Mg.Sc. Computación Aplicada (Ing.L.U.Z. 1989) Profesor Asociado, Dedicación Exclusiva.
Maracaibo – Venezuela
Septiembre 1999
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
iii
Indice General Contenido Indice General Indice de Gráficos Indice de Tablas Agradecimientos Aprobación del Jurado Resumen Abstract Introducción Capitulo I . El Problema 1.1 Planteamiento y Justificación de la Investigación 1.2 Objetivos 1.2.1 Objetivos Generales 1.2.2 Objetivos Específicos Capitulo II . Marco Teórico 2.1 Antecedentes 2.2 Realidad Virtual 2.3 Cabina Virtual 2.3.1 Proyectores y Espejos de Retroproyección 2.3.2 Lentes de Visión Estereoscópica 2.3.3 Emisores de Señal Estereo 2.3.4 Control Manual (Wand) 2.3.5 Sistema de Rastreo (Trackers) 2.3.6 Sistema de Sonido Surround 2.3.7 Estaciones de Trabajo 2.4 Disposiciones Espaciales con el Hipergrafo en Ambientes Sintéticos 2.5 Retícula Isoespacial Extendida 2.6 Unidades Básicas Capitulo III . Marco Metodológico 3.1 Población 3.2 Tipo de Investigación 3.3 Diseño de la Investigación Capitulo IV. El Modelo Gráfico en un Ambiente Inmersivo 4.1 Generación del Modelo Virtual 4.1.1 Programación de Espacios 4.1.2 Vínculos Espacios-Unidades Básicas 4.1.3 Matriz de Asociación 4.1.4 Matriz de Interrelación Espacial 4.2 Algoritmo de Graficación 4.3 Aplicación de la Reticula Isoespacial Extendida 4.4 Menúes Virtuales 4.5 Algoritmo de edición del Hipergrafo 4.5.1 Abstracción y Expansión 4.5.2 Sustituciones de Vértices por Unidades Básicas Tridimensionales 4.6 Almacenamiento de Coordenadas de los Elementos del Hipergrafo 4.7 Memoria Descriptiva (Shared Memory) 4.8 Acercamiento a plantas definitivas Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
Pagina iii v vi vii viii ix x 12 14 15 17 17 17 18 19 19 21 24 25 25 25 25 26 26 26 27 28 30 31 31 31 33 34 36 36 38 39 40 41 42 43 44 45 47 47 47
iv
Capitulo V. Ejemplo de un Caso Específico 5.1 Metodología de Trabajo 5.1.1 Unidades Básicas 5.1.2 Matrices de Interrelaciones Espaciales 5.2 Graficación 5.3 Sustitución 5.4 Aproximación de Plantas Definitivas 5.5 Iconografía de los Menúes Virtuales Capitulo VI. Programas de Aplicación y Equipos Utilizados 6.1 Estructura General del Programa 6.2 Hardware 6.3 Software 6.4 Listado de los Programas: Programa main.C Programa order.C Programa perfm.C Conclusiones y Recomendaciones Conclusiones y Recomendaciones Bibliografía Marcas Registradas
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
48 49 49 50 53 54 55 56 60 61 61 62 62 62 64 85 107 108 110 111
v
Indice de Gráficos. Gráfico No. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Titulo Equipos de la R.V. La Cabina (CAVE) Lentes de vision estereoscopica Cascos Visores BOOM Sistema Coordenado de la Cabina Sistema de Proyeccion Inmersivo de la Cabina Trackers Retícula Cartesiana El arreglo Dodecaedro Reticula Isoespacial Extendida Multiplanar Planta Reticula Isoespacial Extendida Esquema Entrada de Datos Esquema Proceso de Graficación del Hipergrafo Ejemplo de Ficha Programación de Espacios Ejemplo de Ficha Matriz de Asociación de Espacios Ejemplo de Ficha Matriz de Interrelación Ejemplo de Menú Virtual Esquema de Menú Virtual Propuesto. Aplicación de la operación de Abstracción Aplicación de la operación de Sustitución de Vértices por Unidades Básicas Unidad Básica generada por Multigen II Unidad Básica Generada en la Cabina Hipergrafo inicial en la Cabina Hipergrafo Editado Abstracción Sustitución Vértices/Unidades Básicas Aproximación a Plantas Definitivas Aproximación a Plantas Definitivas Aproximación a Plantas Definitivas Aproximación a Plantas Definitivas
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
Pagina 21 21 22 23 23 23 24 25 27 28 28 28 34 35 37 38 39 42 43 44 46 49 50 53 54 54 54 55 55 56 56
vi
Indice de Tablas. Tabla No. 01 02 03
Titulo Matriz de Relación sin Valoración Relación muchos a uno entre vértices y Unidades Básicas Iconografía de los Menúes Virtuales
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
Pagina 51 55 56,57,58,59
vii
AGRADECIMIENTOS
A Brian Aldiss, John Mantley y Dan Morgan, que a través de sus obras de ciencia-ficción me han enseñado a no perder la ingenuidad del conocimiento. Al
maestro
Gonzalo
Vélez,
por
sus
pertinentes orientaciones y su inagotable visión de futuro. A mi familia, que entre otras cosas me ha dado, paciencia y más paciencia. A la vida.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
viii
El presente jurado aprueba este trabajo de ascenso titulado : Hipergrafos en Ambientes
Sintéticos para la Disposición Espacial de Edificaciones, que el Profesor Iván Vladimir Burgos Peña presenta al Consejo de Facultad de la Facultad de Arquitectura y Diseño, cumpliendo con los requisitos señalados en el artículo 89 de la Ley de Universidades y artículo
25 de
la Reforma
Parcial
del
Reglamento del Personal Docente y de Investigación de la Universidad del Zulia, para optar a la categoría de Profesor Titular.
Maracaibo,
/
/1999.
Jurado:
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
ix
RESUMEN Burgos, Iván. “Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones ”. Trabajo de Ascenso a Profesor Titular, Maracaibo-Venezuela, La Universidad del Zulia, Facultad de Arquitectura y Diseño, División de Estudios para Graduados. 1999, 111. Este trabajo es la continuación de una serie de publicaciones que se han venido desarrollando en la División de Estudios para Graduados de la Facultad de Arquitectura y Diseño de La Universidad del Zulia (L.U.Z.), dentro de las Lineas de Investigación de Métodos de Diseño del Instituto de Investigaciones de la misma facultad; sobre la utilización de los hipergrafos estructurados como herramienta de diseño y la disposición espacial de edificaciones, como una propuesta metodológica en respuesta a los nuevos paradigmas del diseño, usando el computador como poderoso aliado y partiendo del diseño inicial de las Unidades Básicas, como elementos primarios del diseño y su posterior disposición espacial en ambientes sintéticos de tipo inmersivo, por lo que, se ha extendido este método propuesto y su aplicación a la incorporación de la C2 (Cabina Generadora de Ambientes Sintéticos-CAVE2) en el Iowa Center Emerging and ManufacturingTechnology (ICEMT) en el Laboratorio de Ambientes Sintéticos (SELAB) de la Iowa State University en Ames, Iowa, USA. El método propuesto genera una disposición espacial automatizada de los elementos involucrados y su modelo gráfico tridimensional. Se han añadido al proyecto, el concepto de Retícula Isoespacial Extendida y fundamentos de los Algoritmos Evolutivos del Sistema Lindenmayer
Palabras Claves: hipergrafos, abstracción, expansión, realidad virtual, ambientes sintéticos, retícula isoespacial extendida, macrovérices, unidades básicas.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
x
ABSTRACT Burgos, Iván. “Hypergraphs in Synthetic Environments for Spatial Disposition on Buildings”. Work for promotion to Titular Professor, Maracaibo-Venezuela, La Universidad del Zulia, School of Architecture and Design, Graduate Studies Division. 1999, 111. This research is an extension of a series of publications developed in Graduate Studies Division, School of Architecture and Design from University of Zulia, Maracaibo-Venezuela, about Structured Hypergraphs as Design Tool and Spatial Disposition on Buildings. This work is a methodological proposal to a request for new design paradigms, using computers as a powerful allied. Starting from initial design of Basic Units, as primary elements and their use in spatial disposition in inmersive synthetic environments, working with the CAVE2 in the Iowa Center Emerging and Manufacturing Technology (ICEMT) at Synthetic Environments Laboratory (SELAB) in Iowa State University at Ames, Iowa. With this design method is possible to get a automatic initial disposition of the hypergraph and its tridimensional graphic model. At the same time are included to this project, concepts as Expanded Isospatial Grid and some principles of Evolutionary Algorithms of Lindenmayer System. Keywords: hypergraphs, abstraction, refinement, virtual reality, synthetic environments, expanded isospatial grid, macrovertex, basic units.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
INTRODUCCION
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
INTRODUCCION Con la ejecución de esta investigación se pretende, introducir una metodología de trabajo ba sada en un modelo gráfico tridimensional con fundamentos en el hipergrafo e hipergrafo estructurado, para enfrentar los retos de los nuevos paradigmas de diseño y disposición espacial de edificaciones, con el uso de computador como un aliado en el manejo de variables complejas en un ambiente inmersivo, multisensorial e interactivo como lo es la tecnología de la Realidad Virtual.
El modelo gráfico propuesto posee antecedentes pero en medios de proyección bidimensional, siendo en esta investigación, cuando se plantea por vez primera, el uso de sistemas proyectivos inmersivos, el cual es el ambiente natural de trabajo para cualquier diseñador.
Se utilizan además de la información de entrada necesaria para la generación del hipergrafo tridimensional, con el uso de menúes virtuales, las operaciones propias del hipergrafo como son, abstracción y expansión. También se incorporan la sustitución de vértices ó esferas por los elementos reticulados tridimensionales ó Unidades Básicas y el cambio a voluntad de sus proporciones y dimensiones.
En el primer capitulo se describen la justificación, objetivos generales y específicos de esta investigación. Luego, en el capitulo segundo, se define el contexto del trabajo, conceptos básicos y elementos de la tecnología utilizada en la generación del hipergrafo. El tercer capítulo establece el marco metodológico para el desarrollo de la investigación y las actividades contempladas. Sigue el cuarto capítulo con las caraterísticas del modelo gráfico en ambiente inmersivo, operaciones, ingresos de datos de entrada, algunos algoritmos en seudocódigos y explicaciones de la incorporación de algunos elementos como son los menúes virtuales y la reticula isoespacial extendida.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
13
El quinto capítulo, presenta la aplicación del modelo propuesto a un caso específico como ejemplo ilustrativo del potencial de la herramienta gráfica propuesta y su complementación en un ambiente inmersivo. En el sexto capítulo se presentan los programas elaborados integramente por el autor del presente trabajo, basados en los algoritmos de graficación desarrollados por Burgos-Alonzo [2] y sus listados en lenguaje C++, así como los equipos requeridos en la cabina de proyección inmersiva (CAVE2). Finalmente se incluyen las conclusiones y recomendaciones derivadas de esta investigación. Conjuntamente se anexa un video en formato VHS de la aplicación en ambiente inmersivo con ejemplos concretos, que nos permiten la visualización y mejor comprensión de la investigación planteada.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO I. EL PROBLEMA
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
EL PROBLEMA
1.1 PLANTEAMIENTO Y JUSTIFICACION DE LA INVESTIGACION La necesidad de implantar nuevos métodos de diseño en la era actual en donde la superautopista de la información conecta a diferentes usuarios diseñadores de diferentes puntos de la aldea global de manera instantánea y posibilita el diseño participativo en linea (¿rearquitectura?) y donde dia a dia los requerimientos de respuestas rápidas, confiables, actualizadas y detalladas, a problemas específicos del quehacer arquitectónico, nos plantean nuevos paradigmas del diseño y revisión de los actuales esquemas, en donde el problema del preconcepto, lleva a dar respuestas de diseño viciadas desde su inicio, sin proveernos de decisiones neutras que puedan generar realmente una verdadera respuesta original al problema planteado. Los programas Computarizados Asistentes al Diseño (CAD) para arquitectura que actualmente existen en el mercado tienden a ser graficadores y visualizadores, en lugar de convertirse en verdaderos asistentes y ayudas, en reales tomas de decisiones, sobre todo en la disposición de elementos tridimensionales en el espacio. La razón para ello es muy simple, el mercado de arquitectos, potenciales compradores de programas de computadoras a nivel mundial representa un porcentaje muy pequeño para invertir en algo de tal magnitud que amerita la inversión en costos de muchas horas-hombre de trabajo e investigación en lugares especializados. Las alternativas a tal situación la pueden ofrecer las universidades y centros de investigación que, sin tener ese tipo de prejuicio monetario, justificable o nó, estan en posibilidades de dar el tipo de herramienta necesaria para el diseño arquitectónico en el nuevo milenio.
Es por ello que en la División de Estudios para Graduados de la Facultad de Arquitectura y Diseño de La Universidad del Zulia (L.U.Z.), se vienen realizando desde el año 1994, una serie de trabajos, a nivel de seminarios y trabajos especiales de grado, una propuesta por Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
16
etapas, de un método de diseño arquitectónico, basado en un auténtico programa Computarizado Asistente al Diseño (CAD).
Dicha propuesta se ha planteado en diversas plataformas computacionales, lenguajes de programación y programas graficadores, hasta llegar al presente trabajo, el cual en una etapa de madurez de la propuesta inicial, se dispone luego de este nivel, pasar al siguiente punto, el cierre del ciclo con los algoritmos genéticos aplicados al diseño arquitectónico en la disposición espacial de edificaciones; partiendo siempre del fundamento de las Unidades Básicas y la generación de una biblioteca digital contentiva de las mismas para su posterior reutilización.
El método propuesto es justificable para proyectos de gran magnitud y complejidad, su uso en proyectos de menor envergadura es irrelevante, ejemplos ideales para este método serían Hospitales, Aeropuertos, Centros de Investigación y/o Docencia, Hoteles y otros proyectos que requieren de un nivel de información abundante y en donde las intrincadas relaciones interespaciales, son de vital importancia para el adecuado funcionamiento del edificio.
Lo más interesante de esta propuesta es la capacidad de manipulación del hipergrafo en un ambiente sintético de las siguientes características: inmersivo, interactivo, multisensorial y altamente gráfico, siendo este tipo de ambiente, el medio natural de trabajo del diseñador. Debiéndose agregar que este planteamiento cubre aspectos metodológicos del diseño en arquitectura, computación gráfica, teoria de grafos e hipergrafos, algoritmos de graficación en ambientes inmersivos y manejo y manipulación de rutinas en ambientes sintéticos.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
17
1.2 OBJETIVOS 1.2.1. Generales Desarrollo de un modelo gráfico que permita la representación del hipergrafo y sus relaciones en un ambiente inmersivo (Realidad Virtual) y su utilidad como herramienta en el método para la disposición espacial de edificaciones.
1.2.2. Específicos.
Evaluar la aplicabilidad en un ambiente inmersivo del hipergrafo como herramienta para la disposición espacial de edificaciones.
Desarrollar una metodología de trabajo para el uso de la teoria del hipergrafo como Método de Diseño Arquitectónico.
Desarrollar los Algoritmos para la generación de las Bases de Datos para la representación gráfica.
Desarrollar los algoritmos que permitan la manipulación del hipergrafo en Ambientes Inmersivos.
Desarrollar los Menúes Virtuales para la Cabina Virtual (CAVE2).
Generar el programa en lenguaje C++ y la inclusión de librerias precompiladas para el manejo en la Cabina Virtual.
Aplicar el modelo a un caso concreto.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO II. MARCO TEORICO
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
MARCO TEORICO
2.1 ANTECEDENTES.Los antecedentes a este trabajo han sido todos aquellos elaborados en la División de Estudios para Graduados de la Facultad de Arquitectura y Diseño de la Universidad del Zulia en los Programas de Informática Nivel Maestría, adscritos a las Líneas de Investigación vigentes enmarcandose dentro de Métodos de Diseño Arquitectónico del Instituto de Investigaciones (IFA) de la misma facultad, los trabajos en cuestión son:
“El Módelo Gráfico Tridimensional para la Representación del Hipergráfo Estructurado en el proceso de Diseño en Arquitectura-Aplicación en un caso específico”. por Iván BurgosIván Szentpaly. [1]
“Módelo Gráfico Tridimensional para la Representación del Hipergráfo Estructurado”. por Iván Burgos-Sonia Alonzo. [2]
“Métodos de Diseño y Teoria de Hipergráfos en el Diseño”. por Iván Burgos-Cecilia Naranjo-Giles Kinsley. [3]
También relacionado con el mismo tema, se puede accesar en INTERNET a:
“Hypergraphs and Architecture” (en Inglés) [13] “Hipergrafos, Realidad Virtual y Arquitectura” (en Español) [12]
2.2. REALIDAD VIRTUAL. La Realidad Virtual es un concepto que se ha venido manejando desde la aparición del libro “The Neuromancer ” [1983] del escritor William Gibson, en donde se habla de generación de ambientes sintéticos a través de computadoras.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
20
Sin embargo, Jaron Lanier acuñó el término de Realidad Virtual en 1980, también el Dr. Myron Krueger en 1974 en su tesis de grado en la Universidad de Wisconsin, manejó términos como Realidad Artificial, por otro lado, John Sutherland en el Massachusetts Institute of Technology en 1960, desarrolló, a nivel de Hardware, su primer casco visor estereoscópico.
El maestro Arq.Gonzalo Vélez ha dado una de las más completa definiciones en el campo de la arquitectura de Realidad Virtual [1995, Septiembre]: “Es simulación por computadora, dinámica y tridimensional, con alto contenido gráfico, acústico y táctil orientada a a la visualización de situaciones y variables, durante el cual el usuario ingresa a tráves del uso de sofisticados dispositivos de entrada, a mundos que aparentan ser reales, resultando inmerso en ambientes altamente participativos de origen artificial. Una nueva y sorprendente forma de navegar información”. De todo lo anterior podemos decir que las características de esta tecnología, que a su vez es combinación de otras, son: Inmersiva Interactiva Multisensorial.
Realidad Virtual ciertamente es una combinación de sistemas y tecnologías, no pudiendo decir que, es una tecnología per se, en donde, se mezclan sistemas de sonido, proyección estereoscópica, programas, equipos computacionales, tecnología de trackers (seguidores) y otros más.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
21
grafico No. 01
propia La estructura de la R.V. consta de un elemento, quizás el más fuente: importante de todos que es
la experimentación y percepción humana, se puede decir, que la tecnología está llegando a su punto final de encuentro, el ser humano ( ¿será Arthur Clark y su “2001 Odisea del Espacio” ?) y estamos por tanto en el umbral de una nueva era en donde la comunicación Hombre-Máquina empieza a humanizarse, deparando entonces horizontes realmente insospechados.
En el gráfico No. 1 notamos el esquema de la estructura fundamental de la R.V. en donde nos encontramos con cuatro componentes que son: el ser humano como pieza clave (H), los Mundos Virtuales con toda su geometría para su propia generación (MV), las Rutinas ó Algoritmos de manipulación, asi como, el grupo de programas necesarios en esta generación de ambientes sintéticos (R) y finalmente la plataforma de trabajo que hemos denominado el sistema o equipos utilizados (S).
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
22
2.3 CABINA VIRTUAL (C2).
grafico No. 02 La Cabina (CAVE)
fuente: ACCESS vol.8 no.2
El concepto de Cabina de proyección de ambientes inmersivos se maneja por primera vez en la Universidad de Illinois en Chicago con los Dres. De-Fanti y Sandin en 1973, no es sino hasta 1990-1991 cuando la Ing. Carolina Cruz Neira, desarrolla, como parte de la Tesis para optar al Doctorado en la misma universidad, el sistema completo y las librerías de programas para la cristalización del proyecto Cabina o CAVE (Computer Assited Virtual Environment) como tambíen se le conoce. Las ventajas más importantes que tiene la cabina sobre sus antecesores, los cascos visualizadores estreoscópicos y los BOOM, se reducen a dos: Experiencia Colectiva , es decir, participación de más de un usuario en la percepción inmersiva. Dispositvos de Visualización Ligeros, en el caso de la cabina, el uso de lentes de visión esterescópica hacen mucho mas cómoda la experiencia, en lugar del uso de cascos ó dispositivos pesados como el BOOM. La Cabina Virtual ó C2 (en alusión a ser la segunda Cabina de su estilo que se construye, la primera fué en la Universidad de Chicago) es un dispositivo de proyección inmersiva basado en un sistema de Realidad Virtual que rodea al espectador ó usuario, por cuatro pantallas de proyección, dichas pantallas estan dispuestas en una figura geométrica cúbica en donde la proyección se realiza por la parte posterior de las pantallas (para las paredes) y de arriba a abajo para la pantalla que corresponde al piso. Esto significa que los proyectores colocados en la parte superior (por economía Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
grafico No. 03 Lentes de vision estereoscopica
23
fuente: ACCESS vol.8 no.2
de espacio) apuntan a diversos espejos, los cuales por fisica de la óptica reflejan a su vez las imágenes a las pantallas de proyección, las cuales estan elaboradas de un material sintético muy fino (como seda) y delicado de color blanco.
grafico No. 04 Cascos Visores
grafico No. 05 BOOM
fuente: Visual Proceedings Siggraph 94
El
usuario
usa
fuente: Visual Proceedings Siggraph 94
lentes
de
visión
grafico No. 06 Sistema Coordenado de la Cabina
estereográfica y un rastreador (tracker) de seis grados de libertad, debido a la libertad de movimiento del usuario dentro de la cabina, la visión
estereoscópica
es
ajustada
y
recalculada para cada pared de proyección. Un segundo sensor del rastreador y control manual manipulado
(Joystick/Wand) por
el
de
espectador
botones permiten
fuente: Iowa State University
interactividad con el ambiente virtual generado. Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
24
La actual C2, permite las proyecciones desde una pared de proyección hasta las cuatro al mismo tiempo. grafico No. 07 Sistema de Proyeccion Inmersivo de la Cabina
fuente: ACCESS vol.8 no.2
2.3.1 Proyectores y Espejos de Retroproyección. Los proyectores y espejos se encuentran en la parte posterior de las paredes o paneles de proyección, todo en función de economizar espacio fisico ya que de otra manera las dimensiones requeridas para el armado de la Cabina serían mucho mayores. El proyector del piso está suspendido del techo de la Cabina. Los proyectores son extremadamente sensibles y requieren ser calibrados continuamente para evitar distorsiones sobre todo en las esquinas de la Cabina. El proceso de calibración y ajuste se toma aproximadamente una hora para los cuatro proyectores. Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
25
2.3.2 Lentes de Visión Estereoscópica. Para apreciar el ambiente sintético, se usan Lentes de Visión Stereoscópica tipo CrystalEyes hechos de cristal líquido, constan de baterias planas tipo reloj y deben ser encendidos adecuadamente, son frágiles y trabajan conjuntamente con los emisores de señal estereo.
2.3.3 Emisores de Señal Estereo. Son dispositivos colocados en los bordes superiores de la cabina, son los encarga dos de sincronizar los lentes estereoscópicos a los paneles de proyección a una rata de 120 Hz ó 96 Hz.
2.3.4 Control Manual (Wand). El control manual ó wand (también joystick) es un ratón (mouse) tridimensional con botones de controles de entrada interactivos. La C2 posee dos tipos: el mas reciente está conectado a una PC, la cual lee y retransmite la información a los computadores que controlan los paneles de proyección, el segundo y de mas vieja data, se conecta directamente a una de las estaciones de trabajo Silicon Graphics® que controlan las pantallas, en ambos casos los controles son de tres botones.
2.3.5 Sistema de Rastreo (Trackers).
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
26
La Cabina soporta varios sistemas de rastreo.
El
sistema
primario
es
grafico No.08 Trackers
el
conocido Flock of Birds. Sistemas alternos son los de Polhemus Fastrak y Logitech Sonic. Además se poseen las emulaciones a un sistema de rastreo como es el uso del teclado y/ó ratón. En cualquier caso
fuente: Ascension Technologies
siempre estan activos dos sistemas de rastreo, uno que controla la posición de la cabeza del usuario (linea de visión) y otro que se encarga del Control Manual ó Ratón Tridimensional, para la ubicación del usuario en el ambiente sintético generado.
2.3.6 Sistema de Sonido Surround. Los componentes del sonido son una estación de trabajo Indy de Silicon Graphics®, cuatro parlantes, una interfase MIDI y un sintetizador. La estación de trabajo hace las veces de “servidor sonoro” para la C2. Las instrucciones de sonido se envian a través de la estación de trabajo a toda la red, las cuales controlan emisión de sonido o comandos al sintetizador. Los parlantes se colocan en el borde superior del marco metálico de la Cabina. El sintetizador y la interfase MIDI, estan en un rack especial al lado de la C2.
2.3.7 Estaciones de Trabajo. La cabina está implementada sobre una Onyx y tres Reality Engine 2s todas de Silicon Graphics® y conectadas en red. En este caso especifico la pared frontal se transforma en la master ó directora de la visión estereoscópica del sistema, por lo que al usar proyección de un panel, deberá encenderse al menos la pared frontal.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
27
2.4 DISPOSICIONES ESPACIALES CON EL HIPERGRAFO EN AMBIENTES SINTETICOS. Debemos insistir que este trabajo es una extensión de otros varios ya mencionados, con la particularidad de su desarrollo en ambientes sintéticos, por lo que la serie de definiciones y conceptos propios de los grafos, hipergrafos, métodos de diseño, ciclos continuos y proceso de diseño se obviarán ya que, se asume, estan suficientemente discutidos en los antecedentes a este trabajo. En lo que si, debemos profundizar es en la caracteristica inmersiva del metodo propuesto, es decir, la generación del hipergrafo y su posterior manipulación, con los algoritmos de Abstracción y Expansión (Síntesis y Análisis), el cambio ó sustitución de vértices a ambientes (Unidades Básicas), el uso de la Retícula Isoespacial y asi por demás;
todo en un ambiente inmersivo, interactivo y con alta calidad gráfica,
características propias de la tecnología de Realidad Virtual, lo que permite reubicar los elementos de manera virtual, en el espacio como si se tratase de una gran maqueta desarmable de unidades básicas sin perder sus relaciones primarias dando como base el establecimiento de diversas soluciones neutras al problema dado y dejando al diseñador la exploración de diversas posibilidades de disposición espacial del mismo problema.
2.5 RETICULA ISOESPACIAL EXTENDIDA.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
28
Un nuevo elemento se ha sumado a los diversos que conforman este método pro puesto, la retícula isoespacial.
grafico No. 09 Retícula Cartesiana
El hecho que el sistema Cartesiano se adopte universalmente en matemáticas, en fuente: propia programas de diseño y entre los profesionales del diseño ha hecho que prevalezca la geometría ortogonal y nos ha llevado a la presunción (hasta el momento) de que es la mejor y más natural manera de representar objetos tridimensionales. En una retícula cartesiana, entre un punto y sus 26 (27-1) vecinos próximos, la distancia entre ellos es variable, dependiendo de la posición. En la reticula isoespacial, esta distancia se mantiene, limitando obviamente las posiciones disponibles en el espacio
que se
restringen a 12 en donde, la distancia entre puntos es exactamente la misma, por lo que con sus seis ejes y cuatro planos de simetría se transforma en un superconjunto de la retícula cartesiana, por lo que la retícula isoespacial se convierte en un dodecaedro (el punto central y sus 12 vecinos próximos con distancias exactamente iguales).
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
29
Sin embargo, nuestro caso, en que las distancias
grafico No. 10 El arreglo Dodecaedro
no son de relevancia tal, que amerite exactitudes extremas, hemos llegado a una retícula intermedia entre
las
dos
retículas
antes
mencionadas,
agregandole el término extendida (gráficos Nos. 11 y 12), respetando así su concepción original [14], conservando seis posiciones (disposición
hexago-
fuente: broughton,Coates & Jackson
nal) en un solo plano (incluyendo el punto de estudio), con un plano superior y 6 posiciones disponibles, y añadiendo el plano inferior con seis posiciones mas, un total de 17 (18-1) posiciones disponibles sin incluir el punto de inicio. El criterio utilizado es que los hiperarcos se relacionan, en lo posible, con los vértices en el mismo plano inicial (L0), en caso de existir grafico No. 11 Reticula Isoespacial Extendida Multiplanar
grafico No. 12 Planta Reticula Isoespacial Extendida
arcos (sólo dos vértices) se usan las otras posiciones de los otros planos disponibles, los cuales son L1 y L-1.
2.6 UNIDADES BASICAS. En este trabajo partimos de la premisa de la preelaboración de las unidades básicas como elemento fundamental y primario dentro del proceso de diseño arquitectónico. Las unidades básicas pueden sufrir modificaciones durante el proceso, a fin de ajustarse al todo, por lo Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
fuente: propia
fuente: propia
30
que su modificación dependerá de un modelador de sólidos tridimensional, el cual es totalmente ajeno a este trabajo.
Entre los puntos propuestos es la elaboración previa de una biblioteca de Unidades Básicas, las cuales se van incorporando al programa de áreas, como piezas separadas que conformarán luego, el todo arquitectónico.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO III. MARCO METODOLOGICO
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
MARCO METODOLOGICO
3.1 TIPO DE INVESTIGACION.La investigación es del tipo Descriptiva, ya que detalla las características de un modelo basado en una estructura de datos que tiene su representación gráfica.
3.2 POBLACION.El presente trabajo está dirigido a todas aquellas personas envueltas en el proceso de Diseño Arquitectónico, Métodos de Diseño Arquitectónico, Diseño en general, Computación Gráfica, Visualización y obviamente en Realidad Virtual y específicamente al grupo de estudiantes y profesores de la Facultad de Arquitectura y Diseño involucrados en los métodos de diseño arquitectónico.
3.3 DISEÑO DE LA INVESTIGACION.La metodología utilizada para este trabajo se resume en las siguientes actividades:
Revisión de los anteriores trabajos que forman parte de la serie desarrollados en la División de Estudios para Graduados de la Facultad de Arquitectura y Diseño de la Universidad del Zulia.
Revisión de la Teoría de Reticula Isoespacial y los Algoritmos Evolutivos del Sistema Lindenmayer.
Estudio y conocimiento del lenguaje de programación C++, de la interfase gráfica OpenGL® y del sistema operativo UNIX® en su version IRIX® 6.2 para estaciones de trabajo Silicon Graphics®.
Revisión, estudio y comprensión de las librerías desarrolladas para la Cabina Virtual (C2) y su aplicación en Ambientes Sintéticos.
Estudio, conocimiento y adquisición de destreza de los siguientes programas modeladores de sólidos: Multigen II®, Open Inventor® y Performer®. Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
33
Asistencia de cursos en la Iowa State University sobre Realidad Virtual y Vida Artificial para cubrir la parte de Algoritmos Genéticos.
Conocimiento y adquisición de destreza en el sistema integrado de proyección inmersiva (C2) del Laboratorio de Ambientes Sintéticos (SELAB) de la Iowa State University
Consulta por Internet de fuentes de información referidas al tema.
Revisión y estudio de estructuras y bases de datos adecuadas al problema planteado.
Elaboración de algoritmos y rutinas en lenguaje C++, para el manejo de listas y de lista de listas, las cuales se tomaron como estructuras de datos fundamentales del trabajo de investigación.
Elaboración de los algoritmos y rutinas en lenguaje C++, para la captura de datos y generación de archivos tipo texto.
Elaboración de los algoritmos y rutinas en lenguaje C++ y OpenGL® para la generación de hipergrafos tridimensionales en ambientes sintéticos a partir de archivos tipo texto.
Aplicación de las librerías existentes para los menúes virtuales. Elaboración de los algoritmos y rutinas en lenguaje C++ y OpenGL® para la manipulación y edición de los hipergrafos tridimensionales en ambientes sintéticos.
Filmación del producto final de la investigación a traves de dos fuentes: a) en el sitio, con el uso de una cámra doméstica formato Super 8 y b) directamente por uno de los canales de visión estereoscópica de una estación de trabajo.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO IV. EL MODELO GRAFICO EN UN AMBIENTE INMERSIVO.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
EL MODELO GRAFICO EN UN AMBIENTE INMERSIVO
4.1 GENERACION DEL MODELO VIRTUAL.Uno de los objetivos generales de este trabajo de investigación es la generación del modelo gráfico tridimensional del hipergrafo en un ambiente sintético de tipo inmersivo, interactivo, multisensorial y altamente gráfico, en sintesis, la utilización de los sistemas proyectivos inmersivos que se utilizan en Realidad Virtual. Para la generacion del modelo tridimensional, son necesarios el cumplimiento de una secuencia de pasos para la entrada inicial de datos, muy similares al patrón seguido por los trabajos antecesores a éste, estos pasos son: Programación de Espacios, Vinculación de grafico No.13 Esquema Entrada de Datos
fuente: Alonzo-Burgos (2)
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
36
Espacios y Unidades Básicas, uso de la Matriz de Asociación y Matriz de Interrelación Espacial.
Luego de generados los archivos tipo texto (*.DAT), se pueden incluso modificar con un editor cualquiera de textos, sin necesidad de correr nuevamente los programas anteriores de entrada de datos. Estos archivos contienen las relaciones entre vértices, entre vértices e hiperarcos, y entre vértices y unidades básicas, (ver capitulo VI), constituyendose estos archivos de texto, en las estructuras de datos (listas) requeridas para la generación grafico No. 14 Esquema Proceso de Graficación del Hipergrafo
automatizada
del
modelo
gráfico
tridimensional
del
hipergrafo.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
fuente: Alonzo-Burgos (2)
37
Todas las coordenadas de los elementos (vértices e hiperarcos) del hipergrafo son generadas automaticamente utilizando el criterio de la retícula isoespacial [14]. Este modelo gráfico, a traves de menúes virtuales, los cuales aparecen y desaparecen a voluntad, puede ser editado de manera interactiva e inmersiva, cambiar la posición (coordenadas) de sus elementos, aplicar los algoritmos de abstracción (síntesis) y expansión (análisis) [2] y sustituir los vértices (esferas) del hipergrafo por las unidades básicas previamente vinculadas [7], las cuales a su vez mediante un algoritmo desarrollado, pueden cambiar sus dimensiones o proporciones. El nuevo hipergrafo puede ser almacenado para ser usado posteriormente, es decir, las nuevas coordenadas de los elementos que conforman el hipergrafo, pueden ser grabadas para su reutilización, creando así sesiones de trabajo alternas y cómodas, evitando de esta manera la fátiga que produce en algunas personas el uso prolongado de los sistemas de proyección inmersivo.
4.1.1 Programación de Espacios. La programación de espacios se establece basados en información dada por el usuario, como actividades, usuarios, organigramas y otros, logrando así determinar la cantidad de espacios requeridos, sus dimensiones, áreas, características fisicoespaciales, orientaciones y relaciones con otros espacios.(Ver Gráfico No.15)
4.1.2 Vínculos Espacios-Unidades Básicas. Los vínculos entre los espacios generados por la programación y las unidades básicas se establecen en función de las características de los primeros, relacionando de esta manera, cual ó cuales unidades básicas son las más adecuadas al espacio ó espacios requeridos.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
38
Para ello, es imprescindible, contar con una base de datos (biblioteca) gráfica reticular tridimensional de unidades básicas, la cual será editable y se irá alimen tando, creciendo y modificando en la medida que surjan nuevos diseños y respuestas arquitectónicas. Este es el grano fino de la información gráfica tridimensional. grafico No. 15 Ejemplo de Ficha Programación de Espacios
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
fuente: Alonzo-Burgos (2)
39
En este punto es conveniente aclarar, que debe contarse con un programa modelador tridimensional para la generación, edición, consulta e impresión de planos de las Unidades Básicas que conforman esta gran base de datos gráfica propuesta, que sea compatible con el sistema de proyección inmersivo utilizado. Esta etapa por razones obvias no está cubierta en la presente investigación.
4.1.3 Matriz de Asociación. La matriz de asociación vincula los espacios entre sí, es condición importantísima que, para que un grafo pueda ser abstraído debe ser conexo [3], con esta matriz grafico No. 16 Ejemplo de Ficha Matriz de Asociación de Espacios
fuente: Alonzo-Burgos (2)de Edificaciones –I.Burgos,1999 Hipergrafos en Ambientes Sintéticos para la Disposición Espacial
40
determinamos el número de relaciones de cada espacio, lo cual será de gran ayuda para la Matriz de Interrelación.
4.1.4 Matriz de Interrelación Espacial. La matriz de interrelación asocia cada hiperarco con los espacios, es una etapa delicada, ya que dependerá de la experiencia y destreza del diseñador, acá se determina además cual hiperarco posee más peso, lo cual es crucial para el algoritmo de graficación y disposición espacial inicial (automatizado), ya que el hiperarco mas cargado (de mayor peso) será el centro e inicio del proceso de graficación tridimensional del hipergrafo generado. grafico No. 17 Ejemplo de Ficha Matriz de Interrelación
fuente: Alonzo-Burgos (2) Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
41
4.2 Algoritmo de Graficación. La gran ventaja de graficar un hipergrafo en tres dimensiones es que los problemas de planaridad quedan totalmente resueltos, ya que las intersecciones entre hiperarcos se eliminan, esto es complementado por el uso de la retícula isoespacial extendida, la cual dispone y mantiene el control de las coordenadas espaciales no ocupadas. El algoritmo desarrollado se fundamenta en el algoritmo de Alonzo-Burgos [2], en donde se parte del hiperarco con más peso, es decir, con mayor número de relaciones, pasando luego, al hiperarco que le sigue en cuanto a número de relaciones, el cual a su vez buscará entre los vértices del primer hiperarco cualquier conexión existente ó vértices comunes y así sucesivamente. El seudocódigo del cuerpo principal del programa es como se establece a continuación:
Determina Hiperarco mas relacionado { tomando los datos de los archivos tipo texto previamente alimentados} Asigna coordenadas del centro de la cabina al hiperarco mas relacionado {coordenadas 0,01} Calcula coordenadas de la retícula isoespacial extendida {Se comienza con el centro de la cabina, el cual ya esta ocupafdo por el centro del hiperarco de mayor peso} Chequea relaciones internas de vértices del hiperarco mas relacionado {Este paso se hace con la idea de determinar cuales vértices de un mismo hiperarco se relacionan para ubicarlos en el espacio de manera correlativa}
Grafica el primer hiperarco Grafican los vértices del primer hiperarco Toma el hiperarco siguiente {en orden de peso descendente} Chequea si es arco {dos vértices} ó hiperarco {más de dos vértices} Si es hiperarco Asigna coordenadas espaciales {centro del hiperarco} Busca vértice(s) común(es) con el primer hiperarco Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
42
Asigna coordenadas de los vertices no comunes Grafica el hiperarco Grafica los vértices no comunes de este hiperarco Para el resto de los hiperarcos Toma hiperarco no visitado Chequea si es arco {dos vértices} ó hiperarco {más de dos vértices} Si es hiperarco Asigna coordenadas espaciales {centro del hiperarco} Busca vertice común con algún anterior hiperarco visitado Repite hasta finalizar los hiperarcos no visitados.
4.3 Aplicación de la Reticula Isoespacial Extendida. La retícula isoespacial extendida, dispone de las coordenadas espaciales no ocupadas y mantiene un control de desocupación de las mismas. El crecimiento de la retícula va en proporción directa a las dimensiones del hipergrafo. El control, crecimiento y mantenimiento de la retícula se efectúa de manera dinámica, según los requerimientos del hipergrafo. Existen tres listas de control descritas de la siguiente forma:
Lista de Coordenadas Asignadas de Vértices
Lista de Coordenadas Asignadas de Hiperarcos
Lista de Coordenadas Utilizadas Este grupo de listas igualmente, son almacenadas en archivos tipo texto, para sesiones de
trabajo alternas. En nuestro caso y por simplificación del problema, utilizaremos solamente los planos L0 y L1 (ver gráfico), es decir, 13 posiciones disponibles. El seudocodigo para el calculo de la retícula es: Para i =0 a NumMaxVertices {NumMaxVertices dependerá de la cantidad de planos utilizados, así L0 y L1=12, si usa L-1 añadir 6 más} si i = 6 , Plano_Z=1 {Ocupa la posicion del plano L0} sino Plano_Z=2 { Ocupa la posicion del plano L1} arreglo_3D[i][0] = (COS_90-angulo*i)+l {angulo=60 por ser hexagonal} Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
43
arreglo_3D[i][1] = (SEN_90-angulo*i)+m {l y m varian según la posición espacial} arreglo_3D[i][2] = Plano_Z FIN.
4.4 Menúes Virtuales. Los menúes virtuales aqui utilizados permiten la graficación, edición y almacenamiento. Los algoritmos aqui utilizados provienen todos de la libreria INTERACTION.H diseñada para la cabina, con ligeras modificaciones y ajustes para el ejercicio en cuestión. Los menúes virtuales aparecen y desaparecen a voluntad del usuario, usando para ello el wand ó joystick. grafico No. 18 Ejemplo de Menú Virtual
fuente: Proyecto VaDET. Iowa State University
El esquema jerárquico del menú virtual propuesto es el siguiente: Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
44
grafico No. 19 Esquema de Menú Virtual Propuesto.
abstracción expansión
Menú Principal sustitución sustitución almacenamiento salir esferas- unidades unidades-esferas Submenú 1 -Individual -Global - Proporciones -Salir
Submenú 2 -Individual -Global -Salir
fuente: propia.
En donde las rutinas de abstracción y expansión se explican por sí mismas; en ambos casos, basados en una selección previa de manera interactiva de vértices o macrovértices, según el caso, se realizan las operaciones antes mencionadas. En la sección de sustituciones se tiene el submenú 1, que se encarga de cambiar las esferas ó vértices de manera Global (todos los vértices) o Individual (un solo vértice seleccionado por el usuario de manera interactiva), en la rutina Proporciones, se modifican las dimensiones del elemento luego de haber sido sustituido, la rutina Salir procede a ascender al nivel jerárquico superior, en este caso el menú principal. El submenu 2 revierte lo hecho por el submenu 1, es decir, las unidades básicas existentes en el ambiente inmersivo, son sustituidas nuevamente o restituidas a sus esferas originales, de igual manera que en el submenu 1, se aplican las restituciones de manera
Individual ó Global. La rutina Salir, emerge el submenú virtual a su nivel jerárquico superior.
4.5 Algoritmo de edición del Hipergrafo. El hipergrafo es editable de diversas formas. El cambio de coordenadas se obtiene pulsando (ponchando) el elemento a editar con el control manual (wand), esto se realiza con un simple cálculo en donde obteniendo las coordenadas del wand y comparandolas con las coordenadas de todos los elementos del hipergrafo, si las coordenadas coinciden entonces se Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
45
activa el cambio de color para indicar que está reconocida, al cambiar la posicion del elemento este se mueve con las coordenadas del wand y al finalizar la edición le coloca al elemento las coordenadas del wand al momento de finalizar la operación. En seudocódigo sería: Si boton1 Mientras noFIN_operacion Toma coordenadas (wand) Para todos los elementos del hipergrafo (sólo vertices) Chequea coordenadas (elemento) con coordenadas (wand) Si coordenadas (elemento)=coordenadas (wand) Activa cambio color Repite noFIN_operacion Asigna coordenadas (elemento)=coordenadas (wand) Fin Si boton1
4.5.1 Abstracción y Expansión. En la presente investigación sólo se describen superficialmente los algoritmos de Abstracción y Expansión, para una mayor profundización se recomienda la consulta de las referencias [2] [3] [7]. La abstracción se utiliza para reducir a un macrovértice los vértices seleccionados, esta operación se controla a voluntad a traves de los menúes virtuales, en donde el fin de la selección y la reducción de los vértices seleccionados al macrovértice se efectúa de manera simultanea. El control de la identificación del macrovértice generado lo realiza el programa, siendo esto totalmente transparente para el usuario. Es procedente hacer abstracciones de macrovertices existentes a otro macrovértice, lo que genera rutinas de tipo recursivo.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
46
grafico No. 20 Aplicación de la operación de Abstracción
fuente: propia
Igual procedimiento es válido para la expansión en donde seleccionando cada macrovértice, éste es sustituido por sus vértices constitutivos. Para cada caso es posible decir que la abstracción simula la sintésis y la expansión el análisis. Tambien es posible reducir todo el hipergrafo a un sólo macrovértice (¿La hipercompresión del espacio habitable?).
4.5.2
Sustituciones
de
Vértices
por
Unidades
Básicas
Tridimensionales. Uno de los puntos más interesantes es el proceso de sustitución de los vértices (esferas) por unidades básicas (espacios reticulados tridimensionales). En este punto tambien es posible acomodar y reacomodar las unidades basicas de manera Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
47
interactiva, produciendo de esta manera un acercamiento a las plantas definitas del edificio como una de las soluciones de disposición espacial. También es válido revertir la sustitución. Las sustituciones se pueden realizar de manera global (todos los elementos) o de manera individual (uno a uno escogido interactivamente). NO es posible hacer operaciones de abstracción y expansión en este punto, éstas sólo son válidas mientras los vértices permanezcan, tampoco son permitidas sustituciones mientras existan abstracciones activas en el hipergrafo, este control es mantenido por el programa. grafico No. 21 Aplicación de la operación de Sustitución de Vértices por Unidades Básicas
fuente: propia
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
48
4.6
Almacenamiento
de
Coordenadas
de
los
Elementos
del
Hipergrafo. Con el uso del menú virtual, las coordenadas de todos los elementos del hipergrafo establecidas al final de cada sesión de trabajo son almacenadas a voluntad, en un archivo tipo texto, con extensión DAT.
4.7 Memoria Compartida. (Shared Memory) Sin entrar en explicaciones profundas y muy técnicas desde el punto de vista informático, sobre el uso de la memoria compartida y tan sólo como una mención del tópico, la memoria compartida debió usarse como apoyo para la sincronización de la información entre las cuatro estaciones de trabajo, es decir, la manipulación de la data se realiza en una memoria que es común a las cuatro máquinas, recordando que cada estación de trabajo controla una pared de proyección, de esta manera, cuando los elementos son editados y cambiada su posición en el espacio, dicha actualización pasa a esa área común de donde las estaciones de trabajo se nutren. Sin la utilización de la memoria compartida es prácticamente imposible, mantener las imágenes actualizadas en las cuatro paredes de proyección.
4.8 Acercamiento a plantas definitivas. Al obtener una solución que a juicio del diseñador, sea la más idónea, se puede pasar nuevamente al modelador utilizado para generar las unidades básicas e iniciar la graficación de la planta definitiva. Otra opción es trabajar con la cabina directamente en la disposición final de las plantas. En ambos casos, son utilizables las coordenadas almacenadas en el archivo destinado a tal fin.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO V. EJEMPLO DE UN CASO ESPECIFICO
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
EJEMPLO DE UN CASO ESPECIFICO
5.1 METODOLOGIA DE TRABAJO.5.1.1 UNIDADES BASICAS. Lo primero que establecemos es la premisa del diseño arquitectónico partiendo de las posibilidades combinatorias de las Unidades Básicas (U.B.). Entendemos por U.B. la pieza más pequeña dentro del rompe-
grafico No. 22 Unidad Básica generada por Multigen II
cabezas del diseño ó la Unidad de Diseño mas elemental, ésta obviamente variará de escala según la complejidad del mismo. Bajo este esquema tenemos que,
es esencial el tratamiento inicial
muy detallado de las U.B., ya que ellas conformarán por agregación, el todo. La fuente: propia.
generación de las U.B., se manejan con los conocidos patrones de diseño de relaciones entre equipamiento y persona(s), además de los requerimientos técnico-espaciales como iluminación, acústica, ventilación, comunicaciones, etc. A partir de este punto comenzamos a diferenciar métodos de generación de las U.B. En nuestro estudio se concibe bajo dos puntos de vista: a) Usando un modelador tridimensional (3Dstudio®, MultiGen II®, Performer®, OpenGL®, World Tool Kit®, etc.), siempre y cuando sean compatibles con los formatos utilizados por la Cabina que trabaja bajo UNIX®, C/C++ y equipos Silicon Graphics® (Fig.#22) .[12] b) Usando la misma cabina virtual [17] : generando asi las unidades básicas a utilizar directamente en la cabina.(Fig.#23)
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
51
Para los arquitectos ó estudiantes experimentados en percepción espacial recomendamos el punto a), para los menos, el punto b). La diferencia básica es que en el segundo, la persona puede ir percibiendo desde el primer esbozo de la U.B., el espacio, e ir acomodando y reacomodando los elementos propios del diseño a ese nivel primario que son las U.B. Sin embargo, existe una tercera alternativa que consta de una combinación de las anteriores, es decir, se esboza la U.B. en el modelador 3D y luego se afina el diseño grafico No. 23 Unidad Básica Generada en la Cabina
de la misma en la C2.
Como dijimos esta etapa es de vital importancia porque es el inicio de la generación de una gran base de datos de U.B.,
la
alimentando
cual
iremos
según
las
invocando
y
necesidades
y
complejidad del diseño.
fuente: Proyecto VADeT. Iowa State University.
5.1.2 MATRICES DE INTERRELACIONES ESPACIALES.Ya establecidas al menos las U.B. del ejercicio de diseño en cuestión, pasamos entonces a establecer las relaciones interespaciales, asi como, los patrones de proximidad espacial, que dependiendo del usuario se puede establecer en la misma matriz utilizando en las intersecciones valores por ejemplo del 1 al 10, donde 10 es el Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
52
valor de mayor próximidad, en nuestro caso fueron colocados en matrices independientes obviandose la escala de valores (Tabla #01), por razones de simplificación, más amplia información sobre el punto de Matrices de Relación se encuentran en las referencias [1],[2],[3] ,[12],[13]. En el ingreso de los datos, se utilizan vértices (Los vértices en la Cabina son esferas), como unidades básicas ó espacios y las relaciones de estos espacios o vértices por medio de arcos (hiper arcos para este caso), utilizando para ello las matrices mencionadas, a partir de ese momento se empieza a establecer la relación de todos los espacios (vértices) e hiperarcos. Lo curioso de todo esto es que siempre los hiperarcos son espacios de circulación ó distribución[1],[2], a diferencia de los grafos simples en donde debemos considerar las circulaciones como vértices adicionales, complicando más los esquemas.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
53
Otra diferencia entre el grafo y el hipergrafo es que, los arcos en el primero sólo conectan dos vértices, mientras que en el segundo se pueden conectar más de dos vértices al mismo arco (hiperarco). Adicionalmente, los hiperarcos a su vez contienen información, de esta manera, las circulaciones generadas pueden almacenar datos MATRIZ DE INTERRELACION APLICANDO SOLO RELACION ENTRE AMBIENTES
(X = existe relacion) vertices V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
V1 *
V2 X *
V3 X X *
V4 X X X *
V5
V6
V7
X *
X
X
*
X *
V8 X
V9
V10
*
X *
X X *
Tabla # 01 Matriz de Relación sin Valoración.
como carateristicas fisico-espaciales al igual que los vértices. En este punto todavía no se recurre a la Cabina o C2, ya que lo que generamos son archivos tipo texto (ASCII) con información de los vertices y sus arcos y de los arcos con sus vertices. Estos archivos de datos se comienzan a leer luego directamente desde la cabina. Como se dijo anteriormente los archivos que contienen la información de las rela ciones entre vértices, entre hiperarcos y vértices, dimensiones de las listas (que
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
54
fueron las estructuras de datos utilizadas) y proporciones de las unidades básicas se denominaron de la siguiente manera (se toma un solo ejemplo de cada grupo, los ## indican la identificación del hipergrafo):
arc_output##.dat Archivo que contiene la cantidad de hiperarcos involucrados, el número del hiperarco, cuantos vértices y cuáles vértices están asociados.
lenght##.dat Archivo contentivo de la longitud de cada hiperarco (cuantos elementos tiene cada hiperarco en su lista) en orden secuencial.
proportion##.dat Archivo con las proporciones de las Unidades Básicas, lado1, lado2 y altura de cada unidad.
vert_output##.dat Archivo que contiene la cantidad de vértices involucrados, el número del vértice, con cuantos hiperarcos se relaciona y cuáles son.
5.2 GRAFICACION.-
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
55
a) Ya dentro de la C2, se procede a la graficación del primer esquema relacional tridimensional a partir de los datos
grafico No. 24 Hipergrafo inicial en la Cabina
ingresados. Esto se genera a traves de un algoritmo de graficación 3D [2],[13], tomando como centro de generación del hipergrafo, el hiperarco mas relacionado ó más cargado (con más vértices), procesado
totalmente
computador.
Este
entre
cosas la utilización
otras
por
algoritmo
el
plantea de
espacios e hiperespacios, variando la
fuente:propia
coordenada Z para la reubicación de vertices que puedan potencialmente originar intersecciones no deseadas entre hiperarcos. Para la disposición espacial de los elementos del hipergrafo se tomó como base, la Retícula Isoespacial Extendida [14] y propiedades de los Algoritmos Evolutivos del Sistema Lindenmayer [14]. (Fig.#24) b) Definición del grafo final, trabajando en ambiente sintético (Fig.#25), se manipulan los vértices en 3 Dimensiones (sin problemas de planaridad y entrecruce de relaciones o hiperarcos), reacomodando así, su distribución espacial al criterio del diseñador (la parte subjetiva), utilizando los algoritmos propios del hipergrafo estructurado de abstracción para manejar de manera compacta la información (Familia de espacios) y los de expansión para dar el toque final a todos los vértices (esferas) en su conjunto y restituyendo de esta manera la información inicial [13]. (Fig.#26)
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
56
grafico No. 25 Hipergrafo Editado
fuente : propia
grafico No. 26 Abstracción
fuente : propia
5.3 SUSTITUCION.Y ahora la etapa mas interesante y emocionante, sustituir todos los vértices [1],[2],[13], (en el grafo definitivo y ademas en 3D.) por ambientes tridimensionales (unidades básicas) y terminar de ordenar la disposición espacial, siempre en un ambiente sintético, inmersivo total, interactivo y altamente gráfico (en 3D y alta resolución). En este punto es importante resaltar el hecho que las relaciones Vértices con U.B.’s, es muchos a uno (tabla No.02), es decir, varios
grafico No. 27 Sustitución Vértices/Unidades Básicas
vértices conectados a una misma U.B., al momento de efectuar la sustitución de los sólidos, aparece la misma U.B. en el lugar de los vértices relacionados, un ejemplo de ello, pudiesen ser baños, aulas de clase, puntos de control de aeropuertos,etc (Fig.#27), es decir, todos los elementos repetitivos del diseño.
fuente : propia
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
57
TABLA # 02 Relación muchos a uno entre Vértices y Unidades Básicas
VERTICES
UNIDADES BASICAS
VERTICES
Unidades Basicas
V1 V2 : : Vn
UB5 UB5 : : UBm fuente : propia
5.4 APROXIMACION DE PLANTAS DEFINITIVAS.A partir de allí se inicia entonces la elaboración de plantas, fachadas y graficación en general, que por supuesto tambien forma parte del diseño arquitectónico. (Puede ser dentro o fuera de la C2).(graficos.# 28,29,30,31)
fig.# 28
fig.# 29
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
58
fig.# 30 fig.# 31
5.5 ICONOGRAFÍA DE LOS MENÚES VIRTUALES.Se ha creído conveniente incluir este punto, ya que, la iconografía en Realidad Virtual apenas comienza, por las características mismas de la naciente tecnología. La mayor parte de la iconografía incorporada a los menúes virtuales son de manufactura propia, sin embargo, algunos íconos como salida y almacenamiento en disco han sido tomados de otras fuentes y ajustados a esta investigación.
ICONO
Tabla # 03 Iconografía de los Menúes Virtuales DESCRIPCION
Menu Principal Abstracción: Proceso mediante el cual, uno ó más vértices
seleccionados,
se
convierten
en
un
macrovértice, manteniendo éste toda la información de(l)/los vértice(s) que lo conforman.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
59
Expansión: Es el proceso que revierte la acción de la abstracción, convirtiendo así cualquier macrovértice seleccionado en sus componentes primarios, con toda la información en su grado fino.
Sustitución de Vértices por Unidades Básicas: Rutina que cambia la topología de los vértices (esferas) a elementos
reticulados
tridimensionales
(Unidades
Básicas). Pasa al Submenú 1 para determinar la forma de efectuar la operación.
Sustitución de Unidades Básicas por Vértices: El proceso inverso al anterior, cambia la forma de Unidades a Vértices. Pasa al Submenú 2 para determinar la forma de efectuar la operación.
Almacenamiento:
Guarda
la
Información
de
las
coordenadas de los elementos del hipergrafo editado, para su posterior reutilización, permitiendo así, planificar sesiones de trabajo.
Salir: Este procedimiento permite pasar en los menúes virtuales, al nivel jerárquico superior. En caso de estar en el menú principal, el programa finaliza finalizando la sesión de trabajo.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
60
Submenú 1
Este submenú es invocado desde la sustitución de Vértices a Unidades Básicas. Sustitución Individual: Permite sustituir uno a uno los vértices que se seleccionen.
Sustitución Global: Permite sustituir todos los vértices que conforman el hipergrafo.
Proporciones: Cambia las dimensiones y proporciones de las Unidades Básicas seleccionadas. Al momento, el cambio sólo se produce entre los lados, la altura permanece constante.
Submenú 2
Este submenú es invocado desde la sustitución de Unidades Básicas a Vértices. Sustitución Individual: Permite sustituir una a una las unidades que se seleccionen.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
61
Sustitución Global: Permite sustituir todas los unidades que conforman el hipergrafo.
Fuente : propia
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CAPITULO VI. PROGRAMAS DE APLICACION Y EQUIPOS UTILIZADOS
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
PROGRAMAS DE APLICACION Y EQUIPOS UTILIZADOS
6.1 ESTRUCTURA GENERAL DEL PROGRAMA.El programa que forma parte de esta investigación, está constituido por tres cuerpos principales independientes : 1. Alimentacion de Matrices de Relación y generación de cuatro archivos bases tipo *.DAT, en formato ASCII, los cuales a su vez, son editables con cualquier tipo de procesador de texto. Estos contienen cada uno : Longitud de cada hiperarco y su identificación, Vértices e hiperarcos conexos, Hiperarcos y vértices conexos y Vértices conexos a Ambientes Reticulados Tridimensionales (Unidades Básicas). 2. Producción de las Coordenadas de las Esferas y los Hiperarcos, en la Retícula Isoespacial Tridimensional Extendida, evitando de esta manera los problemas de planaridad e intersecciones de Hiperarcos. En este punto se genera a voluntad del usuario, otro archivo tipo *.DAT, el cual almacena las coordenadas temporales ó finales de los elementos dispuestos en la Retícula Isoespacial. 3. A partir de las coordenadas obtenidas, se procede entonces a la generación del gráfico propiamente dicho de alta resolución, en un Ambiente Sintético, Interactivo y de Inmersión Plena, características propias de la Tecnología de Realidad Virtual.
6.2 HARDWARE: El Sistema utilizado en este proyecto pertenece al Iowa Center for Emerging Manufacturing Technology (ICEMT) de la Iowa State University en Ames, IOWA, especificamente el lugar de trabajo fue el Synthetic Environment Laboratory (SELAB) en donde se encuentra la CABINA ó CAVE (C2). Los equipos son Silicon Graphics® y el sistema operativo UNIX® Irix 6.2. ® [15] [16].
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
64
6.3 SOFTWARE: Se utilizaron : el lenguaje de programación C++, OpenGL® [4], [5], [6], [7], [8], [9], [10], [11], las librerías de la Cabina (Cave Libraries) [15][16] y MultiGen II®, éste último es un modelador de sólidos y generador de la Unidades Básicas del estudio. Tambien, para desarrollar las U.B., se pudiese utilizar en la CABINA , el VADeT, un programa experimental para Diseño en Arquitectura de este mismo centro. [17]. Hubo que desarrollar en C++, varias rutinas para el manejo de listas, simulando de esta manera los conjuntos y sus operaciones tales como unión, intersección, suma y resta, planteados en los algoritmos originales.[7]
6.4 Listado de los Programas.Programa main.C: Este programa genera los archivos que contienen toda la información necesaria para graficar el hipergrafo inicial.
// List's algorhitms taken from Stanley Lippman - C ++ #include <iostream.h> #include <fstream.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include "IntList.h" // ID FILE *********************** char id_file[2]; // File's Identification in process //******************************* const MAX_VERT = 200; //13;//24;//18 const MAX_ARCS = 100; //6;//9;//27 const VERTNEW = 100; main () { int i,j, arcs, arcnum, number_vert, number_arc; float array[3]; IntList vertex[MAX_VERT], hyperarcs[MAX_ARCS], new_vert[VERTNEW],BV[MAX_VERT],edges[MAX_ARCS], EV[MAX_ARCS],I[MAX_ARCS],PHI[MAX_VERT][MAX_ARCS]; char char char char char
name_f1[17] = "vert_output"; name_f2[12] = "length"; name_f3[17] = "arc_output"; name_f4[17] = "proportion"; ext_f[] = ".dat";
cout<<"What is your file identification number(two digits only)?: "; cin>>id_file; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
65
strcat(strcat(name_f1,id_file),ext_f); ofstream outfile(name_f1); //This is for reading in from // file vert_output??.dat strcat(strcat(name_f2,id_file),ext_f); ofstream length_out(name_f2); //This is for reading in from // the length??.dat file strcat(strcat(name_f3,id_file),ext_f); ofstream arc_out(name_f3); //This is for reading in from // the arc??.dat file strcat(strcat(name_f4,id_file),ext_f); ofstream props_out(name_f4); //This is for reading in from // the proportion??.dat file cout<<"How many vertices will be used in your graph: "; cin>>number_vert; cout<<"How many arcs will be used in your graph: "; cin>>number_arc; outfile<<number_vert<<endl;
//To see how many vertacies there are
length_out<<number_arc<<endl;
//The number of hyperarcs in the entire graph
arc_out<<number_arc<<endl;
//The number of hyperarcs in the entire graph
for ( i = 1;i <= number_vert ; ++i) { cout << "Enter how many arcs belongs to vertex "<<i<< " cin >>arcs; outfile<<i<<" "<<arcs<<" ";
==>: ";
//Outputs the vertices and the arcnums
cout<<"What are the dimensions of side_1, side_2, and height (1.0-10.0): "; cin>>array[0]>>array[1]>>array[2]; props_out<<array[0]<<" "<<array[1]<<" "<<array[2]<<endl; for (j = 1;j <= arcs ; ++j) { cout << "Enter num of arc: "; cin >>arcnum; outfile<<arcnum<<" "; //Outputs the identity of the arc vertex[i].append(arcnum);
// linking vertices and arcs
}
vertex[0].append(i); // add vertices to original hypergraph new_vert[0].append(i); // add vertices to control list of original hypergraph } for ( i = 1;i <= number_arc ; ++i) { arc_out<<i<<" ";
//The identity of the arc
for ( j = 1;j <= number_vert ; ++j){ if (vertex[j].check(i)!=0) { hyperarcs[i].append(j); PHI[0][i].append(j); } } arc_out<<hyperarcs[i].length()<<" "; //The length of the arc i Hipergrafos en Ambientes SintĂŠticos para la DisposiciĂłn Espacial de Edificaciones â&#x20AC;&#x201C;I.Burgos,1999
66
//This for is used to output the vertex id for ( j = 1;j <= number_vert ; ++j){ if (vertex[j].check(i)!=0) { arc_out<<j<<" "; //The vertex that is appended to the arc i } }
edges[0].append(i); I[0].append(i); }
// add all edges(arcs) to original hypergraph
cout << " " << endl; for (i = 1;i <= number_vert; ++i) { cout<< "Vertex[" <<i<<"]: "; (vertex[i].display()); } cout<< " " <<endl; for ( i = 1;i <= number_arc ; ++i) { cout<< "Arcs[" <<i<<"]: "; (hyperarcs[i].display());
length_out<<hyperarcs[i].length()<<" ";
//Outputting the number of arcs //per vert
cout<< "PHI 0 [" <<i<<"]: "; PHI[0][i].display();
} cout<< " " <<endl; cout<< "Vertices Of Original Hypergraph :==>"; vertex[0].display(); // show me the original's list } // end main
Programa order.C: Este programa genera el hipergrafo inicial a partir de los archivos (información) producidos en main.C
// ORDER.C #include <stdio.h> #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <unistd.h> #include <cave.h> #include <cave_ogl.h> #include <gl/device.h> #include <GL/gl.h> #include <GL/glc.h> #include <sys/types.h> #include "global.H" #include "IntList.h" #include "perfm.h" Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
67
#include "VUImem.H" #define #define #define #define #define
PI 3.14159265359 BEESPACE 12 //BEESPACE is used to calculate probable points in space U 2 //The units in space radius 1 // radius of spheres max_load 200 //total number of arcs and vertices
IntList Space; int file_flag = -1; //if file exists then 0, else -1 global *var; size_t VUImem::arenaSize = 20; void Pre_draw(const int &num_of_arcs, const int &num_of_vert, const IntList &arc_rela, const IntList &len_relation, IntList Ha_Center[], IntList Ve_Center[], int Array3D[][5],bool Ver_ver[], bool Ver_arc[], IntList Element[]); //Pre: All of the arc and vert information that is gathered in main //Modifies: none //Post: calls the first initilization functions int heaviest_arc(int total_arcs, IntList leng_list); //Pre: A pointer to the head of the linklist that contains all the size info about the arcs. //Modifies: None //PostL: Returns the arc which has the most relations to it and is to br drawn. void assign_hyper(int candidate, int x, int y, int z, IntList Ha_Center[]); //Pre: The candidate and the coordinates to be assigned to it //Modifies: Space //Post: assigns and stores the coordinates that will be used to check/draw void start_up(int &num_of_arcs, int &num_of_vert, IntList &arc_rela, IntList &len_rela); //Pre: NUMARCS, NUMVERT, two lists to be initilized //Modifies: NUMARCS, NUMVERT, two lists, infile, length_in //Post: via pointer initilizes NUMARCS, NUMVERT, two lists, infile, length_in void points(int l, int m, int z_plane, int TransArray[][5]); //Pre: an l, m, and z_plane translations //Modifies: Array3D[][] to store probable spacial coordinates //Post: a directly modified Array3D[][] void test_order(int Heavy_Arc, IntList Vertex_Center[], int TranslationArray[][5], bool Ver_ver[], IntList Element[], int NUMBER_ARCS); //Pre: the heaviest arc and the array consisiting of all the translation(CHANGE THIS) //Modifies: TranslationArray //Post: a modified TranslationArray void check_temp_coords(int element, bool Verify[], int TranslationArray[][5], int offset); //Pre: Element, Verify, TranslationArray, offset //Modifies: Verify, TranslationArray //Post: Modifies the available temporal 3D space int check_temp_av(int TranslationArray[][5]); //Pre: TranslationArray //Modifies: None //Post: returns an integer(1) in case temporal 3D space is available void assign_coords(int Vertex_ID, int temp_pos, int TranslationArray[][5], IntList Vertex_Center[],bool Ver_ver[]); //Pre: Vertex_ID, temp_pos, TranslationArray, Vertex_Center. Ver_ver //Modifies: TranslationArray, Vertex_Center, Ver_ver //Post: Assigns coordinates to a particular vertex in 3D space int location(int TranslationArray[][5], int keep_ver); //Pre: TranslationArray, keep_ver //Modifies: None //Post: checks probable position or location in 3D space void pre_location(int TranslationArray[][5], int Long, bool &success, int keep_ver); Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
68
//Pre: TranslationArray, success, long, keep_ver //Modifies: success //Post: returns true if the allocation of a particular point has been successful void clear_point(int TranslationArray[][5]); //Pre: An Array to be cleared //Modifies: TranslationArray //Post: Clears TranslationArray void second_draw(int Heavy_Arc, IntList Vertex_Center[], IntList Hyper_Center[], int TranslationArray[][5], bool Ver_ver[], bool Ver_arc[], int NumberOfArcs, IntList Element[]); //Pre: Heavy_Arc, Vertex_Center, Hyper_Center, TranslationArray, Ver_ver, Ver_arc, // NumberOfArcs, Element //Modifies: Vertex_Center, Hyper_Center, TranslationArray, Ver_Ver, Ver_arc //Post: Assigns position in space to hyperarc centers and vertex centers void check_space(int SI, int TranslationArray[][5], bool &OK); //Pre: TranslationArray, OK, SI //Modifies: OK //Post: Sets OK to one if a particular position in space has not been assgined bool yes_or_not(int vi, int TranslationArray[][5]); //Pre: vi, TranslationArray //Modifies: None //Post: Returns true if a vertex number has been taken void Displaying(int TranslationArray[][5]); //Pre: TranslationArray //Modifies: cout //Post: Outputs the contents of translation array void secondary_init(IntList Element[], IntList Vert_Center[]); // // // void flag_make(IntList Ve_Center[], IntList Element[], int NUMBER_VERTS, int NUMBER_ARCS); // // // int main(int argc, char **argv){ int NUMARCS; int NUMVERT;
//The total // Read in //The total // Read in
number of arcs in the graph from length?? number of vertices in the graph from vert_output??.dat
int jayo; int Translations[BEESPACE][5];//Array for probable coordinates
IntList arc_vert_relations; IntList arc_leng_relations;
//Contains all the vertex // relations from ver_output??.dat //Contains all the length info // from length??.dat
var = new global(); if(argc<2){ cout<<"Please enter the command with the file id as the argument."<<endl; return 0; } else{ strcpy(var->id_file, argv[1]); Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
69
} start_up(NUMARCS, NUMVERT, arc_vert_relations, arc_leng_relations); IntList Vert_Center[max_load]; NUMVERT
//Must be initilized after reading // holds all coords for verts
IntList Hyper_Center[max_load];
//Must be initilized after reading NUMARCS // holds all coords for arcs
bool Ver_ver[max_load]; bool Ver_arc[max_load];
//Verify if position is taken by vertex // if position is taken by arc
for(jayo=0; jayo<=NUMVERT+1; jayo++) Ver_ver[jayo]=0;
//Ver_ver intilized
for(jayo=0; jayo<=NUMARCS; jayo++) Ver_arc[jayo]=0;
//Ver_arc initilized
IntList Element[max_load]; Pre_draw(NUMARCS, NUMVERT, arc_vert_relations, arc_leng_relations, Hyper_Center, Vert_Center, Translations, Ver_ver, Ver_arc, Element); for(jayo=0; jayo<=NUMARCS; jayo++){ if (Ver_arc[jayo]== 0) second_draw(jayo, Vert_Center, Hyper_Center, Translations, Ver_ver,Ver_arc,NUMARCS, Element); } /*initilizing all of the shared memory stuff */
var->NUMBER_OF_VERTICES = NUMVERT; var->NUMBER_OF_ARCS = NUMARCS; secondary_init(Element, Vert_Center); /*done initilizing all of shared memory stuff */ CAVEInit(); CAVEInitApplication(initScene, 0); CAVEFrameFunction(frameScene, 0); CAVEDisplay(drawScene, 0); while ((!CAVEgetbutton(CAVE_ESCKEY)) && (var->EXIT == 0)) { sginap(0); } //add by IVAN //system("sfplay ./snd/advBell.aiff &"); CAVEExit(); return 0; }//End main void Pre_draw(const int &num_of_arcs, const int &num_of_vert, const IntList &arc_rela, const IntList &len_relation, IntList Ha_Center[], IntList Ve_Center[], int Array3D[][5],bool Ver_ver[], bool Ver_arc[], IntList Element[]) { Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
70
int heavy,jayo,tempo=0;
//Variable to store the heaviest arc
//Heaviest arc is determined // num_of arcs will be a constant reference to save memory heavy = heaviest_arc(num_of_arcs, len_relation);
//Assigining the coordinates of the arc in space assign_hyper(heavy, 0, 0, 3, Ha_Center); //Temporal coodinates array is initilized points(0, 0, 3, Array3D); flag_make(Ve_Center, Element, num_of_vert, num_of_arcs); //Test order is determined if(file_flag == -1) test_order(heavy, Ve_Center, Array3D, Ver_ver, Element, num_of_arcs); else return; //The rest of the hyperarcs and vertices are given coordinates for(jayo=1; jayo<=num_of_vert+1; jayo++) tempo*=Ver_ver[jayo]; if (!tempo) //in case all vertices are assigned do nothing second_draw(heavy, Ve_Center, Ha_Center, Array3D, Ver_ver, Ver_arc, num_of_arcs, Element); } void start_up (int &num_of_arcs, int &num_of_vert, IntList &arc_rela, IntList &len_rela){ int reading; int reading2;
//Temporary variable for arc_relations //Temporary variable for len_relations
char name_f1[17] ="vert_output"; char name_f2[12] ="length"; char ext_f[] = ".dat"; strcat(strcat(name_f1,var->id_file),ext_f); ifstream infile (name_f1); //This is for reading in from // file vert_output??.dat strcat(strcat(name_f2,var->id_file),ext_f); ifstream length_in (name_f2); //This is for reading in from // the length??.dat file
//Number of arcs and verts are read in length_in>>num_of_arcs; infile>>num_of_vert; //The vert_arc relations are read in to this link list infile>>reading; while(!infile.eof()){ arc_rela.append(reading); infile>>reading; } //The arc_length information is read in to this link list length_in>>reading2; while(!length_in.eof()){ Hipergrafos en Ambientes SintĂŠticos para la DisposiciĂłn Espacial de Edificaciones â&#x20AC;&#x201C;I.Burgos,1999
71
len_rela.append(reading2); length_in>>reading2; }
} int heaviest_arc(int total_vert, IntList leng_list){ int i = 1; int candidate = 0; for (i = 1; i<=total_vert; i++){ if(leng_list.search1(i)>leng_list.search1(candidate)){ candidate = i; } } return(candidate); } void assign_hyper(int Arc_To_Draw, int x, int y, int z, IntList Ha_Center[]){ Ha_Center[Arc_To_Draw].remove(); //Hyperarc center coordinates are stored, as well as its identity Ha_Center[Arc_To_Draw].append(x); Ha_Center[Arc_To_Draw].append(y); Ha_Center[Arc_To_Draw].append(z); //Initilizing space list Space.append(x); Space.append(y); Space.append(z); } void points(int l, int m, int z_plane, int TransArray[][5]){ int wi;
//Counter for the for loop
for(wi=0; wi<BEESPACE; wi++){ if(wi==6) z_plane += U; //The rounding conditions for l and m translations //rint has failed to work, therefore new algo was develped by Ivan if((U*cosf((PI/2)-((PI/3)*wi))+l)<0) TransArray[wi][0] = int ((U*cosf((PI/2)-((PI/3)*wi))+l)-0.5); else TransArray[wi][0] = int ((U*cosf((PI/2)-((PI/3)*wi))+l)+0.5); //The rounding conditions for l and m translations //rint has failed to work, therefore new algo was developed by Ivan if((U*sinf((PI/2)-((PI/3)*wi))+m)<0) TransArray[wi][1] = int ((U*sinf((PI/2)-((PI/3)*wi))+m)-0.5); else TransArray[wi][1] = int ((U*sinf((PI/2)-((PI/3)*wi))+m)+0.5); TransArray[wi][2] = z_plane; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
72
TransArray[wi][3] = 0; TransArray[wi][4] = 0;
//Bit 3 initilized to 0, will be used later //Bit 4 initilized to 0, will be used later
}//END For } void test_order(int Heavy_Arc, IntList Vertex_Center[], int TranslationArray[][5], bool Ver_ver[], IntList Element[], int NUMBER_ARCS){ int i; int z; int j;
//Outer while counter variable //Second counter variable //Third counter variable
int keep_vertex; //Keeps the temp number of the vertex int keep_vertex2; //Keeps the temp number of the second vertex int lx,ja1, what_hell; // counter and various variables bool Verify[BEESPACE],ready,success; //True or false IntList Temporary;
//
//List to hold connections in space
for(i = 0; i<BEESPACE; i++){ Verify[i] = 0; } TESTING BEGINS //The minus 1 in the for loop is being used due to zero indexing of i for(i = 0; i<(Element[Heavy_Arc].length());i++ ){ Temporary.remove(); for(z=i+1; z<Element[Heavy_Arc].length()+1;z++){ for(j= 0; j<NUMBER_ARCS; j++){ if(j!=Heavy_Arc){ if((Element[j].check(Element[Heavy_Arc].search1(i))) ! = 0 && (Element[j].check(Element[Heavy_Arc].search1(z))) != 0) { if(Temporary.check(Element[Heavy_Arc].search1(z))==0){ Temporary.append(Element[Heavy_Arc].search1(z)); }//End if }//end of } }//End for #3(j) }//End for #2(z) switch (Temporary.length()){ case 0: //Length of Temporary is empty or 0 check_temp_coords(Element[Heavy_Arc].search1(i), Verify,
TranslationArray, 0);
if(Verify[0]==0){ keep_vertex = check_temp_av(TranslationArray); TranslationArray[keep_vertex][3] = 1;//Mark this provisional //point as not available //The number of the vertex
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
73
TranslationArray[keep_vertex][4] = Element[Heavy_Arc].search1(i); TranslationArray,
assign_coords(Element[Heavy_Arc].search1(i), keep_vertex, Vertex_Center, Ver_ver); } // if not break;
TranslationArray, 0);
case 1: check_temp_coords(Element[Heavy_Arc].search1(i), Verify, check_temp_coords(Temporary.search1(0), Verify, TranslationArray,
1);
if(!Verify[0] && !Verify[1]){ // first element (i) keep_vertex = check_temp_av(TranslationArray); TranslationArray[keep_vertex][3] = 1; //Mark this provisional //point as unavailable TranslationArray[keep_vertex][4] = Element[Heavy_Arc].search1(i); //AYUSH TranslationArray, Ver_ver);
assign_coords(Element[Heavy_Arc].search1(i), keep_vertex, Vertex_Center, // second element (z) keep_vertex2 = location(TranslationArray, keep_vertex); TranslationArray[keep_vertex2][3] = 1;//Mark this provisional //point as not available /*The number of the vertex*/ TranslationArray[keep_vertex2][4] = Temporary.search1(0);
assign_coords(Temporary.search1(0), keep_vertex2, TranslationArray, Vertex_Center , Ver_ver); }//end if else { if (Verify[0]) { ja1 = 0; while (ja1<BEESPACE) { if (TranslationArray[ja1][4] == Element[Heavy_Arc].search1(i)) { keep_vertex2 = location(TranslationArray, ja1); break; } // end if TranslationArray else ja1++; } // end while ja1
Temporary.search1(0);
TranslationArray[keep_vertex2][3] = 1;//Mark this //provisional //point as not //available TranslationArray[keep_vertex2][4] =
assign_coords(Temporary.search1(0), keep_vertex2, TranslationArray, Vertex_Center, Ver_ver); } // end if verify[0] Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
74
Temporary.search1(0)) {
if (Verify[1]) { ja1 = 0; while (ja1<BEESPACE) { if (TranslationArray[ja1][4] == keep_vertex =
location(TranslationArray, ja1);
break; } // end if TranslationArray else ja1++; } // end while ja1 TranslationArray[keep_vertex][3] = 1;//Mark this //provisional //point as not //available TranslationArray[keep_vertex][4] = Element[Heavy_Arc].search1(i);
if(!Ver_ver[Element[Heavy_Arc].search1(i)]) assign_coords(Element[Heavy_Arc].search1(i),
keep_vertex, TranslationArray, Vertex_Center, Ver_ver); } // end if Verify[1] } // end else break; default :
check_temp_coords(Element[Heavy_Arc].search1(i), Verify, TranslationArray, 0); for(lx=1; lx<Temporary.length(); lx++) { check_temp_coords(Temporary.search1(lx), Verify, TranslationArray, lx); } what_hell = 0; for(lx=0; lx<Temporary.length(); lx++) what_hell+=Verify[lx]; if (!what_hell) { // None vertices are drawn keep_vertex = check_temp_av(TranslationArray); ready = 0; while (ready ==0) { pre_location(TranslationArray, Temporary.length(), success, keep_vertex); if (success==0) keep_vertex +=1; else { ready = 1; break; } //end else }
Element[Heavy_Arc].search1(i);
// end while !ready
TranslationArray[keep_vertex][3] = 1;//Mark this //provisional //point as not //available TranslationArray[keep_vertex][4] = assign_coords(Element[Heavy_Arc].search1(i),
keep_vertex, TranslationArray, Vertex_Center, Ver_ver);
keep_vertex);
//Ayush2 for(lx=0; lx<Temporary.length(); lx++) { keep_vertex2 = location(TranslationArray,
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
75
TranslationArray[keep_vertex2][3] = 1;//Mark //this //provisi //onal //point //as not //availab //le TranslationArray[keep_vertex2][4] = Temporary.search1(lx); assign_coords(Temporary.search1(lx),
keep_vertex2, TranslationArray, Vertex_Center, Ver_ver); }
// end for lx =1
} // end if what_hell break; // default
}//End switch }//End outer most for(i) clear_point(TranslationArray);
// initializes all provisional points
}//End Test order void check_temp_coords(int element, bool Verify[], int TranslationArray[][5], int offset) { int ja; //Counter variable for(ja = 0; ja<BEESPACE; ja++){ if(TranslationArray[ja][4] == element){ Verify[offset] = 1; //The element has been taken break; //Thats all folks } } } int check_temp_av(int TranslationArray[][5]){ int ja; bool OKAY;
//Counter variable //Boolean checking variable
for(ja = 0; ja<BEESPACE; ja++){ check_space(ja, TranslationArray, OKAY); if(TranslationArray[ja][3] == 0 && OKAY == 1){ return ja; } } return 0; } void assign_coords(int Vertex_ID, int temp_pos, int TranslationArray[][5], IntList Vertex_Center[], bool Ver_ver[]){ Vertex_Center[Vertex_ID].remove();
//Clearing the vertex list
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
76
//Assigning the particular vertex its coordinates, will be used in draw function Vertex_Center[Vertex_ID].append(TranslationArray[temp_pos][0]); Vertex_Center[Vertex_ID].append(TranslationArray[temp_pos][1]); Vertex_Center[Vertex_ID].append(TranslationArray[temp_pos][2]); //Assigning the coordinates to space, so that they are not used again Space.append(TranslationArray[temp_pos][0]); Space.append(TranslationArray[temp_pos][1]); Space.append(TranslationArray[temp_pos][2]); Ver_ver[Vertex_ID] = 1; } int location(int TranslationArray[][5], int keep_ver){ int int int int int
p0 p1 p2 p3 p4
= = = = =
keep_ver+1; keep_ver-1; keep_ver+6; keep_ver+7; keep_ver+5;
if (keep_ver ==0) { p1 = 5; p4 = 11; } if (keep_ver ==5) { p0 = 0; p3 = 6; } if (keep_ver ==6) { p1 = 11; p4 = 5; } if (keep_ver ==11) { p0 = 6; p3 = 0; } if (p2>11) p2 = p2-BEESPACE; if (p3>11) p3 = p3-BEESPACE; if (p4>11) p4 = p4-BEESPACE; if (TranslationArray[p0][3] == 0) return p0; else{ if (TranslationArray[p1][3] == 0) return p1; else { if (TranslationArray[p2][3] == 0) return p2; else{ if (TranslationArray[p3][3] == 0) return p3; else{ if (TranslationArray[p4][3] == 0) return p4; }//END-else #4 }//END-else #3 }//END-else #2 }//END-else #1 return 0; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
77
} void pre_location(int TranslationArray[][5], int Long, bool &success, int keep_ver){ success = 1; int p0 = keep_ver+1; int p1 = keep_ver-1; int p2 = keep_ver+6; int p3 = keep_ver+7; int p4 = keep_ver+5; int counter = 0; if (keep_ver ==0) { p1 = 5; p4 = 11; } if (keep_ver ==5) { p0 = 0; p3 = 6; } if (keep_ver ==6) { p1 = 11; p4 = 5; } if (keep_ver ==11) { p0 = 6; p3 = 0; } if (p2>11) p2 = p2-BEESPACE; if (p3>11) p3 = p3-BEESPACE; if (p4>11) p4 = p4-BEESPACE; switch (Long){ case 2: while (counter<2) { if (TranslationArray[p0][3] counter=counter +1; if (TranslationArray[p1][3] counter=counter +1; if (TranslationArray[p2][3] counter=counter +1; if (TranslationArray[p3][3] counter=counter +1; if (TranslationArray[p4][3] counter +=1; else { success = success *0; break; } // end else } //end while if (counter ==2) success = success *1; break; // 2 case 3:
== 0) == 0) == 0) == 0) == 0)
if (TranslationArray[p0][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p1][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p2][3] == 0)
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
78
else break;
success
= success *1;
success
= success *0;
//3
case 4: if (TranslationArray[p0][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p1][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p2][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p3][3] == 0) success = success *1; else success = success *0; break;
//4
case 5: if (TranslationArray[p0][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p1][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p2][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p3][3] == 0) success = success *1; else success = success *0; if (TranslationArray[p4][3] == 0) success = success *1; else success = success *0; break; //5 }
// end switch
} // end pre_location void clear_point(int TranslationArray[][5]){ int ja; for(ja = 0; ja<BEESPACE; ja++) TranslationArray[ja][0] TranslationArray[ja][1] TranslationArray[ja][2] TranslationArray[ja][3] TranslationArray[ja][4] } // end for ja }
{ = 0; = 0; = 0; = 0; = 0;
//end clear_poit
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
79
void second_draw(int Heavy_Arc, IntList Vertex_Center[], IntList Hyper_Center[], int TranslationArray[][5], bool Ver_ver[], bool Ver_arc[], int NumberOfArcs, IntList Element[]){ int i, j, z; int wi,wj,wz; int mutual, mutual2; int si,lx,vi,yz; bool success;
//Counter Variable //Counter Variable //The mutual vertex //Counter Variable2
// Provisional Lists IntList Temporary,Temporary2; int TranslationArray2[BEESPACE][5]; bool Verify[BEESPACE]; int ja1,what_hell,ready;//Counter VariableXX int keep_vertex; //Keeps the temp number of the vertex int keep_vertex2; //Keeps the temp number of the second vertex bool OKAY; //Boolean flag clear_point(TranslationArray2); for(i = 0; i<BEESPACE; i++){ Verify[i] = 0; } for(i = 0; i<(Element[Heavy_Arc].length()); i++){ mutual = Element[Heavy_Arc].search1(i); points(Vertex_Center[mutual].search1(0), Vertex_Center[mutual].search1(1), 3, TranslationArray); //Check_first body for(si=0; si<BEESPACE; si++){ check_space(si, TranslationArray, OKAY); if(OKAY == 0){ TranslationArray[si][3] = 1; break; }//END-if }//END-for #2 //******************************************************************************** //******************************************************************************** for(j = 0; j<NumberOfArcs; j++){ // clear total list Temporary.remove(); if (j!=Heavy_Arc) { //AYUSH if (Element[j].check(mutual)) for(z = 0; z<Element[j].length(); z++){ Ver_ver[Element[j].search1(z)]
if (mutual!=Element[j].search1(z) && ! {
&& !Temporary.check(Element[j].search1(z))) Temporary.append(Element[j].search1(z));
} } }
// END-for z
// END-if j#Heavy_Arc
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
80
switch (Temporary.length()){ case 0: //Length of Temporary is empty or 0 if (!Ver_ver[mutual]){ check_temp_coords(mutual, Verify, TranslationArray, 0); if(Verify[0]==0){ keep_vertex = check_temp_av(TranslationArray); point as not available
TranslationArray[keep_vertex][3] = 1;//Mark this provisional //The number of the vertex TranslationArray[keep_vertex][4] = mutual; assign_coords(mutual, keep_vertex, TranslationArray, Vertex_Center, Ver_ver); } // if not for(i = 0; i<BEESPACE; i++){ Verify[i] = 0; } } break; case 1:
TranslationArray, 1);
// JUST ONE VERTEX RELATED TO MUTUAL
check_temp_coords(Temporary.search1(0), Verify, if(!Verify[1]){
UPPER LEVEL
for(vi = 6; vi<BEESPACE; vi++){
// ALWAYS ASSIGN SPACE IN
check_space(vi, TranslationArray, OKAY); if (yes_or_not(vi, TranslationArray)&& OKAY) { TranslationArray[vi][3]=1; // MARK AS NOT AVAILABLE TranslationArray[vi][4]= Temporary.search1(0); assign_coords(Temporary.search1(0), vi, TranslationArray,Vertex_Center, Ver_ver); break; } // END-if yes_or_not }
//END-for vi
} // END-if Verify[0] for(yz = 0; yz<BEESPACE; yz++){ Verify[yz] = 0; } break; case 2:
// TWO VERTICES RELATED TO MUTUAL SO A HYPERARC COMES
keep_vertex = check_temp_av(TranslationArray); TranslationArray[keep_vertex][3] =1; assign_hyper(j,TranslationArray[keep_vertex] [0],TranslationArray[keep_vertex][1], TranslationArray[keep_vertex][2], Hyper_Center ); points(TranslationArray[keep_vertex] [0],TranslationArray[keep_vertex][1], TranslationArray[keep_vertex][2], TranslationArray2); // PARALELL POINTS IN SPACE Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
81
//Check_first body for(si=0; si<BEESPACE; si++){ check_space(si, TranslationArray2, OKAY); if(OKAY == 0){ TranslationArray2[si][3] = 1; break; }//END-if }//END-for si check_temp_coords(Temporary.search1(0), Verify, TranslationArray2, 0); check_temp_coords(Temporary.search1(1), Verify, TranslationArray2, 1); if (Verify[0]==1 && Verify[1]==1) break; if (Verify[0]==0 && Verify[1]==0) { keep_vertex = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex][3] = 1;
//Mark this //provisional //point as //unavailable TranslationArray2[keep_vertex][4] = Temporary.search1(0); assign_coords(Temporary.search1(0), keep_vertex, TranslationArray2, Vertex_Center, Ver_ver); keep_vertex2 = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex2][3] = 1;//Mark provisional //point as not available TranslationArray2[keep_vertex2][4] = Temporary.search1(1); assign_coords(Temporary.search1(1), keep_vertex2, TranslationArray2,Vertex_Center, Ver_ver); } // END-if Verify[0]==0 AND Verify[1]==0 else { if (Verify[0]==1){ keep_vertex2 = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex2][3] = 1;//Mark provisional //point as not available TranslationArray2[keep_vertex2][4] = Temporary.search1(1); assign_coords(Temporary.search1(1), keep_vertex2, TranslationArray2,Vertex_Center, Ver_ver); } //END-Verify0 if (Verify[1]==1){ keep_vertex = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex][3] = 1;//Mark provisional //point as unavailable TranslationArray2[keep_vertex][4] = Temporary.search1(0); assign_coords(Temporary.search1(0), keep_vertex, TranslationArray2, Vertex_Center, Ver_ver); } //END-Verify1 } // END-else for(yz = 0; yz<BEESPACE; yz++){ Verify[yz] = 0; } break; default:
// MORE THAN 2 VERTICES OH...BOY!!!! A HYPERARC COMES
keep_vertex = check_temp_av(TranslationArray); TranslationArray[keep_vertex][3] =1; assign_hyper(j,TranslationArray[keep_vertex] [0],TranslationArray[keep_vertex][1], Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
82
TranslationArray[keep_vertex][2], Hyper_Center ); points(TranslationArray[keep_vertex] [0],TranslationArray[keep_vertex][1], TranslationArray[keep_vertex][2], TranslationArray2); // PARALELL POINTS IN SPACE for(si=0; si<BEESPACE; si++){ check_space(si, TranslationArray2, OKAY); if(OKAY == 0){ TranslationArray2[si][3] = 1; break; }//END-if }//END-for si //******************************************************************************** //******************************************************************************** // MINI ROUTINE //******************************************************************************** //******************************************************************************** for(wi=0; wi<Temporary.length(); wi++){ Temporary2.remove(); for(wz=wi+1; wz<Temporary.length()+1;wz++){
//Ayush u da man
for(wj= 0; wj<NumberOfArcs; wj++){ if(wj!=j && !Ver_arc[wj]){ if((Element[wj].check(Temporary.search1(wi))) != 0 && (Element[wj].check(Temporary.search1(wz))) != 0) { if(!Temporary2.check(Temporary.search1(wz))){ Temporary2.append(Temporary.search1(wz)); }//End if Temporary2 }
} //end if Element(wj) // END-if wj#j
} //End for #3(wj) switch (Temporary2.length()) { case 0 : mutual2 = Temporary.search1(wi); check_temp_coords(mutual2, Verify, TranslationArray2, wi); if(Verify[wi]==0){ keep_vertex = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex][3] = 1;//Mark //prov.point as not available TranslationArray2[keep_vertex][4] = mutual2; assign_coords(mutual2, keep_vertex, TranslationArray2, Vertex_Center, Ver_ver); } // if not for(yz = 0; yz<BEESPACE; yz++){ Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
83
Verify[yz] = 0; } break; case 1 : check_temp_coords(Temporary.search1(wi), Verify, TranslationArray2, 0); check_temp_coords(Temporary.search1(wz), Verify, TranslationArray2, 1); if(Verify[0]==0 && Verify[1]==0){ keep_vertex = check_temp_av(TranslationArray2); TranslationArray2[keep_vertex][3]=1; // MARK AS NOT //AVAILABLE TranslationArray2[keep_vertex][4]= Temporary.search1(wi); assign_coords(Temporary.search1(wi), keep_vertex, TranslationArray2,Vertex_Center, Ver_ver); keep_vertex2 = location(TranslationArray2, keep_vertex); TranslationArray2[keep_vertex2][3] = 1;//Mark this //prov.point as not available TranslationArray2[keep_vertex2][4] = Temporary.search1(wz); assign_coords(Temporary.search1(wz),keep_vertex2, TranslationArray2,Vertex_Center, Ver_ver); } // END-if Verify(0) else { if(Verify[0]==1) { ja1=0; while (ja1<BEESPACE) { if (TranslationArray2[ja1][4] == Temporary.search1(wi)) { keep_vertex2 = location(TranslationArray2, ja1); break; } // end if TranslationArray else ja1++; } // end while ja1 TranslationArray2[keep_vertex2][3] = 1;//Mark this //prov.point as not available TranslationArray2[keep_vertex2][4] = Temporary.search1(wz); assign_coords(Temporary.search1(wz),keep_vertex2, TranslationArray2,Vertex_Center, Ver_ver); } // END-if verify0 if(Verify[1]==1) { ja1=0; while (ja1<BEESPACE) { if (TranslationArray2[ja1][4] == Temporary.search1(wz)) { keep_vertex = location(TranslationArray2, ja1); break; } // end if TranslationArray else ja1++; } // end while ja1 TranslationArray2[keep_vertex][3] = 1;//Mark this //prov.point as not available TranslationArray2[keep_vertex][4] = mutual; assign_coords(mutual,keep_vertex, TranslationArray2,Vertex_Center, Ver_ver); } // END-if verify1 } // END-else Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
84
for(yz = 0; yz<BEESPACE; yz++){ Verify[yz] = 0; } break; default : check_temp_coords(mutual, Verify, TranslationArray2, 0); for(lx=1; lx<Temporary2.length()+1; lx++) check_temp_coords(Temporary2.search1(lx), Verify, TranslationArray, lx); what_hell = 0; for(lx=0; lx<Temporary2.length()+1; lx++) what_hell = what_hell + Verify[lx]; if (what_hell == 0) { // None vertices are drawn keep_vertex = check_temp_av(TranslationArray2); ready = 0; while (ready==0) { pre_location(TranslationArray2, Temporary2.length(), success, keep_vertex); if (success==0) keep_vertex +=1; else { ready = 1; break; } //end else } // end while NOT ready TranslationArray2[keep_vertex][3] = 1;//Mark this //prov.point as not available TranslationArray2[keep_vertex][4] = mutual; assign_coords(mutual, keep_vertex, TranslationArray2,Vertex_Center, Ver_ver); for(lx=0; lx<Temporary2.length()+1; lx++) { keep_vertex2 = location(TranslationArray2, keep_vertex); TranslationArray2[keep_vertex2][3] = 1;//Mark //this prov.point as not available TranslationArray2[keep_vertex2][4] = Temporary.search1(lx); assign_coords(Temporary.search1(lx), keep_vertex2, TranslationArray2, Vertex_Center, Ver_ver); } // end for lx =1 } // end if what_hell break; } // END-switch Temporary2 }
// END-for wz
} // END-for wi for(yz = 0; yz<BEESPACE; yz++){ Verify[yz] = 0; } break; } }
// END-switch
// END-for j
clear_point(TranslationArray2); clear_point(TranslationArray); //******************************************************************************** //******************************************************************************** Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
85
Ver_arc[j] =1; }//END-for #1 }
// END-second_draw
void check_space(int SI, int TranslationArray[][5], bool &OK){ int counter;
//Counter Variable
for(counter=0; counter<=Space.length()-3; counter+=3){ if((TranslationArray[SI][0] == Space.search1(counter)) && (TranslationArray[SI][1] == Space.search1(counter+1)) && (TranslationArray[SI][2] == Space.search1(counter+2))){ OK = 0; break; }//END-if else{ OK = 1; } }
}
bool yes_or_not(int vi, int TranslationArray[][5]) { if (TranslationArray[vi][3] == 0) return (1); else return (0);
}
void Displaying(int TranslationArray[][5]){ int si; for(si=0; si<BEESPACE; si++){ cout<<"TranslationArray2[si][0]: cout<<"TranslationArray2[si][1]: cout<<"TranslationArray2[si][2]: cout<<"TranslationArray2[si][3]: cout<<"TranslationArray2[si][4]: }
"<<TranslationArray[si][0]<<endl; "<<TranslationArray[si][1]<<endl; "<<TranslationArray[si][2]<<endl; "<<TranslationArray[si][3]<<endl; "<<TranslationArray[si][4]<<endl;
} void secondary_init(IntList Element[], IntList Vert_Center[]){ int jayo, j; char name_f1[17] ="proportion"; char ext_f[] = ".dat"; strcat(strcat(name_f1,var->id_file),ext_f); ifstream infile (name_f1); //This is for reading in from // file vert_output??.dat
for(jayo = 0; jayo<=var->NUMBER_OF_ARCS; jayo++){ for(j = 0; j<Element[jayo].length(); j++){ var->Elem[jayo].append(Element[jayo].search1(j)); } var->edges[0].append(jayo); Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
86
var->I[0].append(jayo); } for(jayo=1; jayo<=var->NUMBER_OF_VERTICES+1; jayo++){ var->new_vert[0].append(jayo); if(file_flag == -1){ var->check[jayo][0] = Vert_Center[jayo].search1(0); var->check[jayo][1] = Vert_Center[jayo].search1(2);//ogl coords var->check[jayo][2] = Vert_Center[jayo].search1(1)*(-1);//ogl coords } var->mv_center[jayo][0] = 0; var->mv_center[jayo][1] = 0; var->mv_center[jayo][2] = 0; infile>>var->dim[jayo][0]; infile>>var->dim[jayo][1]; infile>>var->dim[jayo][2]; } for(jayo = 1; jayo<= var->NUMBER_OF_VERTICES; jayo++){ // taking the arcs that belong to a vertex for(j = 0; j<var->NUMBER_OF_ARCS; j++){ if(Element[j].check(jayo)) if(!var->vertex[jayo].check(j+1)) var->vertex[jayo].append(j+1); } } } void flag_make(IntList Ve_Center[], IntList Element[], int NUMBER_VERTS, int NUMBER_ARCS){ int i; float j; int z; int TEMP_VAR; int ARRAY_POSITION;
//To read in from arc_output.dat in a correct manner
char name_f1[17] ="arc_output"; char name_f2[20] = "coordinates"; char ext_f[] = ".dat"; var->wow=atoi(var->id_file); sprintf(var->id_file, "%d",var->wow ); strcat(strcat(name_f1,var->id_file),ext_f); strcat(strcat(name_f2, var->id_file), ext_f); ifstream arc_in (name_f1); ifstream cor_in (name_f2); //
//Variable to ready in arc to vert //Varialbe to read in existing coords
VARIABLES INITILIZED file_flag = access(name_f2, F_OK); arc_in>>NUMBER_ARCS; //Number of arcs read in from arc to vert relation file NUMBER_ARCS--;
for(i = 0; i<=NUMBER_VERTS && file_flag == 0; i++){ cor_in>>var->check[i][0]; cor_in>>var->check[i][1]; cor_in>>var->check[i][2]; } for(i=0; i<=NUMBER_ARCS; i++){ arc_in>>ARRAY_POSITION; ARRAY_POSITION--; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
87
arc_in>>TEMP_VAR; for(j=0; j<TEMP_VAR; j++){ arc_in>>z; Element[ARRAY_POSITION].append(z); } } //z = 0; }
Programa perfm.C: Este programa controla los menúes, la relción de proporciones de las unidades, las operaciones de abstracción y expansión y edición del hipergrafo en general.
// PERFM.C #include <cave_ogl.h> #include <iostream.h> #include <fstream.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <GL/gl.h> #include <GL/glc.h> #include <unistd.h> #include <gl/device.h> #include <interaction.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "global.H" #include "IntList.h" #define placeMenuByHead 1 /* 1 or 0*/ #define max_load 200 //#define min_dist 0.7 floatMenu *modeMenu; //Menu 1 floatMenu *modeMenu2; //Menu 2 floatMenu *modeMenu3; //Menu 3 extern global *var;
float distance(float a[3], float b[3]); // // // void GLDraw(int select_shape, int which_hyper); // // // void initScene(void); // // // void drawScene(); // // Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
88
// // void frameScene(); // // // // void // // //
initModeMenu();
void // // //
placeModeMenu();
void // // // void // // //
drawModeMenu();
void // // //
abstraction();
void // // //
refinement();
void // // //
sphe_spa_1();
void // // //
sphe_spa_2();
drawmodeMenu2();
void spa_sphe_1(); // // // void spa_sphe_2(); // // // void change_pro(); // // // void // // //
quit();
void drawCube(int si); // Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
89
// // void file_coords(); // // //
float distance(float a[3], float b[3]) { int i; float c[3], dist; for( i=0; i<3; i++) c[i] = a[i] - b[i]; dist = sqrtf(c[0]*c[0] + c[1]*c[1] + c[2]*c[2]); return dist; } void GLDraw(int select_shape,int which_hyper) { int si=0; float coord_x = 0, coord_y = 0, coord_z = 0, coord_x1 = 0, coord_y1 = 0, coord_z1 = 0; GLUquadricObj* sphere_quad; sphere_quad = gluNewQuadric();
switch(select_shape){ case 0: glPushMatrix(); glColor3f (0.0, 1.0, 0.0); glLineWidth(2.0); glBegin (GL_LINES); if (var->cntvert==1){ glVertex3f(var->check[var->Elem[which_hyper].search1(0)][0], var->check[var->Elem[which_hyper].search1(0)][1], var->check[var->Elem[which_hyper].search1(0)][2]); glVertex3f(var->check[var->Elem[which_hyper].search1(1)][0], var->check[var->Elem[which_hyper].search1(1)][1], var->check[var->Elem[which_hyper].search1(1)][2]); } else{ if (var->I[var->father].check(which_hyper)){ if (var->Elem[which_hyper].search1(0)>100 && var->Elem[which_hyper].search1(1)>100){ coord_x = (var->mv_center[var->Elem[which_hyper].search1(0)-100][0]); coord_y = (var->mv_center[var->Elem[which_hyper].search1(0)-100][1]); coord_z = (var->mv_center[var->Elem[which_hyper].search1(0)-100][2]); Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
90
coord_x1 = (var->mv_center[var->Elem[which_hyper].search1(1)-100][0]); coord_y1 = (var->mv_center[var->Elem[which_hyper].search1(1)-100][1]); coord_z1 = (var->mv_center[var->Elem[which_hyper].search1(1)-100][2]); }
// end if-else else{ if (var->Elem[which_hyper].search1(0)>100){ coord_x = (var->mv_center[var->Elem[which_hyper].search1(0)-100][0]); coord_y = (var->mv_center[var->Elem[which_hyper].search1(0)-100][1]); coord_z = (var->mv_center[var->Elem[which_hyper].search1(0)-100][2]); coord_x1 = (var->check[var->Elem[which_hyper].search1(1)][0]); coord_y1 = (var->check[var->Elem[which_hyper].search1(1)][1]); coord_z1 = (var->check[var->Elem[which_hyper].search1(1)][2]); } //end if var->Elem (0) else{ // #3 if (var->Elem[which_hyper].search1(1)>100){ coord_x = (var->check[var->Elem[which_hyper].search1(0)][0]); coord_y = (var->check[var->Elem[which_hyper].search1(0)][1]); coord_z = (var->check[var->Elem[which_hyper].search1(0)][2]); coord_x1 = (var->mv_center[(var->Elem[which_hyper].search1(1))-100][0]); coord_y1 = (var->mv_center[(var->Elem[which_hyper].search1(1))-100][1]);
coord_z1 = (var->mv_center[(var->Elem[which_hyper].search1(1))-100][2]); } //end if var->Elem (1) else{ // #4 coord_x = (var->check[var->Elem[which_hyper].search1(0)][0]); coord_y = (var->check[var->Elem[which_hyper].search1(0)][1]); coord_z = (var->check[var->Elem[which_hyper].search1(0)][2]);
coord_x1 = (var->check[var->Elem[which_hyper].search1(1)][0]); coord_y1 = (var->check[var->Elem[which_hyper].search1(1)][1]); coord_z1 = (var->check[var->Elem[which_hyper].search1(1)][2]); } //#4 } //end else #3 } // end else-2 glVertex3f(coord_x,coord_y,coord_z); glVertex3f(coord_x1,coord_y1,coord_z1); }// end else } // end if which_hyper in I{var->father} glEnd(); glLineWidth(0.8); glPopMatrix(); break; case 1: if (var->cntvert==1){ for(si = 1; si<=var->NUMBER_OF_VERTICES; si++){ glPushMatrix(); glTranslatef(var->check[si][0],var->check[si][1],var->check[si][2]); /*red color*/ Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
91
glColor3f(var->shapeCol[si][0], var->shapeCol[si][1], var->shapeCol[si][2]); if(var->selection5==1 && var->mark_draw[si]==1){ drawCube(si); //draw box instead of sphere } else{ gluSphere(sphere_quad,0.5, 10, 10); } glPopMatrix(); /* Just for text */ sprintf (var->letter , "%d", si); glColor3f(1.0, 1.0, 0.0); glRasterPos3f((var->check[si][0])+.5, (var->check[si][1])+.5, (var->check[si][2])+.75); glcRenderString(var->letter); }//end for 1 }//end if else{ for(si = 0; si<var->new_vert[var->father].length(); si++){ if (var->new_vert[var->father].search1(si)>100){ if(var->mv_center[var->new_vert[var->father].search1(si)-100][0] + var->mv_center[var->new_vert[var->father].search1(si)-100][1] + var->mv_center[var->new_vert[var->father].search1(si)-100][2] !=0){ coord_x = (var->mv_center[var->new_vert[var->father].search1(si)-100][0]); coord_y = (var->mv_center[var->new_vert[var->father].search1(si)-100][1]); coord_z = (var->mv_center[var->new_vert[var->father].search1(si)-100][2]); glPushMatrix(); glTranslatef(coord_x, coord_y, coord_z); glColor3fv(var->MVCol[var->new_vert[var->father].search1(si)-100]); gluSphere(sphere_quad, 0.6, 10, 10); glPopMatrix(); } } else{ coord_x = (var->check[var->new_vert[var->father].search1(si)][0]); coord_y = (var->check[var->new_vert[var->father].search1(si)][1]); coord_z = (var->check[var->new_vert[var->father].search1(si)][2]); glPushMatrix(); glTranslatef(coord_x, coord_y, coord_z); glColor3fv(var->shapeCol[var->new_vert[var->father].search1(si)]); if(var->selection5==1 && var->mark_draw[si]==1){ drawCube(si); //draw box instead of sphere
}
} else{ gluSphere(sphere_quad,0.5, 10, 10); } glPopMatrix();
// Just for text // if(coord_x + coord_y + coord_z!=0){ glPushMatrix(); sprintf (var->letter , "%d", Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
92
var->new_vert[var->father].search1(si)); glColor3f(1.0, 1.0, 0.0); glRasterPos3f((coord_x)+.5,(coord_y)+.5,(coord_z)+.5); glcRenderString(var->letter); glPopMatrix(); } // end if }//end for 2 // for(si = 0; si<var->new_vert[var->global_a].length(); si++){ coord_x = (var->check[var->new_vert[var->global_a].search1(si)][0]); coord_y = (var->check[var->new_vert[var->global_a].search1(si)][1]); coord_z = (var->check[var->new_vert[var->global_a].search1(si)][2]); glPushMatrix(); glTranslatef(coord_x, coord_y, coord_z); glColor3fv(var->shapeCol[var->new_vert[var->global_a].search1(si)]); gluSphere(sphere_quad, 0.5, 10, 10); glPopMatrix(); } //end for si // }//end else break; case 2: if (var->I[var->father].check(which_hyper)){ //if (var->edges[var->father].check(which_hyper)){ for(si = 1; si<=var->Elem[which_hyper].length(); si++){ if (var->Elem[which_hyper].search1(si)>100){ coord_x += (var->mv_center[var->Elem[which_hyper].search1(si)-100][0]); coord_y += (var->mv_center[var->Elem[which_hyper].search1(si)-100][1]); coord_z += (var->mv_center[var->Elem[which_hyper].search1(si)-100][2]); } //end if else{ coord_x += (var->check[var->Elem[which_hyper].search1(si)][0]); coord_y += (var->check[var->Elem[which_hyper].search1(si)][1]); coord_z += (var->check[var->Elem[which_hyper].search1(si)][2]); } //end else } coord_x/= var->Elem[which_hyper].length(); coord_y/= var->Elem[which_hyper].length(); coord_z/= var->Elem[which_hyper].length(); // Dibuja Baricentros// glPushMatrix(); glTranslatef(coord_x, coord_y, coord_z); //green color// glColor3f(0,0,1); gluSphere(sphere_quad,0.35, 10, 10); glPopMatrix(); glPushMatrix(); //red color// glColor3f(0, 1, 0); // Espesor de la LInea // Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
93
glLineWidth(2.0); glBegin(GL_LINES); for(si = 0; si<var->Elem[which_hyper].length(); si++) { glVertex3f(coord_x, coord_y, coord_z); if (var->Elem[which_hyper].search1(si)>100){ glVertex3f(var->mv_center[var->Elem[which_hyper].search1(si)-100][0], var->mv_center[var->Elem[which_hyper].search1(si)-100][1], var->mv_center[var->Elem[which_hyper].search1(si)-100][2]); } else{ glVertex3f(var->check[var->Elem[which_hyper].search1(si)][0], var->check[var->Elem[which_hyper].search1(si)][1], var->check[var->Elem[which_hyper].search1(si)][2]); } } glEnd(); // Espesor de linea por defecto // glLineWidth(0.8); glPopMatrix(); } //if in I var->father break; }/*end switch*/ } /* end GLdraw */
void initScene(void) { glcContext(glcGenContext()); glcFont(glcNewFontFromFamily(1,"Times")); glcFontFace(1, "bold"); glcScale(24.f, 24.f); GLfloat GLfloat GLfloat GLfloat
light0_ambient[] = { .3, .3, .3, 0.0 }; light0_diffuse[] = { .8, 0.8, 0.8, 0.0 }; light0_specular[] = { 0.4, 0.4, 0.5, 0.0 }; light0_position[] = {10.0, 10.0, 00.0, 0.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLightfv(GL_LIGHT0, glLightfv(GL_LIGHT0, glLightfv(GL_LIGHT0, glLightfv(GL_LIGHT0,
GL_AMBIENT, light0_ambient); GL_DIFFUSE, light0_diffuse); GL_SPECULAR, light0_specular); GL_POSITION, light0_position);
glEnable(GL_AUTO_NORMAL); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glShadeModel(GL_SMOOTH); glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); //add by IVAN var->modeMenuOption = -1; initModeMenu(); } void frameScene() { // added by Lew int i, z, j; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
94
float palm_pos[3], fake_vert[3]; float old_mv[max_load/2][3]; /* * Checks if the hand is grabbing a shape. * If grabbing, reverse the color and move the shape */ if (CAVEMasterDisplay()){ if (CAVEBUTTON1 && var->selection ==0){ CAVEGetPalmPosition(palm_pos); for (i = 1; i<=var->NUMBER_OF_VERTICES; i++) { fake_vert[0] = var->check[i][0]; fake_vert[1] = var->check[i][1]; fake_vert[2] = var->check[i][2]; if( distance(palm_pos, fake_vert) < var->min_dist) { if(var->new_vert[var->father].check(i)){ var->check[i][0] = palm_pos[0]; var->check[i][1] = palm_pos[1]; var->check[i][2] = palm_pos[2]; var->shapeCol[i][0] = .7; var->shapeCol[i][1] = .7; var->shapeCol[i][2] = .7; break; } var->mark_draw[i]=0; } } for(i = 1; i<=var->cntvert; i++){ old_mv[i][0] = var->mv_center[i][0]; old_mv[i][1] = var->mv_center[i][1]; old_mv[i][2] = var->mv_center[i][2]; } for (i = 1; i<=var->cntvert; i++) { fake_vert[0] = var->mv_center[i][0]; fake_vert[1] = var->mv_center[i][1]; fake_vert[2] = var->mv_center[i][2]; if( distance(palm_pos, fake_vert) < var->min_dist) { var->mv_center[i][0] = palm_pos[0]; var->mv_center[i][1] = palm_pos[1]; var->mv_center[i][2] = palm_pos[2]; var->MVCol[i][0] = .7; var->MVCol[i][1] = .7; var->MVCol[i][2] = .7; for(z = 0; z<var->new_vert[i].length(); z++){ if (var->new_vert[i].search1(z)<100){ var->check[var->new_vert[i].search1(z)][0]+= (palm_pos[0]-old_mv[i][0]); var->check[var->new_vert[i].search1(z)][1]+= (palm_pos[1]-old_mv[i][1]); var->check[var->new_vert[i].search1(z)][2]+= (palm_pos[2]-old_mv[i][2]); }// if else{ var->mv_center[var->new_vert[i].search1(z)-100][0]+= (palm_pos[0]-old_mv[i][0]); var->mv_center[var->new_vert[i].search1(z)-100][1]+= Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
95
(palm_pos[1]-old_mv[i][1]); var->mv_center[var->new_vert[i].search1(z)-100][2]+= (palm_pos[2]-old_mv[i][2]); for(j=0; j<var->new_vert[var->new_vert[i].search1(z)-100].length(); j++){ if(var->new_vert[var->new_vert[i].search1(z)].search1(j)<100){ var->check[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)][0] += (palm_pos[0]-old_mv[i][0]); var->check[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)][1] += (palm_pos[1]-old_mv[i][1]); var->check[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)][2] += (palm_pos[2]-old_mv[i][2]); }// if else{ var->mv_center[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)] (palm_pos[0]-old_mv[i][0]); var->mv_center[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)] (palm_pos[1]-old_mv[i][1]); var->mv_center[var->new_vert[var->new_vert[i].search1(z)-100].search1(j)] (palm_pos[2]-old_mv[i][2]);
[0] += [1] += [2] += }
}// for j } // else
}
} var->selection4 = 0; break;
} }//end if else { switch(var->which_menu_is_used){ case 0: switch(var->selection){ case 1: abstraction(); break; case 2: refinement(); break; case 3: //spa_sphe(); break; case 6: quit(); break; default: break; } break; default: switch(var->selection){ case 1: sphe_spa_1(); break; case 2: sphe_spa_2(); break; case 3: change_pro(); break; Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
96
case 4: spa_sphe_1(); break; case 5: spa_sphe_2(); break; } }
}
//If wand is touching menu, then control_loop = 0; //else control_loop = 1; if ((CAVEBUTTON3!=0) && (var->previous == 0)){ var->selection3+=1; var->selection3 = var->selection3%2; } } // end if CAVEMasterDisplay() var->previous = CAVEBUTTON3;
} void drawScene(){ int si; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); for(si = 1; si<=var->NUMBER_OF_VERTICES; si++){ if(var->selection !=1 && !CAVEBUTTON1 && var->ref2==0){ var->shapeCol[si][0]=1.0; var->shapeCol[si][1]=0.0; var->shapeCol[si][2]=0.0; } } if(var->selection!=1 && var->cntvert!=1 &&!CAVEBUTTON1 && var->ref ==0) for (si = 1; si<=var->cntvert; si++){ var->MVCol[si][0] = .5; var->MVCol[si][1] = .2; var->MVCol[si][2] = .8; } GLDraw(1,0); //don't care about hyperarcs, drawing vertices for(si= 0; si<=var->NUMBER_OF_ARCS; si++){ if(var->Elem[si].length()>2){ GLDraw(2, si); //passing hyperarc } else GLDraw(0, si); //passing single arc } if (var->selection3 == 1) { placeModeMenu(); drawModeMenu(); } }
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
97
//add by IVAN void initModeMenu(){ modeMenu = new floatMenu; modeMenu2 = new floatMenu; modeMenu3 = new floatMenu; modeMenu->setMenuOrientation(MENU_SQUARE); // shows a nxn matrix dimension modeMenu2->setMenuOrientation(MENU_HORIZONTAL);// shows a nxn matrix dimension modeMenu3->setMenuOrientation(MENU_HORIZONTAL);// shows a nxn matrix dimension modeMenu->setScale(.55, 0.41, 1.0); modeMenu2->setScale(.55, 0.41, 1.0); modeMenu3->setScale(.55, 0.41, 1.0); modeMenu->setGap(0.04, 0.04, 1.0); modeMenu2->setGap(0.04, 0.04, 1.0); modeMenu3->setGap(0.04, 0.04, 1.0); modeMenu->setNumColumns(2); // keep minimal dimension for a matrix menu modeMenu2->setNumColumns(4); // keep minimal dimension for a matrix menu modeMenu3->setNumColumns(3); // keep minimal dimension for a matrix menu modeMenu->setOptionHighlightColor(1, 1, 0); modeMenu2->setOptionHighlightColor(1, 1, 0); modeMenu3->setOptionHighlightColor(1, 1, 0); glDisable(GL_BLEND); modeMenu->setTransValue(1.0);// .80 modeMenu2->setTransValue(1.0);// .80 modeMenu3->setTransValue(1.0);// .80 modeMenu->setRayThickness(2.0); // 2 modeMenu2->setRayThickness(2.0); // 2 modeMenu3->setRayThickness(2.0); // 2 modeMenu->addOption("./pic/abstraction.rgb"); modeMenu->addOption("./pic/refinement.rgb"); modeMenu->addOption("./pic/sphe_shap.rgb"); modeMenu->addOption("./pic/shap_sphe.rgb"); modeMenu->addOption("./pic/save.rgb"); modeMenu->addOption("./pic/exit.rgb"); modeMenu2->addOption("./pic/one_sphe.rgb"); modeMenu2->addOption("./pic/all_sphe.rgb"); modeMenu2->addOption("./pic/prop.rgb"); modeMenu2->addOption("./pic/exit.rgb"); modeMenu3->addOption("./pic/one_spa.rgb"); modeMenu3->addOption("./pic/all_spa.rgb"); modeMenu3->addOption("./pic/exit.rgb"); } void placeModeMenu(){ float C2HeadPos[3]; CAVEGetHead(C2HeadPos[0], C2HeadPos[1], C2HeadPos[2]); if (placeMenuByHead){ modeMenu->setMenuLocation(C2HeadPos[0]-1.45, //-1.4 C2HeadPos[1]+.25, //+.25 C2HeadPos[2]-4.0);//-4.00 modeMenu2->setMenuLocation(C2HeadPos[0]-1.45, //-1.4 C2HeadPos[1]+.25, //+.25 C2HeadPos[2]-4.0);//-4.00 modeMenu3->setMenuLocation(C2HeadPos[0]-1.45, //-1.4 Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
98
C2HeadPos[1]+.25, //+.25 C2HeadPos[2]-4.0);//-4.00
}
}else{ modeMenu->setMenuLocation(-1.45, 6.25, -4.0); // z=-6.0 modeMenu2->setMenuLocation(-1.45, 6.25, -4.0); // z=-6.0 modeMenu3->setMenuLocation(-1.45, 6.25, -4.0); // z=-6.0 }
void drawModeMenu(){ if(var->which_menu_is_used==0){ var->modeMenuOption = modeMenu->doMenu(); modeMenu->drawMenu(); } else{ if(var->which_menu_is_used==1){ var->modeMenuOption = modeMenu2->doMenu(); modeMenu2->drawMenu(); } else { var->modeMenuOption = modeMenu3->doMenu(); modeMenu3->drawMenu(); } } //add by IVAN switch(var->which_menu_is_used){ case 0: switch (var->modeMenuOption){ case 1: if(CAVEBUTTON1 && var->selection3==1){ //system("sfplay ./snd/advBell.aiff &");
case
case
case
case
case
var->selection = 1; } break; 2: if(CAVEBUTTON1 && var->cntvert!=1 && var->selection3==1){ //system("sfplay ./snd/shapeCreated.aiff &"); var->selection = 2; } break; 3: //system("sfplay ./snd/shapeDeleted.aiff &"); if(CAVEBUTTON1 && var->cntvert==1){ var->which_menu_is_used = 1; } break; 4: //system("sfplay ./snd/shapeScaled.aiff &"); var->selection = 3; //turn shapes back to spheres if (CAVEBUTTON1&& var->cntvert==1) { var->which_menu_is_used = 2; } break; 5: if(CAVEBUTTON1 && !var->previous2){ file_coords(); } var->previous2 = CAVEBUTTON1; break; 6: if(CAVEBUTTON1){ //system("sfplay ./snd/advBell.aiff &"); var->selection = 6; } break;
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
99
} // end switch one break; case 1 : switch(var->modeMenuOption){ case 1: if(CAVEBUTTON1 && var->selection3==1){ // system("sfplay ./snd/advBell.aiff &"); var->selection = 1; //Call sphe-shape1 } break; case 2: if(CAVEBUTTON1 && var->selection3==1){ //&& !var->cntvert // system("sfplay ./snd/shapeCreated.aiff &"); var->selection = 2; //call sphe-shape2 } break; case 3: if(CAVEBUTTON1 && var->selection3==1){ //system("sfplay ./snd/shapeCreated.aiff &"); var->selection = 3; // call change_pro (change shape proportions) } break; case 4: if(CAVEBUTTON1){ cout<<"In menu #1 case 4, quitting: "<<endl; cout<<"Menu is changed to 0 here: "<<endl<<endl; var->which_menu_is_used = 0; var->selection=0; } break; } break; default : //doing nothing in replacing spaces by spheres. switch(var->modeMenuOption){ case 1: if(CAVEBUTTON1 && var->selection3==1){ //system("sfplay ./snd/advBell.aiff &"); var->selection = 4; //Call shape-sphe1 } break; case 2: if(CAVEBUTTON1 && var->selection3==1){ //&& !var->cntvert //system("sfplay ./snd/shapeCreated.aiff &"); var->selection = 5; //call shape-sphe2 } break; case 3: if(CAVEBUTTON1){ cout<<"In menu #2 case 4, quitting: "<<endl; cout<<"Menu is changed to 0 here: "<<endl<<endl; var->which_menu_is_used = 0; var->selection=0;
} break; }
break; // default }//end outer switch } // ************ ABSTRACTION ************************************ void abstraction(){ // Ancona & De Floriani's Algorhitm Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
100
int i; float tip_pos[3], fake_vert[3]; int flag1, flag2, bugs; int ctl_arc[var->NUMBER_OF_ARCS]; CAVEGetPalmPosition(tip_pos); //instead of tip_pos getting palm position instead for(i=1; i<= var->NUMBER_OF_ARCS; i++) ctl_arc[i]=0; for(i=1; i<=var->NUMBER_OF_VERTICES; i++){ fake_vert[0] = var->check[i][0]; fake_vert[1] = var->check[i][1]; fake_vert[2] = var->check[i][2]; if( distance(tip_pos, fake_vert) < var->min_dist && var->new_vert[var>father].check(i)) { var->shapeCol[i][0] = .7; var->shapeCol[i][1] = .7; var->shapeCol[i][2] = .7; //system("sfplay ./snd/advBell.aiff &"); if (!var->new_vert[var->cntvert].check(i)) var->new_vert[var->cntvert].append(i); if (var->new_vert[var->father].check(i)) var->new_vert[var->father].remove(i); if (!var->new_vert[var->father].check(100+var->cntvert)) var->new_vert[var->father].append(100+var->cntvert); } }
if(var->cntvert != 1){ for(i=1; i<=var->cntvert; i++){ fake_vert[0] = var->mv_center[i][0]; fake_vert[1] = var->mv_center[i][1]; fake_vert[2] = var->mv_center[i][2];
if( distance(tip_pos, fake_vert) < var->min_dist && var->new_vert[var->father].check(100+i)) { cout<<"got in distance in abstraction: "<<endl<<endl; var->MVCol[i][0] = .7; var->MVCol[i][1] = .7; var->MVCol[i][2] = .7; //system("sfplay ./snd/advBell.aiff &"); if (!var->new_vert[var->cntvert].check(100+i)) var->new_vert[var->cntvert].append(100+i); if (var->new_vert[var->father].check(100+i)) var->new_vert[var->father].remove(100+i); if (!var->new_vert[var->father].check(100+var->cntvert)) var->new_vert[var->father].append(100+var->cntvert); var->MVCol[var->cntvert][0] = .5; var->MVCol[var->cntvert][1] = .2; var->MVCol[var->cntvert][2] = .8; } Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
101
} } if(CAVEBUTTON2) var->selection2 = 1; // taking values for the var->edges if the new abstraccion E(i) if (var->selection2==1 && CAVEBUTTON2){ // for(flag1=0; flag1<=var->new_vert[var->cntvert].length(); flag1++){ for(flag2=0; flag2<=var->edges[var->father].length(); flag2++){ bugs = var->edges[var->father].search1(flag2); if(var->Elem[bugs].check(var->new_vert[var->cntvert].search1(flag1))) ++ctl_arc[bugs]; if (ctl_arc[bugs]==var->Elem[bugs].length() && !var->edges[var->cntvert].check(bugs)&& var->Elem[bugs].length()!=0) var->edges[var->cntvert].append(bugs);
} } //end taking values for the var->edges of the new abstraction // for every e in Ej-Ei do
for(i=0; i<var->edges[var->father].length(); i++){ if (!(var->edges[var->cntvert].check(var->edges[var->father].search1(i)))){ for(flag1=0; flag1<var->new_vert[var->cntvert].length(); flag1++) if (var->Elem[var->edges[var->father].search1(i)].check( var->new_vert[var->cntvert].search1(flag1))){ if (!var->BV[var->cntvert].check( var->new_vert[var->cntvert].search1(flag1))) var->BV[var->cntvert].append( var->new_vert[var->cntvert].search1(flag1)); var->PHI[var->cntvert][var->edges[var->father].search1(i)].append( var->new_vert[var->cntvert].search1(flag1)); if(!var->I[var->cntvert].check(i)) var->I[var->cntvert].append(i); var->Elem[var->edges[var->father].search1(i)].remove(var->new_vert[var>cntvert].search1(flag1)); if(!var->Elem[var->edges[var->father].search1(i)].check(100+var->cntvert)) var->Elem[var->edges[var->father].search1(i)].append(100+var->cntvert); } // end if Elem } // end if !var->edges } // end for i=1 for (i = 0;i <var->edges[var->cntvert].length(); i++) if (var->I[var->father].check(var->edges[var->cntvert].search1(i))!=0){ var->I[var->father].remove(var->edges[var->cntvert].search1(i)); var->edges[var->father].remove(var->edges[var->cntvert].search1(i)); } // if I(var->father).check.... // // for (i = 0;i < var->I[var->father].length(); ++i){ for (int j = 0;j < var->new_vert[var->cntvert].length() ; ++j){ if (var->PHI[var->father][var->I[var->father].search1(i)].check( var->new_vert[var->cntvert].search1(j))!=0){ if (var->I[var->cntvert].check(var->I[var->father].search1(i))==0) var->I[var->cntvert].append(var->I[var->father].search1(i)); if (var->PHI[var->cntvert][var->I[var->father].search1(i)].check( var->new_vert[var->cntvert].search1(j))==0) var->PHI[var->cntvert][var->I[var->father].search1(i)].append( var->new_vert[var->cntvert].search1(j)); Hipergrafos en Ambientes SintĂŠticos para la DisposiciĂłn Espacial de Edificaciones â&#x20AC;&#x201C;I.Burgos,1999
102
var->PHI[var->father][var->I[var->father].search1(i)].remove( var->new_vert[var->cntvert].search1(j)); if (var->PHI[var->father][var->I[var->father].search1(i)].check(100+var>cntvert)==0)
var->PHI[var->father][var->I[var->father].search1(i)].append(100+var-
>cntvert); for (int z = 0;z < var->PHI[var->father][var->I[var>father].search1(i)].length() ; ++z) if (var->BV[var->father].check(var->PHI[var->father] [var->I[var->father].search1(i)].search1(z))==0) var->BV[var->father].append(var->PHI[var->father] [var->I[var->father].search1(i)].search1(z)); var->PHI[var->cntvert][var->I[var->father].search1(i)].display(); } // end if var->PHIj(e)in Vi } // for (int j = 1;j..... } // end for every e in Ij... // calculating macrovertex's center for(i=0; i<var->new_vert[var->cntvert].length(); i++){ var->mv_center[var->cntvert][0] += (var->check[var->new_vert[var>cntvert].search1(i)][0]); var->mv_center[var->cntvert][1] += (var->check[var->new_vert[var>cntvert].search1(i)][1]); var->mv_center[var->cntvert][2] += (var->check[var->new_vert[var>cntvert].search1(i)][2]); } var->mv_center[var->cntvert][0]/= var->new_vert[var->cntvert].length(); var->mv_center[var->cntvert][1]/= var->new_vert[var->cntvert].length(); var->mv_center[var->cntvert][2]/= var->new_vert[var->cntvert].length(); // var->selection2 = 0; var->selection = 0; ++var->cntvert; var->global_a=var->cntvert; }
}// if var->selection2
// ************ REFINEMENT ************************************ void refinement(){ // Ancona & De Floriani's Algorhitm int i,z, macro_v; float tip_pos[3],fake_vert[3]; CAVEGetPalmPosition(tip_pos); //instead of get_tip_pos trying palm position instead for(i=1; i<=var->cntvert; i++){ fake_vert[0] = (var->mv_center[i][0]); fake_vert[1] = (var->mv_center[i][1]); fake_vert[2] = (var->mv_center[i][2]); if(distance(tip_pos, fake_vert) < var->min_dist && var->new_vert[var->father].check(100+i)){ var->MVCol[i][0] = .7; var->MVCol[i][1] = .7; var->MVCol[i][2] = .7; macro_v=i; var->ref =1; //system("sfplay ./snd/advBell.aiff &"); break; }// end if Hipergrafos en Ambientes SintĂŠticos para la DisposiciĂłn Espacial de Edificaciones â&#x20AC;&#x201C;I.Burgos,1999
103
} //end for i if(macro_v == 0) //resetting color for(i = 1; i<=var->cntvert; i++){ var->MVCol[i][0] = .5; var->MVCol[i][1] = .2; var->MVCol[i][2] = .8; } if (CAVEBUTTON2) var->selection2=1; if (var->selection2==1&&macro_v !=0){ for (i=0;i<var->edges[var->father].length(); i++){ if (var->Elem[var->edges[var->father].search1(i)].check(macro_v+100)){ var->Elem[var->edges[var->father].search1(i)].remove(macro_v+100); for (int j = 0;j < var->PHI[macro_v][var->edges[var>father].search1(i)].length(); ++j) { var->Elem[var->edges[var->father].search1(i)]. append((var->PHI[macro_v][var->edges[var>father].search1(i)]).search1(j)); } // for j } // if Elem[var->edges[var->father].search1(i)].check(macro_v+100)!
=0
} // end for int=i... for (z =0;z<var->edges[macro_v].length(); ++z) { var->edges[var->father].append(var->edges[macro_v].search1(z)); if (!var->I[var->father].check(var->edges[macro_v].search1(z))) var->I[var->father].append(var->edges[macro_v].search1(z)); } // for z if (var->BV[var->father].check(macro_v+100)) for (int i = 0;i <= var->I[var->father].length(); ++i) { if (var->PHI[var->father][var->I[var>father].search1(i)].check(macro_v+100)) { var->PHI[var->father] [var->I[var->father].search1(i)].remove(macro_v+100); for (int j = 0;j < var->PHI[macro_v] [var->I[var->father].search1(i)].length(); ++j) { var->PHI[var->father][var->I[var>father].search1(i)]. >father].search1(i)].search1(j));
append(var->PHI[macro_v] [var->I[varif(!var->BV[var->father].check(var-
>PHI[macro_v]
[var->I[var-
>father].search1(i)].search1(j))) var->BV[var-
>father].append(var->PHI[macro_v][ >father].search1(i)].search1(j));
var->I[var} // for j =1 .... } // if var->PHI(var->father)(e)
Hipergrafos en Ambientes SintĂŠticos para la DisposiciĂłn Espacial de Edificaciones â&#x20AC;&#x201C;I.Burgos,1999
104
} // for i =1 .... var->BV[var->father].remove(macro_v+100); var->new_vert[var->father].remove(macro_v+100); for (z = 0;z < var->new_vert[macro_v].length(); ++z){ if (!var->new_vert[var->father].check(var>new_vert[macro_v].search1(z))) var->new_vert[var->father].append(var>new_vert[macro_v].search1(z)); } var->BV[macro_v].remove(); //var->PHI[macro_v][var->father].remove(); var->new_vert[macro_v].remove(); (var->mv_center[macro_v][0])=0; (var->mv_center[macro_v][1])=0; (var->mv_center[macro_v][2])=0; if (var->cntvert==1) var->cntvert=1; else var->cntvert = var->cntvert -1; var->selection2 = 0; var->selection = 0; var->global_a=macro_v; var->ref = 0; } // end if var->selection2 }
//end refinement
void
sphe_spa_1(){ int i; float tip_pos[3], fake_vert[3]; CAVEGetPalmPosition(tip_pos); //instead of get_tip_pos trying palm position instead for(i=1; i<=var->NUMBER_OF_VERTICES; i++){ fake_vert[0] = var->check[i][0]; fake_vert[1] = var->check[i][1]; fake_vert[2] = var->check[i][2]; if(distance(tip_pos, fake_vert) < var->min_dist) { //system("sfplay ./snd/advBell.aiff &"); var->mark_draw[i]=1; } } var->selection5 = 1;
} //end sphe_spa_1 void
sphe_spa_2(){ int i; for(i=1; i<=var->NUMBER_OF_VERTICES; i++) var->mark_draw[i]=1; var->selection5=1;
} //end sphe_spa_2
void spa_sphe_1(){ Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
105
int i; float tip_pos[3], fake_vert[3]; CAVEGetPalmPosition(tip_pos); //instead of get_tip_pos trying palm position instead for(i=1; i<=var->NUMBER_OF_VERTICES; i++){ fake_vert[0] = var->check[i][0]; fake_vert[1] = var->check[i][1]; fake_vert[2] = var->check[i][2]; if(distance(tip_pos, fake_vert) < var->min_dist) { //system("sfplay ./snd/advBell.aiff &"); var->mark_draw[i]=0; }
}
}// end spa_sphe_1 void change_pro(){ int i; float tip_pos[3], fake_vert[3], tempo = 0.0; CAVEGetPalmPosition(tip_pos); //instead of get_tip_pos trying palm position instead for(i=1; i<=var->NUMBER_OF_VERTICES; i++){ fake_vert[0] = var->check[i][0]; fake_vert[1] = var->check[i][1]; fake_vert[2] = var->check[i][2]; if(distance(tip_pos, fake_vert) < var->min_dist) { var->shapeCol[i][0] = .7; var->shapeCol[i][1] = .7; var->shapeCol[i][2] = .7; var->ref2=1; //system("sfplay ./snd/advBell.aiff &"); if(CAVEBUTTON2 && var->selection==3){ tempo=var->dim[i][0]; var->dim[i][0]=var->dim[i][2]; var->dim[i][2]=tempo; var->selection=0; var->ref2=0; } }
// if CAVEBUTTON2
}
}// end change_pro void spa_sphe_2(){ int i; for(i=1; i<=var->NUMBER_OF_VERTICES; i++) var->mark_draw[i]=0; var->selection5=0; }// end spa_sphe_2 Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
106
void }
quit(){ //cout<<"QUITING"<<endl; var->EXIT = 1;
void drawCube(int si){ float pt1[3], pt1[0] = -0.5 pt1[1] = -0.5 pt1[2] = -0.5
pt2[3], pt3[3], pt4[3], pt5[3], pt6[3], pt7[3], pt8[3]; * var->dim[si][0]; * var->dim[si][1]; * var->dim[si][2];
pt2[0] = 0.5 * var->dim[si][0]; pt2[1] = -0.5 * var->dim[si][1]; pt2[2] = -0.5 * var->dim[si][2]; pt3[0] = 0.5 * var->dim[si][0]; pt3[1] = -0.5 * var->dim[si][1]; pt3[2] = 0.5 * var->dim[si][2]; pt4[0] = -0.5 * var->dim[si][0]; pt4[1] = -0.5 * var->dim[si][1]; pt4[2] = 0.5 * var->dim[si][2]; pt5[0] = -0.5 * var->dim[si][0]; pt5[1] = 0.5 * var->dim[si][1]; pt5[2] = -0.5 * var->dim[si][2]; pt6[0] = 0.5 * var->dim[si][0]; pt6[1] = 0.5 * var->dim[si][1]; pt6[2] = -0.5 * var->dim[si][2]; pt7[0] = 0.5 * var->dim[si][0]; pt7[1] = 0.5 * var->dim[si][1]; pt7[2] = 0.5 * var->dim[si][2]; pt8[0] = -0.5 * var->dim[si][0]; pt8[1] = 0.5 * var->dim[si][1]; pt8[2] = 0.5 * var->dim[si][2]; glBegin(GL_POLYGON); // top xz glVertex3fv(pt5); glVertex3fv(pt6); glVertex3fv(pt7); glVertex3fv(pt8); glEnd(); glBegin(GL_POLYGON); // bottom xz glVertex3fv(pt4); glVertex3fv(pt3); glVertex3fv(pt2); glVertex3fv(pt1); glEnd(); glBegin(GL_POLYGON); // side yz glVertex3fv(pt5); glVertex3fv(pt8); glVertex3fv(pt4); glVertex3fv(pt1); glEnd(); glBegin(GL_POLYGON); glVertex3fv(pt7); glVertex3fv(pt6); glVertex3fv(pt2); glVertex3fv(pt3); glEnd(); Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
107
glBegin(GL_POLYGON); glVertex3fv(pt6); glVertex3fv(pt5); glVertex3fv(pt1); glVertex3fv(pt2); glEnd(); glBegin(GL_POLYGON); glVertex3fv(pt8); glVertex3fv(pt7); glVertex3fv(pt3); glVertex3fv(pt4); glEnd(); glColor3f(0.0, 0.0, 0.0); glLineWidth(2.0); glBegin(GL_LINES); // top xz glVertex3fv(pt5); glVertex3fv(pt6); glVertex3fv(pt7); glVertex3fv(pt8); glEnd(); glBegin(GL_LINES); // bottom xz glVertex3fv(pt4); glVertex3fv(pt3); glVertex3fv(pt2); glVertex3fv(pt1); glEnd(); glBegin(GL_LINES); // side yz glVertex3fv(pt5); glVertex3fv(pt8); glVertex3fv(pt8); glVertex3fv(pt4); glVertex3fv(pt4); glVertex3fv(pt1); glEnd(); glBegin(GL_LINES); glVertex3fv(pt7); glVertex3fv(pt6); glVertex3fv(pt6); glVertex3fv(pt2); glVertex3fv(pt2); glVertex3fv(pt3); glEnd(); glBegin(GL_LINES); glVertex3fv(pt6); glVertex3fv(pt5); glVertex3fv(pt5); glVertex3fv(pt1); glVertex3fv(pt1); glVertex3fv(pt2); glEnd(); glBegin(GL_LINES); glVertex3fv(pt8); glVertex3fv(pt7); glVertex3fv(pt7); glVertex3fv(pt3); glVertex3fv(pt3); glVertex3fv(pt4); glEnd(); } void file_coords(){ Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
108
int i; char ext_f[] = ".dat"; char name_f1[20] = "coordinates"; sprintf(var->id_file, "%d",var->wow ); strcat(strcat(name_f1,var->id_file),ext_f); ofstream cor_out (name_f1); //variable to output coordinates for(i = 0; i<=var->NUMBER_OF_VERTICES; i++){ cor_out<<var->check[i][0]<<" "<<var->check[i][1]<<" " <<var->check[i][2]<<endl; } }
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
CONCLUSIONES Y RECOMENDACIONES.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
110
Conclusiones y Recomendaciones Se concluye en esta investigación que:
La tecnología de Realidad Virtual, que contempla la generación de Ambientes Sintéticos con medios de proyección de características inmersivas, promete ser el ambiente de trabajo idealizado para el diseño arquitectónico y la comprensión del espacio.
Las implicaciones de la percepción espacial y el estudio de la escala humana en edificaciones tanto a nivel de anteproyecto como edificaciones históricas, son de vital importancia para el diseño arquitectónico en sí mismo. La generación de ambientes sintéticos nos entregan esa posibilidad.
La presente propuesta metodológica de trabajo en la búsqueda de soluciones a disposiciones espaciales de edificaciones, en donde, el computador toma una importante posición como herramienta generadora de soluciones neutras, es sólida, científicamente estable y matemáticamente bien fundamentada.
El módelo gráfico generado en un ambiente inmersivo, se presta para el acercamiento a plantas definitivas de edificaciones, , ya que la manipulación a escala deseada y las ediciones del hipergrafo en tres dimensiones , permiten una mayor comprensión de las relaciones interespaciales de los elementos integrantes, constituyendose así la tecnología de Realidad Virtual en el medio propicio, natural y óptimo para el diseño arquitectónico .
Se recomienda por tanto:
Continuar en el estudio del hipergrafo en ambientes sintéticos, inmersivos, interactivos y multisensoriales, a fin de que se desarrolle, madure e implante como proceso Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
111
metodológico de diseño arquitectónico a nivel programático tanto en las cátedras de Taller de pre como posgrado e incentivar su divulgación ya que fue elaborado totalmente dentro de La Universidad del Zulia.
Expandir el presente estudio con la incorporación de los algoritmos genéticos en la búsqueda de solución óptima en la disposición espacial de elementos, logrando así un verdadero CAD, que nos provea de soluciones neutras a los problemas del diseño, sin los vicios del preconcepto.
Solicitar a las autoridades universitarias el apoyo financiero, con la finalidad de que se provean los fondos necesario para el montaje y funcionamiento de un laboratorio de ambientes sintéticos (LABAS) en la Facultad de Arquitectura y Diseño con la finalidad de potenciar los sentidos de estudiantes y profesores, especialmente de Taller e Historia de la Arquitectura, con la ayuda de la Tecnología de Realidad Virtual.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
112
Bibliografía : [1] “El Módelo Gráfico Tridimensional para la Representación del Hipergráfo Estructurado en el proceso de Diseño en Arquitectura-Aplicación en un caso específico”. I.Burgos-I.Szentpaly. ( Sep.1997). Trabajo de Grado Facultad de Arquitectura L.U.Z. [2] “Módelo Gráfico Tridimensional para la Representación del Hipergráfo Estructurado”. I.Burgos-S.Alonzo (1995-1996). Trabajo de Grado Facultad de Arquitectura L.U.Z. [3] “Métodos de Diseño y Teoria de Hipergráfos en el Diseño”. I.Burgos-C.Naranjo-G.Kinsley. (1994-1995). Trabajo de Grado Facultad de Arquitectura L.U.Z. [4] Programming with C++. John Hubbard. Ed.MacGraw Hill, Shaum’s Outline Series , 1996. [5] C++. Ivor Horton. Wrox Press Ltd.,1998. [6] OpenGL Programming Guide. M.Woo, J.Neider & T.Davis. Ed.Addison-Wesley Developer Press, 1997. [7] A Hypergraph-Based Hierarchical Data Structure and Its Applications . Ancona, M. y Floriani De, L.. Advances in Engineering Software,1989, Vol.11, No.1, Pags. 2-11. [8] Effective C++. Scott Meyers. Ed.Addison-Wesley Publisher, 1992. [9] Algorithms, Data Structures and problem solving with C++ . Mark Allen Weiss. Ed.AddisonWesley Publisher, 1995. [10] Scientific C++, Building Numerical Librairies the Object-Oriented way . Guido Buzzi-Ferraris. Ed.Addison-Wesley Publisher, 1993. [11] C++ Primer. Stanley B. Lippman. . Ed.Addison-Wesley Publisher, 1989.
CONSULTAS VIA INTERNET:
[12]Hipergrafos, Realidad Virtual y Arquitectura. (1997). Iowa State University. [On-Line]. Disponible en : http://members.spree.com/sip/tepuy/esp/ [13] Hypergraphs and architecture. (1998). Iowa State University. [On-Line]. Disponible en: http://members.spree.com/sip/tepuy/ [14] CECA : British Architecture and Computer. (1996) [On-Line]. Disponible en: http://ceca.uel.ac.uk/ [15] Descripción de la Cabina 1 (C2). (1995). Iowa State University. [On-Line]. Disponible en: http://www.eecs.uic.edu/~kpark/cave_description.html [16] Descripción de la Cabina 2 (C2) . (1996). Iowa State University. [On-Line]. Disponible en: http://www.icemt.iastate.edu/ [17] Proyecto VADeT. (1998). Iowa State University. [On-Line]. Disponible en: http://www.icemt.iastate.edu/research/architecture/VADeT/index.html Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999
113
Marcas Registradas ® UNIX es una marca registrada de The OpenGroup. Silicon Graphics, , IRIX, Performer, Open Inventor y OpenGL son marcas registradas de Silicon Graphics, Inc. C++ es un lenguaje de programación creado por Bjarne Stroustrup. Multigen II es una marca registrada de Multigen-Paradigm, Inc. World Tool Kit es una marca registrada de Sense 8, Inc.. 3Dstudio es una marca registrada de Autodesk, Inc. El logo utilizado es marca registrada de Adaptec, Inc.
Hipergrafos en Ambientes Sintéticos para la Disposición Espacial de Edificaciones –I.Burgos,1999