![]() |
![]() |
PDF→
|
|||||||||||||||||||||||
Alejandro Aguilar Sierra |
|||||||||||||||||||||||||
Se presenta un sistema para definición y almacenamiento de gráficas en 2D, que utiliza transformaciones lineales, estructuración jerarquizada, interacciones y recursividad; al tiempo que se introducen algunos conceptos de graficación por computadora. INTRODUCCIÓN Uno de los principales problemas de la graficación por computadora es la representación y almacenamiento de información gráfica. Para empezar conviene distinguir entre el simple archivo de datos (suele llamársele display file), y un lenguaje de graficación propiamente dicho, que tendría que cumplir los requerimientos que cumple cualquier lenguaje computacional. Un display file tiene las siguientes ventajas: • Es un formato de datos para archivar “imágenes” y no tener que reconstruirlas cada vez que se necesiten. Y, abusando un poco de los términos, un “lenguaje” de graficación agregaría las siguientes: • Posibilidad de modificar fácilmente la “imagen”; algo así como “editar” o “depurar”. Muchos paquetes personales de graficación (que pueden usarse en una PC) almacenan la información en forma digital, lo cual reúne todas las desventajas: las líneas no horizontales ni verticales se ven horribles, consumo excesivo de memoria, redundancia, dificultad para cambiar la escala de la imagen, o rotarla, imposibilidad de desplegar en dispositivos vectoriales, (donde la información se da en coordenadas cartesianas) etc. Otros manejan lenguajes especializados, que sólo ellos entienden, lo que limita la flexibilidad y aumenta la dependencia. Los sistemas basados en modelos estandarizados (tipo GKS, PHIGS) tienen la lata adicional de que hay que hacer un programa para cada aplicación específica, y son tan vastos que uno no puede aprovecharlos al límite. Para aplicaciones en que se necesita calidad de trazo de línea, independencia del dispositivo de graficación a emplear, no consumir más memoria de la necesaria, y facilidad de usarse en combinación con un lenguaje de alto nivel, interactivamente, o bien escribiendo un programa fuente, creamos Metagrafic, una primera propuesta en 2D. DESCRIPCIÓN DEL SISTEMA METAGRAFIC MG es algo así como el eslabón perdido entre un display file y un lenguaje de graficación. La definición de los objetos a graficar se hace mediante primitivas simples, transformaciones y atributos. La estructura de datos básica es la lista de puntos (parejas de números reales). Cada primitiva tiene la siguiente sintaxis: nombre primitiva lista de puntos NL un identificador, seguido de una lista de puntos, y al final el indicador de fin de lista NL. Pero hay excepciones: PL x1 y1 … xm ym ng xm + 1 … xnyn NL PL traza una poligonal tomando como vértices los puntos de la lista. La subinstrucción ng interrumpe el trazo de la poligonal, de modo que los puntos m y m 1 1 no son unidos con una línea. CR r x1 y1 … xn yn NL En un policírculo se generan n círculos centrados en cada uno de los puntos xi yi, y radio r, por lo que sólo es necesario definir r una vez (al principio). Las coordenadas se definen en el espacio del objeto. Se llama, ventana a la región del espacio del objeto que deseamos visualizar. En MG la ventana por omisión es [0,1] 3 [0,1]. Las coordenadas normalizadas tienen la ventaja de que mapean cualquier puerto de visión con un mínimo de cálculos. Es posible ajustar la ventana a los datos del usuario. La instrucción es WW Xmin Xmax Ymin Ymax. En el caso de las transformaciones, ya se sabe cuántos datos se necesitan, y no es necesario finalizar con NL. Aquí no se utilizan listas de puntos, sino matrices. Las instrucciones son básicamente: RT theta Rotar un ángulo theta. Las transformaciones se realizan con matrices de 3 x 3 en coordenadas homogéneas (ver recuadro). Es posible que la instrucción no necesite ningún dato, como es el caso de IM que asigna la matriz idéntica a la matriz de transformación. Lo que hace realmente poderoso a MG es el uso de estructuras. Las estructuras son subrutinas gráficas que una vez definidas pueden utilizarse como si fuesen primitivas. La sintaxis es la siguiente: OPST Identificador estructura El identificador de la estructura referirá lo que se encuentre entre OPST y CLST. Funciona, pues, como una referencia (un apuntador, no una copia, como sería el caso de una macroinstrucción). Esto representa un buen ahorro de tiempo y memoria al evitar redundancias. Otras ventajas de utilizar estructuras se enumeran a continuación: • Jerarquía. Como una estructura puede contener otras estructuras, las transformaciones que se apliquen a la estructura “madre” se compondrán a las de la “hija”. Toda estructura lleva asociados un punto de referencia (un “origen” relativo) y una matriz de transformación. Lo más usual es desplegar la estructura en cada punto de una lista: Nombre estructura lista de puntos NL Pero también es posible ajustar una estructura a un área específica del espacio, con las siguientes instrucciones: MKST Identificador estructura Marca la estructura.
Otras matrices de transformación actúan con las estructuras. Una es la matriz de iteración, que multiplica repetidas veces la matriz asociada a la estructura marcada. En la instrucción RPST n se despliega n veces dicha estructura cada vez con una transformación diferente. Otra matriz altera iterativamente el punto de referencia de la estructura. Cada vez que se indica la instrucción DPST nombre estructura cambia la posición, y no es necesario marcar la estructura, pero sólo la despliega una vez. La aplicación de estas transformaciones secundarias puede controlarse con banderas especiales. Mediante la instrucción INPUT nombre archivo [.grf] podemos cargar estructuras definidas en otro archivo. Se vale anidar, es decir, abrir archivos que a su vez abren otros archivos, pero hasta cierto límite. Una aplicación inmediata, dadas las facilidades descritas, es la creación de texto. Cada letra del alfabeto puede definirse en forma muy concisa, y la letra misma puede usarse como identificador de su estructura. El usuario podría, muy fácilmente, crear su propio alfabeto y manejar texto junto con gráficas. MG provee algunas abreviaturas:
Conviene poder desplegar texto junto con las gráficas. Algunos dispositivos de graficación no incluyen esta facilidad. Es útil intercalar comentarios entre las instrucciones de un programa, para su posterior revisión. Esto se hace, en MG, iniciando cada comentario con el caracter %. Por último, cabe recordar que todas las coordenadas están definidas en el espacio del objeto. El espacio imagen depende del dispositivo donde se va a interpretar el archivo. EJEMPLOS En esta sección no se pretende demostrar todas las posibilidades de MG, ya que sólo se usan segmentos de línea y círculos. La idea es obtener figuras aparentemente complejas a partir de diseños simples, aprovechando algún tipo de simetría. En el primer ejemplo (figura 1) se expone una muestra típica de las aplicaciones que motivaron la creación de MG. Se trata de una red neuronal muy sencilla que simula un comportamiento de la mantis religiosa. X y Y representan los estímulos, W y Z las respuestas, y los números dentro del cuerpo de las neuronas, los umbrales. El texto y las neuronas están definidas con splines. En la figura 2 se muestra, en la parte de arriba, la estructura básica, y más abajo, el resultado después de haber aplicado transformaciones reiterativas; rotando la estructura básica (como en SPIRO1 y en SPIRO2) o su origen (como en SPIRo3), o bien cambiando la escala (como en SPIRO1). Con el uso de la recursividad podemos conseguir objetos tan curiosos como los árboles fractales, llamados así por su autosimilitud (simetría escalar: a cualquier escala se observa el mismo patrón). No es difícil concluir que una curva que pasara por todos los puntos de una de las ramas del árbol, tendría longitud infinita. Son aparentemente muy complicados (ver figura 4) pero en realidad la estructura base es una simple línea (el tronco), en uno de cuyos extremos se repite la estructura dos veces, a una escala menor y con ángulos distintos de rotación (dos ramificaciones). Queda como ejercicio al lector la programación, en MG, de las curvas de Hilbert o de Sierpinski. Hasta aquí sólo se han visto curvas. Dejo para otra ocasión los objetos con áreas cerradas. Veremos cómo construir diseños en 2D tales como los de M. C. Escher; o como los mosaicos no periódicos de Roger Penrose. CONCLUSIÓN MG se perfila como algo más que un display file, ya que toda la información grafica está contenida en el archivo; y es un lenguaje de graficación, con instrucciones sencillas y fáciles de memorizar, pero con posibilidades casi infinitas. Está parcialmente inspirado en sistemas de graficación estandarizados (tales como PHIGS) y en el “graphics language” de los plotters, pero con énfasis en la sencillez y en un mínimo de instrucciones. Hay que tomar en cuenta que MG no es un producto acabado. Es más, se aceptan sugerencias. RECONOCIMIENTOS El autor da las gracias a Ana Luisa Solís, Guillermo Correa y Homero Ríos por sus valiosos comentarios. APÉNDICE 1 Algunos listados % Figura basada en la rotación de cuatro líneas % Figura basada en la translación de un círculo % Árbol fractal (figura recursiva) APÉNDICE 2 Algunas instrucciones Las transformaciones para estructuras son similares, cambiando las dos últimas letras por ST para texto igual, con TXT. Operaciones con estructuras. Otras instrucciones como recorte, banderas de iteración, uso de variables dentro de una estructura etc., podrán consultarse en el manual del usuario cuando éste exista.
|
|
![]() |
|
||||||||||||||||||||||
|
|||||||||||||||||||||||||
Refrerencias Bibliográficas 1. W. Newman, R. Sproull, 1979, Principles of Interactive Computer Graphics, McGraw-Hill. |
|||||||||||||||||||||||||
____________________________________________________________
|
|||||||||||||||||||||||||
Alejandro Aguilar Sierra
como citar este artículo → |