UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

FACULTAD DE CIENCIAS QUÍMICAS, FÍSICAS Y MATEMÁTICAS

CARRERA PROFESIONAL DE INGENIERÍA INFORMÁTICA Y DE SISTEMAS

TEXTO UNIVERSITARIO

COMPUTACIÓN GRÁFICA I

Autor:

Ing. HERNÁN NINA HANCO


        

INTRODUCCIÓN

CAPÍTULO I: CONCEPTOS FUNDAMENTALES


INTRODUCCIÓN

La presente asignatura se orienta al estudio de conceptos fundamentales de Gráficas por Computador, se inicia con la descripción de las primitivas gráficas que conlleva una serie de algoritmos muy populares como el algoritmo DDA y Bresenham para el dibujo de líneas, Algoritmo de punto medio para líneas curvas. También se describe atributos de las figuras y también rellenado y recortes. Seguidamente se describe la geometría de transformaciones donde se estudia las operaciones básicas y derivadas como son traslación, rotación, escalamiento y otros. Los temas anteriores se estudian en el contexto de 2D (en el plano de dos dimensiones), en los siguientes temas se estudia los gráficos en el espacio 3D complementando el estudio con las proyecciones.

El curso se complementa con la parte práctica utilizando el estándar OpenGL para implementar los algoritmos de gráfica en computador.


CAPÍTULO I: CONCEPTOS FUNDAMENTALES

1.1. Aplicaciones de las gráficas por computadora

Los gráficos por computadora se han convertido en una herramienta para la producción de imágenes de forma rápida y económica. Cualquier tarea de un determinado sector de la actividad humana de alguna manera se apoyan en el uso de gráficas. Alguno de los campos en el que aplicamos la gráfica por computadoras es la Ciencias, artes, ingeniería, negocios, industria, medicina, sector público, entretenimiento, publicidad, educación y aplicaciones caseras.

1.1.1. Gráficos y diagramas

Una de las primeras aplicaciones gráficas fue la Visualización de gráficos de datos. En tal sentido, se han mejorado las aplicaciones para presentar gráficos de complejas relaciones entre datos que permiten realizar informes escritos o para presentaciones en diapositivas o animaciones en vídeo.

Los gráficos y diagramas son utilizados en resúmenes financieros, estadísticos, matemáticos, científicos, de ingeniería, económicos, gestión, investigación, información al consumidor, etc. Existe una gran variedad de paquetes gráficos incluso con servicios de convertir imágenes generadas en la pantalla de una computadora en películas. Ejemplos de gráficos y diagramas son diagramas de barra, tarta, superficies, contorno en dos o tres dimensiones.

1.1.2. Diseño asistido por computador (CAD - Computer Aided Design)

En arquitectura e ingeniería en los procesos de diseño se utiliza mayoritariamente el gráfico por computadoras, mucho productos como edificios, automóviles, aeronaves, barcos, naves espaciales, computadoras, telas, electrodomésticos, etc. se diseñan gráficamente. Se utilizan diseños con modelos alámbricos que muestran de manera general el producto. Algunas características de los paquetes CAD:

1.2.3. Entornos de Realidad Virtual

Los Usuarios pueden interactuar con objetos 3D, se utilizan hardware especializado para la visualización 3D y permiten al usuario tomar los objetos de la escena. Los entornos de realidad virtual son también utilizados para para formación de operadores de equipos pesados utilizando una visión estereoscópica. En los diseños de realidad virtual se tiene logra la sensación de inmersión dentro de una escena virtual.

1.2.4. Visualización de datos

Existe la visualización científica que es la generación de representaciones gráficas de conjunto de datos o procesos de naturaleza científica, de ingeniería o de medicina. La visualización de negocios para conjuntos de datos relacionados con el comercio, la industria y otras no científicas.

Las visualizaciones de datos son utilizados por investigadores, analistas que tratan con grandes cantidades de información o estudiar el comportamiento de procesos muy complejos. Un ejemplo son las Simulaciones numéricas en computador, Cámaras de satélites que generan datos mas rápido de lo que pueden ser interpretadas. Si logramos tratar estos datos con gráficos podremos rápidamente interpretar tendencias y relaciones que aparecen en los datos inmediatamente. Hay dependencia de la característica de los datos. Las técnicas de visualización también se usan como ayuda para la compresión de procesos complejos y funciones matemáticas.

1.2.5. Educación y formación

Los modelos generados por computadora de sistemas físicos, financieros, políticos, sociales, económicos y otros se usan frecuentemente como ayuda a la educación. Modelos de procesos físicos, psicológicos, tendencias de población, equipamiento puede ayudar a los alumnos a comprender la operación de un sistema.

En algunas aplicaciones de formación se necesitan equipos especiales de hardware, ejemplo de aplicaciones:

1.2.6. Arte por computadora

El arte puro y el comercial hacen uso de los métodos de los gráficos por computadora. Los artistas tienen disponible una variedad de métodos y herramientas, incluyendo hardware especializado, paquetes de software comercial, programas de matemáticas simbólica, paquetes CAD, software de escritorio para publicación y sistemas de animación que proporcionan capacidades para diseñar formas de objetos y especificar sus movimientos.

Ejemplos:

1.2.7. Entretenimiento

Las producciones de televisión, las películas de cine y los vídeos musicales utilizan gráfica por computadora combinando objetos gráficos con actores y escenas reales o sin ellos. Ejemplo:

1.2.8. Procesamiento de imágenes

Consiste en la modificación o interpretación de imágenes existentes, como fotografías o cámaras de TV. Es posible confundir los gráficos por computadora y el procesamiento de imágenes ambos tienes funciones muy marcadas como es la primera permite crear gráficos mientras el segundo sirve para mejorar la calidad de los dibujos, analizar las imagenes o visión artificial. Sin embargo ambos se utilizan muchas veces juntos.

Ejemplos:

1.2.9. Interfaz gráfica de usuario

En aplicaciones de software se requiere GUI Interfaces de Gráfica de Usuario con los entornos de escritorios.


1.3. Sistemas Gráficos

En este apartado, analizamos las características básicas de los componentes hardware y de los paquetes de software para gráficos.

1.3.1 Dispositivos de visualización de video

El principal dispositivo de salida de un sistema gráfico es el monitor de vídeo, existen algunos basados en el diseño estándar de tubos de rayos catódicos (CRT - Cathode Ray Tube) y por otra en forma mayoritaria por monitores de estado sólido.

Tubos de refresco de rayos catódicos

Un haz de electrones (Rayos catódicos), emitido por un cañón de electrones, pasa a través de sistemas de enfoque y deflexión que dirigen el haz hacia posiciones especificas de la pantalla revestidas de fósforo. Entonces el fósforo emite un pequeño punto de luz en cada posición alcanzada por el haz de electrones.

En el sistema existe la necesidad de un método para evitar el desvanecimiento rápido de la luz emitida por el fósforo. El método mas utilizado en la actualidad para mantener el resplandor del fósforo es volver a dibujar la imagen redirigiéndola rápidamente el haz de electrones de nuevo sobre los mismos puntos de la pantalla. Este tipo de pantalla se llama TRC de refresco. La frecuencia a la cual una imagen es redibujada en la pantalla se llama velocidad de refresco.

Componentes principales del cañón de electrones:

Cátodo de metal calentado.- Encargado del desprendimiento de los electrones en la superficie caliente.

Rejilla de control.- El brillo o la intensidad del haz de electrones se controla mediante la tensión de la rejilla de control. Interrumpe el haz, al impedir que los electrones pasen. El brillo de un punto en la pantalla se ajusta variando la tensión de la rejilla. Intensidad controlada por Software Gráfico.

Persistencia del Fósforo

La persistencia se define como el tiempo que transcurre para que la luz emitida desde la pantalla disminuya a una décima parte de su intensidad original. Los fósforos de persistencia menor necesitan mayor velocidad de refresco para mantener una imagen en la pantalla sin parpadeo. Por lo general, los monitores gráficos tienen una persistencia del orden de 10 a 60 microsegundos, pueden existir algunos que tienen hasta 1 segundo de persistencia.

Distribución de la intensidad del punto

Determina el tamaño del punto, la intensidad es mayor en el centro del punto y decrece según una distribución gaussiana hacia los bordes del punto. Esta distribución se corresponde con la distribución transversal de la densidad de electrones del haz del TRC.

Resolución de pantalla

El número máximo de puntos que se pueden desplegar sin que se traslapen en un TRC se conoce como la resolución. Una definición más precisa de la resolución es el número de puntos por centímetro que se pueden dibujar horizontal y verticalmente, aunque a menudo solo se expresa como el número total de puntos en cada dirección.

La resolución de TRC depende del tipo de fósforo, la intensidad a mostrar y los sistemas de enfoque y deflexión. La más común es de 1280 por 1024 de resolución.

Pantallas por barrido de líneas

Es el tipo más común de monitor gráfico que utiliza un TRC, con base en la tecnología de la televisión. En este sistema se recorre el haz de electrones a través de la pantalla, una fila a la vez, de arriba hacia abajo. Conforme el haz de electrones se mueve a través de cada línea de barrido, se activa y desactiva (o punto intermedio) la intensidad del haz para crear un patrón de puntos iluminadas.

La definición de la imagen se almacena en una área de memoria llamada buffer de refresco o buffer de imagen, el término imagen hace referencia al área de la pantalla en su totalidad. El buffer contiene el conjunto de valores de niveles de color de los puntos de la pantalla. Los niveles de color son extraídos del buffer para controlar la intensidad del haz de electrones a medida que se hace el barrido. Cada punto de la pantalla se le conoce como un pixel o pel (abreviaturas de picture element; elemento gráfico). A veces suele denominarse “buffer de cuadro” conjuntamente a la información adicional del pixel y el buffer de la imagen.

La capacidad de un sistema de barrido de líneas  para almacenar información de la intensidad para cada punto de la pantalla hace que sea ideal para el despliegue realista de escenas que contienen un sombreado tenue y patrones de colores.

Los sistemas de barrido se caracterizan por su resolución que es el número de píxeles que se pueden dibujar. Otra característica es la relación de aspecto, que es el número de columnas de pixeles dividido entre el numero de lineas de barrido que se pueden mostrar en el sistema (Una relación de aspecto de 4/3 significa que una linea horizontal pintada con cuatro puntos posee la misma longitud que una línea vertical dibujada con tres puntos).

La gama de colores o de niveles de gris depende tanto del tipo de fósforo como del número de bits por pixel. En un sistema simple en blanco y negro, cada punto de la pantalla está, ya sea encendido o apagado, de manera que sólo se necesita un bit por pixel para controlar la intensidad de las posiciones en la pantalla.

Cuando se deben desplegar variaciones de color e intensidad, se requieren bits adicionales. Se incluyen hasta 24 bits por pixel que pueden requerir varios megabytes de almacenamiento para el buffer de imagen. Un sistema con 24 bits por pixel una resolución de pantalla de 1024 por 1024 requiere 3 megabytes de almacenamiento para el buffer de imagen.

El número de bit por píxel de un buffer de imagen se denomina a veces profundidad del área del buffer, el buffer de un bit por pixel se denomina bitmap y un buffer con múltiples bits por pixel es un pixmap.

Cada vez que se refresca la pantalla, tendemos a ver cada cuadro o imagen como una continuación suave de los patrones del cuadro anterior.

La velocidad de refresco mínimo debe ser de 24 cuadros por segundos, algunos sistemas llegan a 60 y 120 cuadros por segundo, también pueden expresarse en Hercios Hz.

Pantallas de barrido aleatorio

Cuando un monitor TRC funciona como una pantalla de barrido aleatorio, dispone de un haz de electrones dirigido exclusivamente a las partes de la pantalla donde se muestra una imagen.

Se denominan también pantallas vectoriales. Las líneas componentes de una imagen se  dibujan y refrescan en cualquier orden.

La velocidad de refresco en un sistema de barrido aleatorio depende del número de líneas que deba mostrar.

La definición de la imagen se almacena como un conjunto de órdenes de dibujo en una zona de memoria denominada lista de visualización. archivo de refresco de visualización, archivo vectorial, o programa de visualización.

La mayor flexibilidad y las capacidades mejoradas de dibujo de líneas de los sistemas de barrido han provocado el abandono de la tecnología vectorial.

Los sistemas de barrido aleatorio se diseñaron para aplicaciones de dibujo de líneas, tales como diseños de arquitectura e ingeniería, y no son capaces de mostrar escenas con matices realistas. Ya que la definición de una imagen se almacena como un conjunto de instrucciones de dibujo de líneas, en lugar de como un conjunto de niveles de intensidad para todos los puntos de pantalla, las pantallas vectoriales disponen generalmente de resoluciones más altas que los sistemas de barrido. Del mismo modo, las pantallas vectoriales producen dibujos de líneas más suaves, ya que el haz del TRC sigue la trayectoria de la línea, En cambio, un sistema de barrido produce líneas dentadas que se muestran como conjuntos de puntos discretos. Sin embargo, la mayor flexibilidad y las capacidades mejoradas de dibujo de líneas de los sistemas de barrido han provocado el abandono de la tecnología vectorial.

Monitores TRC de color

Mediante la variación de los niveles de intensidad de los tres haces de electrones podemos obtener combinaciones de color en la máscara de sombra del TRC. Si se apagan dos de los cañones, obtenemos sólo el color procedente del único fósforo activado (rojo, verde, o azul). Al activar los tres puntos con iguales intensidades de los haces, vemos el color blanco. El color amarillo se produce con iguales intensidades en los puntos verde y rojo solamente

Sistemas más sofisticados pueden permitir que se establezcan niveles de intensidad intermedios en los haces de electrones, por lo que son capaces de mostrar varios millones de colores.

Un sistema en color RGB con 24 bits de almacenamiento por pixel se le denomina, generalmente, sistema de color completo o sistema de color real.

Pantallas planas

El término pantalla plana se refiere a la clase de dispositivos de vídeo que han reducido su volumen, peso y requisitos de potencia comparados con un TRC.

Una característica significativa de las pantallas planas es que son más finas que los TRC y podemos colgarlas en la pared o llevarlas en la muñeca. Dado que es posible escribir en algunas pantallas planas, se encuentran también disponibles como bloc de notas de bolsillo. Algunos usos adicionales de las pantallas planas son los siguientes: pequeños televisores, pantallas de calculadoras, pantallas de vídeojuegos de bolsillo, pantallas de computadoras portátiles, las pantallas disponibles en los brazos de los asientos de los aviones para ver películas, paneles para anuncios en los ascensores y pantallas gráficas para aplicaciones que requieren monitores altamente portables y celulares.

Podemos clasificar las pantallas planas en dos categorías: pantallas emisivas y pantallas no emisivas.

Pantallas emisivas (o emisores): son dispositivos que transforman la energía eléctrica en luz. Como ejemplos.

Pantallas no emisivas (o no emisores): emplean efectos ópticos para transformar la luz del sol o la luz de alguna otra fuente en patrones gráficos. Ejemplo dispositivos de cristal líquido.

Pantallas de plasma (o pantallas de descarga de gas):

Se construyen rellenando el espacio entre dos placas de cristal con una mezcla de gases que habitualmente incluye el neón. Una serie de tiras de material conductor se colocan de forma vertical en un panel de cristal, y en el otro panel de cristal se sitúan de forma horizontal como se muestra en la (figura).

Si se aplican tensiones de disparo a un par de intersección de conductores verticales y horizontales se provoca que el gas en la intersección de los dos conductores se descomponga en un plasma de electrones e iones que emiten luz. La definición de la imagen se almacena en un búfer de refresco y las tensiones de disparo se aplican para refrescar los píxeles (en las intersecciones de los conductores) 60 veces por segundo. Se emplean métodos de corriente alterna para proporcionar la aplicación más rápida de tensiones de disparo y. por tanto, generar pantallas más brillantes. La separación entre los pixeles se debe al campo eléctrico de los conductores.

Una desventaja de las pantallas de plasma fue que eran estrictamente dispositivos monocromos, pero en la actualidad existen pantallas de plasma con capacidades multicolor.

las pantallas electroluminiscentes de película fina 

se construyen de forma similar a las pantallas de plasma. La diferencia consiste en que el espacio entre las placas de cristal se rellena con fósforo, tal como sulfato de zinc dopado con manganeso, en lugar de con gas. Cuando se aplica una tensión suficientemente alta a un par de electrodos que se cruzan, el fósforo se transforma en conductor en el área de la

intersección de los dos electrodos. La energía eléctrica es absorbida por los átomos de manganeso, los cuales liberan entonces la energía como un punto luminoso similar al efecto del plasma luminiscente en la pantalla de plasma. Las pantallas electroluminiscentes requieren más potencia que las pantallas de plasma, y en color son más difíciles de conseguir.

Pantallas de diodo emisor de luz (LED)

Los píxeles de la pantalla se crean mediante una matriz de diodos, y la resolución de la imagen se almacena en el búfer de refresco. Como en el caso del refresco de la linea de barrido de un TRC, la información se Iee del búfer de refresco y se transforma en niveles de tensión que se aplican a los diodos para producir patrones de luz en la pantalla.

Pantallas de cristal líquido (LCD)

Se utilizan habitualmente en sistemas pequeños, tales como computadoras portátiles y calculadoras. Estos sistemas no emisivos producen una imagen mediante el paso de luz polarizada desde las cercanías o desde una fuente de luz interna a través de un material de cristal líquido que se puede alinear para bloquear o transmitir la luz.

El término cristal líquido hace referencia al hecho de que en estos compuestos las moléculas están dispuestas según una estructura cristalina, a pesar de que fluyen como en un líquido. Las pantallas planas utilizan habitualmente compuestos de cristal líquido nemáticos (con aspecto de hebras) y que tienden a mantener los largos ejes de moléculas con forma de cuerda alineados. Una pantalla plana se puede construir con un cristal líquido nemático, como se demuestra en la Figura.

Dos placas de cristal, cada una de las cuales contiene un polarizador de luz que está alineado en ángulo recto con la otra placa, encierran el material de cristal líquido. En una placa de cristal se han dispuesto conductores transparentes en filas horizontales, y en la otra placa se han dispuesto dichos conductores en columnas verticales. Cada intersección de dos conductores determina un pixel. Normalmente, las moléculas se alinean como se muestra en el «estado encendido» de la Figura. La luz polarizada que pasa a través de material se retuerce para que pase a través del polarizador opuesto. La luz entonces se refleja de vuelta hacia el visor. Para apagar el pixel, aplicamos una tensión a los dos conductores que se intersectan, para alinear las moléculas para que la luz no se retuerza. Esta clase de dispositivos de pantalla plana se denominan LCD de matriz pasiva. La definición de la imagen se almacena en un búfer de refresco, y la pantalla se refresca a una velocidad de 60 cuadros por segundo, como en los dispositivos emisivos. La retroiluminación también se aplica habitualmente en los dispositivos electrónicos de estado sólido, para que el sistema no dependa completamente de las fuentes de luz externas. Los colores se pueden mostrar mediante el empleo de diferentes materiales o tintes y mediante la colocación de una triada de píxeles de color en cada posición de la pantalla. Otro método para construir los LCD consiste en colocar un transistor en cada píxel. empleando tecnología de transistores de película fina. Los transistores se emplean para ajustar la tensión de los pixeles y para prevenir que la carga se fugue de manera gradual de las celdas de cristal líquido, estos dispositivos se denominan pantallas de matriz activa.

Referencias:

Dispositivos de visualización tridimensional

Se han ideado monitores gráficos para mostrar escenas tridimensionales que emplean una técnica que refleja una imagen de un monitor de TRC desde un espejo flexible y que vibra. Conforme el espejo varifocal vibra, cambia su distancia focal. Estas vibraciones están sincronizadas con la representación de un objeto en un monitor de TRC. para que cada punto del objeto sea reflejado desde el espejo hacia la posición espacial correspondiente a la distancia de ese punto, desde una localización de visionado específica. Esto permite caminar alrededor de un objeto o una escena y verlo desde diferentes lados. Como ejemplo tenemos un sistema SpaceGrapb de Genisco. el cual emplea una espejo vibrante para proyectar objetos tridimensionales en un volumen de 25 cm por 25 cm por 25 cm. Este sistema también es capaz de mostrar «rebanadas» bidimensionales transversales de objetos seleccionados a diferentes profundidades.

Tales sistemas se han utilizado en aplicaciones para analizar los datos procedentes de ultrasonografía y dispositivos de rastreo CAE en aplicaciones geológicas para analizar datos topológicos y sísmicos, en aplicaciones de diseño en las que están involucrados objetos sólidos y en simulaciones tridimensionales de sistemas tales como moléculas y de terreno.

Sistemas estereoscópicos y de realidad virtual

Mostrar vistas estereoscópicas de un objeto es otra técnica para representar un objeto tridimensional. Este método no produce imágenes realmente tridimensionales, pero proporciona un efecto tridimensional mediante la presentación de una vista diferente a cada ojo de un observador, para que parezca que las escenas poseen profundidad.

Para obtener una proyección estereoscópica, debemos obtener dos vistas de una escena generadas con las direcciones de visualización desde la posición de cada ojo (izquierda y derecha) hacia la escena. Podemos construir las dos vistas como escenas generadas por computadora con diferentes puntos de vista, o podemos utilizar un par de cámaras estéreo para fotografiar un objeto o una escena. Cuando miramos simultáneamente a la vista izquierda con el ojo izquierdo y a la vista derecha con el ojo derecho. las dos imágenes se funden en una única imagen y percibimos una escena con profundidad.

1.3.2 Sistemas de barrido de líneas

Los sistemas interactivos gráficos de barrido emplean habitualmente varias unidades de procesamiento. Además de la unidad central de procesamiento, un procesador de propósito específico, llamado controlador de vídeo o conlrolador de pantalla, se emplea para controlar el funcionamiento del dispositivo de pantalla.

Sistema de barrido simple.

En éste, el búfer de imagen se puede colocar en cualquier parte de la memoria del sistema de memoria, y el controlador de vídeo accede al búfer de imagen para refrescar la pantalla. Además del controlador de vídeo, los sistemas de barrido más sofisticados emplean otros procesadores tales como procesadores y aceleradores para implementar diversas operaciones gráficas.

Controlador de vídeo

Una zona fija del sistema de memoria se reserva para el búfer de imagen y se permite que el controlador de vídeo acceda a directamente a la memoria del búfer de imagen.

Las posiciones del búfer de imagen y sus correspondientes posiciones de pantalla se referencian en coordenadas cartesianas, En un programa de aplicación, utilizamos los comandos de un paquete de software gráfico, para establecer las coordenadas de posición de los objetos mostrados, relativas al origen del sistema de ejes cartesianos de referencia. A menudo, el origen de coordenadas se fija en la esquina inferior izquierda de la pantalla mediante los comandos del software, aunque podemos situar el origen en cualquier posición para una aplicación concreta. Sin embargo, el hardware realiza el refresco de la pantalla, así como algunos sistemas de software, utilizando como referencia para las posiciones de los píxeles la esquina superior izquierda de la pantalla.

Las funciones básicas de refresco de un controlador de vídeo. Se utilizan dos registros para almacenar los valores de las coordenadas de los pixeles de la pantalla. Inicialmente. se establece el valor del registro x en 0 y el registro y con el valor de la línea superior de barrido. Se obtiene el contenido del búfer de imagen en esta posición de pixel y se utiliza para establecer la intensidad del haz del TRC. Entonces el registro x se incrementa en una unidad, y el proceso se repite para el siguiente píxel en la línea superior de barrido. Este procedimiento se repite para cada pixel a lo largo de la línea superior de barrido. Después de que se ha procesado el último píxel de las lineas superior de barrido, se establece el valor del registro x en 0 y el registro y con el valor de la siguiente línea de barrido, situada debajo de la línea superior de barrido de la pantalla. Entonces se procesan los pixeles a lo largo de esta línea de barrido y el procedimiento se repite para cada sucesiva línea de barrido. Después de procesar todos los pixeles a lo largo de la línea inferior de barrido, el controlador de video restablece los registros con la primera posición de píxel de la línea superior de barrido y el proceso de refresco comienza de nuevo.

Ya que la pantalla se debe refrescar a una velocidad de al menos 60 cuadros por segundo, puede que el procedimiento mostrado no pueda ser realizado por los chips de RAM habituales, si su tiempo de ciclo es demasiado lento. Para acelerar el procesamiento de los pixeles, los controladores de vídeo pueden obtener múltiples valores de píxel del búfer de refresco en cada pasada. Las múltiples intensidades de los pixeles se almacenan en registros separados y se utilizan para controlar la intensidad del haz del TRC para un grupo de pixeles adyacentes. Cuando se ha procesado este grupo de pixeles. se obtiene del búfer de imagen el siguiente bloque de valores de píxel.

Un controlador de vídeo se puede diseñar para realizar otras funciones. El controlador de vídeo puede obtener los valores de los pixeles desde diferentes zonas de memoria en diferentes ciclos de refresco para varias aplicaciones. En algunos sistemas, por ejemplo, hay disponibles múltiples búferes de imagen para que un búfer se pueda utilizar para refresco y mientras los valores de los pixeles se están cargando en los otros búferes. Entonces el búfer de refresco actual puede intercambiar su función con otro de los búferes. Esto proporciona un mecanismo rápido para la generación de animaciones en tiempo real.

Procesador de pantalla de líneas de barrido

Un modo de organizar los componentes de un sistema de barrido que contiene un procesador de pantalla independiente, denominado a veces controlador gráfico o coprocesador de pantalla.

El propósito del procesador de pantalla es liberar a la UCP de las tareas gráficas. Además de la memoria del sistema, se puede disponer de una zona de memoria independiente para el procesador de pantalla.

Una tarea importante del procesador de pantalla consiste en digitalizar una imagen, procedente de un programa de aplicación para transformarla en un conjunto de valores de píxeles para almacenarla en el búfer de cuadro. Este proceso de digitalización se conoce como conversión de barrido. Las órdenes gráficas que especifican líneas rectas y otros objetos geométricos sufren una conversión de barrido en un conjunto de puntos discretos que se corresponde con las posiciones de los píxeles de la pantalla. La conversión de barrido de un segmento de línea recta, por ejemplo, significa que tenemos que localizar las posiciones de los píxeles más cercanos a la trayectoria de la línea y almacenar el color para cada posición en el búfer de imagen. Se utilizan otros métodos similares para convertir mediante barrido otros objetos de una imagen. Los caracteres se pueden definir con rejillas rectangulares de píxeles, o se pueden definir mediante sus líneas de contorno. El tamaño de la matriz utilizada en la cuadrícula de los caracteres puede variar desde, aproximadamente, 5 por 7 hasta 9 por 12 o más en el caso de pantallas de calidad superior.

Una cuadrícula de un carácter se muestra mediante la superposición del patrón de la rejilla rectangular en el búfer de imagen en unas coordenadas específicas. Cuando los caracteres se definen mediante sus contornos se realiza la conversión de barrido de las formas en el búfer de imagen mediante la localización de las posiciones de los píxeles más cercanos al contorno.

Los procesadores de pantalla también se diseñan para realizar otras funciones adicionales. Dentro de estas funciones se incluye la generación de vanos estilos de línea (discontinua, punteada o continua), mostrar áreas de color y aplicar transformaciones a los objetos de una escena. También, los procesadores de pantalla se diseñan habitualmente para actuar como interfaz con dispositivos de entrada interactivos, tales como un ratón.

Con el propósito de reducir los requisitos de memoria de los sistemas de barrido, se han ideado métodos para organizar el búfer de imagen como una lista enlazada y codificar la información del color. Un esquema de organización consiste en almacenar cada línea de barrido como un conjunto de pares de números. El primer número de cada par puede ser una referencia al valor del color y el segundo número puede especificar el número de pixeles adyacentes en la línea de barrido que se deben mostrar en ese color. Esta técnica, llamada codificación de longitud de recorrido, puede proporcionar un considerable ahorro de espacio de almacenamiento si la imagen está constituida principalmente por largos recorridos de un único color cada uno. Se puede seguir un planteamiento similar cuando los colores de los pixeles cambian de forma lineal. Otro planteamiento consiste en codificar el barrido como un conjunto de zonas rectangulares (codificación de celdas). Las desventajas de la codificación de recorridos son que los cambios de color son difíciles de registrar y los requisitos de almacenamiento aumentan a medida que las longitudes de los recorridos decrecen. Además, es difícil para el controlador de pantalla procesar el barrido cuando están involucrados muchos recorridos cortos. Por otra parte, el tamaño de búfer de imagen ya no es importante, puesto que el coste de la memoria se ha reducido considerablemente. No obstante, los métodos de codificación pueden ser útiles en el almacenamiento digital y en la transmisión de la información de la imagen.

1.3.3 Estaciones de trabajo gráficas y sistemas de visualización

1.3.4 Dispositivos de entrada

1.3.5 Dispositivos de copia impresa

Tema para ser revisado por los estudiantes.

1.3.6 Redes gráficas

1.3.7 Gráficos en Internet

1.3.8 Software gráfico

1.3.9 Introducción a OpenGL

En OpenGL se proporciona una biblioteca básica de funciones para especificar primitivas gráficas, atributos, transformaciones geométricas, transformaciones de visualización y muchas otras operaciones. Está diseñada para ser independiente del hardware, por tanto, muchas operaciones, tales como las subrutinas de entrada y salida, no están incluidas en la biblioteca básica. Sin embargo, las subrutinas de entrada y salida y muchas funciones adicionales están disponibles en bibliotecas auxiliares que se han desarrollado para programas OpenGL.


CAPÍTULO II: PRIMITIVAS GRÁFICAS

Los API gráficos son bibliotecas de funciones gráficas que pueden ser utilizadas en un lenguaje de programación (C++, java, C#) para crear aplicaciones gráficas. Para crear una imagen primeramente se describe los componentes individuales de una escena gráfica, luego cada uno de los componentes son descritos por primitivas geométricas que utilizan puntos, Líneas, círculos, superficies, curvas spline, Poli líneas, de esa manera se utilizan las primitivas gráficas.

2.1. Sistemas de Coordenadas de Referencia

Para describir una imagen primero es necesario seleccionar un sistema de coordenadas de referencia del mundo que pueden ser 2D ó 3D. Después, se describen los objetos de la imagen proporcionando sus especificaciones geométricas en términos de la posición dentro de las coordenadas. La descripción de la escena almacena esas posiciones junto con otros datos de los objetos de la imagen, como por ejemplo, extensión de coordenadas (Recuadro de contorno), color. Seguidamente las Rutinas de visualización, se encargan de representar la imagen en el dispositivo de visualización en base a la correspondencia de posiciones de píxeles dentro del buffer de la imagen.

Coordenadas de pantalla

Las ubicaciones sobre un monitor de vídeo se describen mediante coordenadas de pantalla que son números enteros y que se corresponden con las posiciones de píxel dentro del búfer de imagen. Los valores de las coordenadas de píxel proporcionan el número de línea de exploración (el valor ) y el número de columna (el valor ) dentro de una línea de exploración. Los procesos hardware, como el de refresco de pantalla, normalmente direccionan las posiciones de píxel con respecto al extremo superior izquierdo de la pantalla. Las líneas de exploración se identifican por tanto comenzando por 0, en la parte superior de la pantalla, y continuando hasta un cierto valor entero, , en la parte inferior de la pantalla, mientras que las posiciones de píxel dentro de cada línea de exploración se numeran desde 0 a , de izquierda a derecha. Sin embargo, con una serie de comandos software, podemos configurar cualquier sistema de referencia que nos resulte cómodo para las posiciones de pantalla, o bien podríamos utilizar valores cartesianos no enteros para describir una imagen. Los valores de coordenadas que se utilicen para describir la geometría de una escena serán convertidos por las rutinas de visualización a posiciones de píxel enteras dentro del búfer de imagen.

Los algoritmos de líneas de exploración para las primitivas gráficas utilizan las descripciones de coordenadas que definen los objetos para determinar la ubicación de los píxeles que hay que mostrar. Por ejemplo, dadas las coordenadas de los extremos de un segmento de línea, un algoritmo de visualización debe calcular las posiciones para los píxeles comprendidos en la línea definida entre los dos puntos extremos. Puesto que una posición de píxel ocupa un área finita en la pantalla, es preciso tener en cuenta ese tamaño finito de los píxeles dentro de los algoritmos de implementación. Por el momento, vamos a suponer que cada posición entera en la pantalla hace referencia al centro de un área de píxel. Una vez identificadas las posiciones de los pixeles para un objeto, hay que almacenar los valores de color apropiados dentro del búfer de imagen. Con este propósito vamos a suponer que tenemos disponible un procedimiento de bajo nivel de la forma:

setPixel(x,y);

Este procedimiento almacena el valor actual de color dentro del búfer de imagen, en la posición entera (x,y), relativa a la posición seleccionada para el origen de las coordenadas de la pantalla. En ocasiones, se hace necesario también consultar el valor actualmente almacenado en el búfer de imagen para una determinada ubicación de pixel. Por tanto, vamos a suponer que se dispone de la siguiente función de bajo nivel para obtener un valor de color del búfer de imagen:

getPixel(x, y,color);

En esta función, el parámetro color recibe un valor entero que se corresponde con los códigos RGB combinados almacenados para el píxel especificado en la posición (x,y).

Aunque sólo necesitamos los valores de color en las posiciones (x,y) para una imagen bidimensional, se necesita información adicional de coordenadas de pantalla para las escenas tridimensionales. En este caso, las coordenadas de pantalla se almacenan como valores tridimensionales, haciendo referencia la tercera dimensión a la profundidad de las posiciones de objeto en relación con una determinada posición de visualización.

Especificaciones absolutas y relativas de coordenadas

2.2. Algoritmos de Líneas

Un segmento de línea recta dentro de una escena está definido por las coordenadas de los dos extremos del segmento. Para mostrar la línea en un monitor digital, el sistema gráfico debe primero proyectar las coordenadas de los extremos para obtener coordenadas de pantalla de valor entero y determinar las posiciones de píxel más próximas a lo largo de la línea que conecta los dos extremos. Entonces, se cargará en el búfer de imagen el color correspondiente a la línea en las coordenadas de píxel apropiadas, Al leer los datos del búfer de imagen, la controladora de vídeo dibujará los píxeles en pantalla. Este proceso lo que hace es digitalizar la línea para obtener un conjunto de posiciones enteras discretas que. en general, únicamente sirve como aproximación del verdadero trayecto seguido por la línea. Una posición de línea calculada como (10.48, 20.51), por ejemplo, se convierte a la posición de píxel (10, 21). Este redondeo de los valores de las coordenadas para obtener enteros hace que todas las líneas (excepto las horizontales y las verticales) se dibujen con una apariencia escalonada, como puede verse en la Figura. La forma escalonada característica de las líneas digitalizadas es particularmente apreciable en los sistemas de baja resolución, pudiéndose mejorar un poco su apariencia si se utiliza un monitor de resolución más alta. Otras técnicas más efectivas para suavizar la línea digitalizada se basan en ajustar las intensidades de los píxeles a lo largo del trayecto de la línea.

figura: Efecto escalonado de líneas digitalizadas

Ecuaciones de las líneas

Para determinar las posiciones de los píxeles a lo largo de un trayecto de línea recta se utilizan las propiedades geométricas de la línea. La ecuación punto-pendiente cartesiana para una línea recta es:

        (Ecuación 2.1)

Siendo m la pendiente de la línea y b el punto de intersección con el eje y. Puesto que los dos extremos del segmento de línea tienen las coordenadas y, podemos determinar los valores de la pendiente  y  del punto de intersección con el eje  mediante las fórmulas siguientes:

                        (Ecuación 2.2)

                (Ecuación 2.3)

Los algoritmos para la visualización de líneas rectas están basados en la Ecuación 2.1 y en los cálculos indicados por las Ecuaciones 2.2 y 2.3.

Para cualquier intervalo horizontal  a lo largo de una línea, podemos calcular el correspondiente intervalo vertical  a partir de la Ecuación 2.2, de la forma siguiente:

        (Ecuación 2.4)

De forma similar, podemos obtener el intervalo  correspondiente a un valor  especificado mediante la fórmula:

                (Ecuación 2.5)

Estas ecuaciones forman la base para determinar las tensiones de deflexión en los monitores analógicos, como por ejemplo los sistemas de visualización vectorial, donde pueden conseguirse cambios arbitrariamente pequeños en la tensión de deflexión. Para líneas con un valor de pendiente |m|< 1,   puede definirse de forma proporcional a una pequeña tensión de deflexión horizontal (los haces se mueven de izquierda a derecha), y entonces la correspondiente deflexión vertical será proporcional al valor de  calculada a partir de la Ecuación 2.4. Para las líneas cuyas pendientes tienen un módulo |m| >1, puede asignar a  un valor proporcional a una pequeña tensión de deflexión vertical, con lo que la correspondiente tensión de deflexión horizontal será proporcional a , que se calcula a partir de la Ecuación 2.5. Para las líneas con m = 1,  =  y las tensiones de deflexión horizontal y vertical serán iguales. En cada uno de los casos, se generará una línea perfectamente recta y con pendiente m entre los dos extremos especificados.

En los monitores digitales, las líneas se dibujan mediante píxeles, y los pasos en la dirección horizontal o vertical están restringidos por la separación entre los píxeles. En otras palabras, debemos "muestrear" la línea en posiciones discretas y determinar el píxel más cercano a la línea en cada posición de muestreo. Este proceso de digitalización de las líneas rectas se ilustra en la Figura, utilizando posiciones de muestreo discretas a lo largo del eje x.

Algoritmo DDA

El algoritmo de análisis diferencial digital (DDA, Digital Differential Analizer) es un algoritmo de digitalización de líneas basado en calcular  o  utilizando la Ecuación 2.4 o la Ecuación 2.5. Las líneas se muestrean a intervalos unitarios según una de las coordenadas y los correspondientes valores enteros más próximos al trayecto lineal se calculan para la otra coordenada.

Vamos a considerar primero una línea con pendiente positiva, como se muestra en la Figura anterior. Si la pendiente es menor o igual que 1, muestreamos a intervalos unitarios según el eje de las x ( = 1) y calculamos los valores sucesivos de y como:

        (Ecuación 2.6)

El subíndice k adopta valores enteros comenzando en 0 para el primer punto e incrementándose en una unidad cada vez hasta que se alcanza el extremo de la línea. Puesto que m puede ser cualquier número real entre 0.0 y 1.0, cada valor calculado de y debe redondearse al entero más próximo, lo que nos dará la posición de un píxel de pantalla en la columna x que estemos procesando.

Para las líneas con una pendiente positiva superior a 1.0, invertimos los papeles x e y es decir, muestreamos a intervalos unitarios de y ( = 1) y calculamos los valores de x consecutivos mediante:

                (Ecuación 2.7)

En este caso, cada valor de x calculado se redondea a la posición de pixel más cercana en la línea de exploración y actual.

Las Ecuaciones 2.6 y 2.7 están basadas en la suposición de que las líneas deben procesarse desde el extremo situado más a la izquierda hasta el extremo situado más a la derecha. Si invertimos este procesamiento, de modo que se tome como punto inicial el situado a la derecha, entonces tendremos  y,

        (Ecuación 2.8)

o (cuando la pendiente sea superior a 1) tendremos  con,

                (Ecuación 2.9)

Se realizarán cálculos similares utilizando las Ecuaciones 2.6 a 2.9 para determinar las posiciones de los píxeles a lo largo de una línea con pendiente negativa. Así, si el valor absoluto de la pendiente es inferior a 1 y el punto inicial se encuentra a la izquierda, haremos y calcularemos los valores de y mediante la Ecuación 2.6. Cuando el punto inicial esté a la derecha (para la misma pendiente), haremos  y obtendremos los valores y utilizando la Ecuación 2.8. Para una pendiente negativa con valor absoluto superior a 1, usaremos y la Ecuación 2.9 o y la Ecuación 2.7.

Este algoritmo se resume en el siguiente procedimiento, que acepta como entrada dos posiciones enteras en la pantalla correspondientes a los dos extremos de un segmento lineal. Las diferencias horizontales y verticales entre los dos extremos se asignan a los parámetros dx y dy. La diferencia con mayor valor absoluto determina el valor del parámetro steps. Partiendo de la posición (x0, y0), determinemos el desplazamiento requerido en cada paso para generar el siguiente píxel de la línea. Este proceso se ejecuta en bucle un número de veces igual a steps. Si el módulo de dx es superior al módulo de dy y x0 es inferior a xEnd, los valores de los incrementos en las direcciones x e y  son 1 y m, respectivamente. Si el cambio mayor se realiza en la dirección x pero x0 es superior a xEnd, entonces se utilizan los decrementos -1 y -m para generar cada nuevo punto de la línea. En los restantes casos, utilizamos un incremento (o decremento) unitario en la dirección y y un incremento (o decremento) para x igual a 1/m.

 


 void lineDDA(int x0, int y0, int xn, int yn) {

        int x;

        float m, y;

        // Calcular la pendiente

        m = (float) (yn - y0) / (xn - x0);

        x = x0;

        y = y0;

        // Esto solo funciona para una línea

   // de pendiente positiva y menor a 1

        while (x < xn + 1) {

            //Dibujar un pixel en la ventana

            dibujarPunto(x, Math.round(y));

            /* Posición del siguiente pixel */

            x++;

            y += m;

        }

    }

El algoritmo DDA es un método para el cálculo de posiciones de píxeles más rápido que implementan directamente la Ecuación 2.1. Se elimina la multiplicación de la Ecuación 2.1 haciendo uso de las propias características del proceso de digitalización, aplicándose los incrementos apropiados en las direcciones x o y para pasar de una posición de píxel a la siguiente a lo largo de la línea. Sin embargo, la acumulación de errores de redondeo en las sucesivas sumas del incremento de coma flotante pueden hacer que las posiciones de píxel sufran cierta deriva con respecto al verdadero trayecto lineal, para segmentos lineales largos. Además, las operaciones de redondeo y la aritmética en coma flotante inherentes a este procedimiento siguen consumiendo mucho tiempo. Podemos mejorar la velocidad del algoritmo DDA separando los incrementos m y 1/m en sus partes entera y fraccionaria, reduciendo así todos los cálculos a operaciones con números enteros.

Algoritmo de Bresenham para dibujo de líneas

En esta sección, vamos a presentar un algoritmo preciso y eficiente para la generación de líneas digitalizadas; este algoritmo, inventado por Bresenham, utiliza sólo cálculos enteros para determinar los incrementos. Además, el algoritmo de Bresenham para dibujo de líneas puede adaptarse para dibujar círculos y otras líneas.

figura 2.2.1: muestreo en el eje x                                figura 2.2.2: Muestreo en el eje y

Las Figuras anteriores muestran sendas secciones de una pantalla en las que tenemos que dibujar dos segmentos lineales. El eje vertical muestra las posiciones de las líneas de exploración, mientras que el eje horizontal identifica las columnas de píxeles. Muestreando a intervalos unitarios según el eje X en estos ejemplos, necesitamos decidir cuál de las dos posibles posiciones de píxel está más próxima al trayecto lineal en cada paso de muestreo. Comenzando a partir del extremo izquierdo mostrado en la Figura 2.2.1, necesitamos determinar en la siguiente posición de muestreo si debemos dibujar el píxel correspondiente a la posición (11, 11) o el de la posición (11, 12). De forma similar, la Figura 2.2.2 muestra un trayecto lineal con pendiente negativa que comienza a partir del extremo izquierdo situado en la posición de píxel (50,50). En este caso, ¿debemos seleccionar como siguiente posición de píxel las coordenadas (51, 50) o (51, 49)?.

Estas preguntas se responden con el algoritmo de Bresenham comprobando el signo de un parámetro entero cuyo valor es proporcional a la diferencia entre las separaciones verticales de las dos posiciones de píxel con respecto al trayecto lineal.

Para ilustrar el algoritmo de Bresenham, vamos primero a analizar el proceso de digitalización de líneas con pendiente positiva inferior a 1.0. Las posiciones de píxel a lo largo de un trayecto lineal se determinan entonces muestreando a intervalos unitarios según el eje x. Comenzando a partir del extremo izquierdo (x0, y0) de una línea dada, vamos recorriendo cada una de las sucesivas columnas (posición x) y dibujando el píxel cuyo valor y sea más próximo al trayecto lineal.

L.a Figura 2.2.3 ilustra el paso k-ésimo de este proceso. Suponga que hemos determinado que hay que dibujar el píxel situado en (xk,yk) entonces tendremos que decidir qué píxel dibujar en la columna xk+1 = xk + 1. Las dos opciones existentes son los píxeles de las posiciones (xk + 1, yk) y (xk + 1, yk+1).

En la posición de rnuestreo xk + 1, etiquetamos las separaciones verticales de los píxeles con respecto al trayecto lineal matemático con los nombres dlower y dupper (Figura 2.2.4). La coordenada y de la línea matemática en la columna de píxel xk + 1 se calcula como:

d1 = dupper

d2r = dlower

                (Ecuación 2.10)

Entonces:

                        (Ecuación 2.11)

y

                (Ecuación 2.12)

Para determinar cuál de los dos píxeles está más próximo a la línea, podemos realizar una comprobación muy eficiente que se basa en la diferencia entre las dos separaciones de los píxeles:

                (Ecuación 2.13)

Podemos obtener un parámetro de decisión pk para el paso k-ésimo del algoritmo de digitalización de líneas reordenando la Ecuación 3.13 para que sólo haya que realizar cálculos enteros. Podemos hacer esto realizando la sustitución  donde,  y  son las separaciones vertical y horizontal entre los dos extremos de la línea, y definiendo el parámetro de decisión como:

                (Ecuación 2.14)

El signo de  es igual al de  porque  en nuestro ejemplo. El parámetro с es constante y tiene el valor , que es independiente de la posición del píxel y se eliminará en los cálculos recursivos de . Si el píxel de  está "más próximo" al trayecto lineal que el píxel de  (es decir, ), entonces el parámetro de decisión será negativo. En dicho caso, dibujaremos el píxel inferior; en caso contrario, dibujaremos el superior.

Los cambios de coordenadas a lo largo de la línea se producen en pasos unitarios en las direcciones x o y. Por tanto, podemos obtener los valores de los sucesivos parámetros de decisión utilizando cálculos enteros increméntales. En el paso к + 1, el parámetro de decisión se evalúa a partir de la Ecuación 2.14 como:

        

Pero si restamos la Ecuación 2.14 de ésta última ecuación, tendremos:

        

Y como +1, nos queda:

                        Ecuación (2.15)        

Donde el término es 0 ó 1 dependiendo del signo del parámetro .

Este cálculo recursivo de los parámetros de decisión se realiza en cada posición entera x comenzando por el extremo izquierdo de la línea. El primer parámetro p0, se evalúa a partir de la Ecuación 2.14 en la posición inicial de píxel (x0,y0) y con m igual a :

Resumimos el algoritmo de Bresenham para líneas con una pendiente inferior a 1 en el siguiente recuadro. Las constantes  y  se calculan una única vez para cada línea que hay que digitalizar, por lo que las operaciones aritméticas solo requieren sumas y restas enteras de estas dos constantes.


Algoritmo de Bresenham para dibujo de líneas con |m| < 1.0

  1. Introducir los dos extremos de la línea y almacenar el extremo izquierdo en (x0,y0).
  2. Configurar el color para la posición (x0,y0) del búfer de la imagen, es decir, dibujar el primer punto.
  3. Calcular las constantes , ,  y , y obtener el valor inicial del parámetro de decisión, que será

  1. Para cada  a lo largo de la línea, comenzando en к = 0, realizar la siguiente comprobación. Si , el siguiente punto que hay que dibujar será y

En caso contrario, el siguiente punto que habrá que dibujar es  y

  1. Realizar el Paso 4  veces.

El algoritmo de Bresenham puede generalizarse a líneas de pendiente arbitraria considerando la simetría existente entre los diversos octantes y cuadrantes del plano x. Para una línea con pendiente positiva superior a 1.0, intercambiamos los papeles de las direcciones x e y. En otras palabras, avanzamos paso a paso por la dirección y con incrementos unitarios y calculamos los valores de x sucesivos más próximos a la trayectoria de la línea. Asimismo, podríamos también revisar el programa para dibujar los píxeles comenzando a partir de cualquiera de los dos extremos. Si la posición inicial para una línea con pendiente positiva es el extremo derecho, habrá que decrementar tanto x como y a medida que avanzamos paso a paso de derecha a izquierda.

Para garantizar que siempre se dibujen los mismos píxeles independientemente de cuál extremo se utilice como punto inicial, elegiremos siempre el pixel superior (o inferior) de los dos candidatos cuando las dos separaciones verticales con respecto al trayecto de la línea sean iguales (). Para pendientes negativas, los procedimientos son similares, salvo porque ahora una de las coordenadas se decrementa a medida que la otra se incrementa. Finalmente, los casos especiales pueden tratarse por separado: las líneas horizontales (), las líneas verticales () y las líneas diagonales () pueden cargarse directamente en el búfer de imagen sin necesidad de procesarlas mediante el algoritmo de dibujo de líneas.


SOLUCIÓN DEL PRIMER EXAMEN PARCIAL DE COMPUTACIÓN GRAFICA I

  1. Explique el método para evitar el desvanecimiento rápido de la luz emitida por el fósforo.

El método mas utilizado en la actualidad para mantener el resplandor del fósforo es volver a dibujar la imagen redirigiéndola rápidamente el haz de electrones de nuevo sobre los mismos puntos de la pantalla. Este tipo de pantalla se llama TRC de refresco. La frecuencia a la cual una imagen es redibujada en la pantalla se llama velocidad de refresco

  1. Describir las categorías de las pantallas planas.

Podemos clasificar las pantallas planas en dos categorías: pantallas emisivas y pantallas no emisivas.

Pantallas emisivas (o emisores): son dispositivos que transforman la energía eléctrica en luz. Como ejemplos.

Pantallas no emisivas (o no emisores): emplean efectos ópticos para transformar la luz del sol o la luz de alguna otra fuente en patrones gráficos. Ejemplo dispositivos de cristal líquido.

  1. Implemente una función de polilinea utilizando el algoritmo DDA, dado un número cualquiera n de puntos de entrada, evitar el solapamiento de los objetos visualizados. Cuando n=1 se debe mostrar un único punto.

funcion polilinea(Punto[] nPuntos)

inicio

        si (nPuntos.Longitud >1) entonces

        inicio

                x0=nPuntos[0].x

                y0=nPuntos[0].y

                xn=nPuntos[1].x

                yn=nPuntos[1].y

                lineaDDA(x0,y0,xn,yn)

                para i=2 hasta nPuntos.Longitud -1 Hacer

                inicio

                        {Evitar dibujar dos veces el extremo anterior de la línea anterior }

                        {Se determina el siguiente punto del primer extremo de la nueva línea}

                        Punto nuevoOrigen = SiguientePunto(nPuntos[i-1],nPuntos[i])

                        x0=nuevoOrigen.x

                y0=nuevoOrigen.y

                        xn=nPuntos[i].x

                        yn=nPuntos[i].y

                        lineaDDA(x0,y0,xn,yn)

                fin

        fin

        caso contrario

        inicio

                si (nPuntos.Longitud = 1) entonces dibujarPunto(nPuntos[0].x,nPuntos[0].y)

        fin

fin        

  1. Dibuje una línea mediante el algoritmo de Bresenham, la línea está definida por los vértices (14, 11) y (12, 19). Determine las posiciones sucesivas de los pixeles a lo largo de la línea tomando en cuenta los valores del parámetro de decisión.

Ahora variamos en la coordenada Y.

Entonces, podemos determinar las separaciones de los pixeles:

y

        

Para determinar cuál de los dos píxeles está más próximo a la línea, podemos realizar una comprobación muy eficiente que se basa en la diferencia entre las dos separaciones de los píxeles:

                encontramos

                

Para determinar el parámetro de decisión multiplicamos por la         a la diferencia:

        

        

Podemos ahora determinar los parámetros de decisión sucesivos mediante:

        

        

Y como +1, nos queda:

        

Donde el término es 0 ó 1 dependiendo del signo del parámetro .

Para cada  a lo largo de la línea, comenzando en к = 0, realizar la siguiente comprobación. Si , el siguiente punto que hay que dibujar será  y

En caso contrario, el siguiente punto que habrá que dibujar es  y

por lo tanto para el caso de los siguientes puntos tenemos:

(x0,y0) = (14,11), (xn,yn) = (12,19)

                        

k

x

y

p

0

14

11

4

1

14

12

4-4=0

2

14

13

0-4=-4

3

13

15

-4+12=8

4

13

16

8-4=4

5

13

17

4-4=0

6

13

18

0-4=-4

12

19


2.3. Algoritmos para la generación de círculos

Puesto que el círculo es un componente muy frecuentemente utilizado en dibujos y gráficas, muchos paquetes gráficos incluyen un procedimiento para generar círculos completos o arcos circulares. Asimismo, en ocasiones hay disponible una función genérica en las bibliotecas gráficas para mostrar diversos tipos de curvas, incluyendo círculos y elipses.

Propiedades de los círculos

Figura propiedades del círculo

Un círculo (Figura anterior) se define como el conjunto de puntos que se encuentran a una distancia determinada r con respecto a una posición central ).Para cualquier punto ) del círculo, esta relación de distancia se expresa mediante el teorema de Pitágoras en coordenadas cartesianas:

Podemos utilizar esta ecuación para calcular la posición de los puntos sobre una circunferencia, recorriendo el eje x en pasos unitarios desde  a  y calculando los correspondientes valores y en cada posición mediante la fórmula:

Pero este no es el mejor método para generar un círculo. Uno de los problemas con este método es que requiere unos considerables cálculos en cada paso. Además, el espaciado entre los píxeles dibujados no es uniforme, como se ilustra en la siguiente figura.

Otra forma de eliminar el espaciado desigual es utilizando coordenadas polares r y ϴ.

Ecuación de la circunferencia en forma paramétrica polar:.

Al utilizar un paso angular fijo, se dibujara un círculo con puntos equiespaciados a lo largo de toda la circunferencia. Para reducir el número de cálculos podemos utilizar una gran separación angular entre los puntos y conectar los puntos mediante un segmento de línea recta con el fin de aproximar la trayectoria circular.

Para obtener un trazado más continuo en un monitor digital, podemos fijar como paso angular el valor. Esto nos da posiciones de pixeles que están separados aproximadamente una unidad. Pero aunque las coordenadas polares proporcionan un espaciado homogéneo de los puntos, los cálculos trigonométricos siguen siendo bastante laboriosos.

Para cualquiera de los métodos anteriores se puede reducir los cálculos utilizando la simetría que se presentan en los círculos.

La forma de los círculos es similar en cada uno de los cuadrantes. Por tanto, si determinamos las posiciones de la curva en el primer cuadrante, podemos generar la sección circular del segundo cuadrante del plano x observando que ambas secciones son simétricas con respecto al eje y. Y las secciones circulares de los cuadrantes tercero y cuarto pueden obtenerse a partir de las secciones de los primeros cuadrantes considerando la simetría con respecto al eje X. En base a este razonamiento podemos identificar la simetría entre los los octantes.

rehacer grafico de simetria de octantes!!!!!

Aprovechando toda la simetría del círculo de esta forma, podemos generar todas las posiciones del píxel alrededor del círculo calculando únicamente los puntos correspondientes al sector que va desde  a . La pendiente de la curva en este octante tiene una magnitud igual o inferior a uno. Para  , la pendiente del círculo es cero, y para  la pendiente es -1.0.

Considerando lo anterior, todavía los cálculos siguen siendo complejos, por los cálculos con trigonométricos y raíces. Por lo tanto, debemos buscar algoritmos con parámetros de decisión como Bresenham para líneas donde se realizan cálculo de números enteros. Podemos adaptar el algoritmo de dibujo de líneas de Bresenham a la generación de círculos definiendo los parámetros de decisión para hallar el píxel más cercano a la circunferencia en cada paso de muestreo. Sin embargo, la Ecuación cartesiana del círculo es no lineal, por io que haría falta calcular raíces cuadradas para hallar las distancias de los píxeles con respecto a la trayectoria circular. El algoritmo de Bresenham para círculos evita estos cálculos de raíces cuadradas comparando los cuadrados de las distancias de separación de los píxeles. Sin embargo, se puede realizar una comparación directa de distancias sin necesidad de hallar raíces cuadradas.

La idea básica que subyace a este método consiste en comprobar si el punto medio situado entre dos píxeles está situado dentro o fuera del círculo. Este método se puede, asimismo, generalizar más fácilmente a otras cónicas y para un círculo de radio entero, esta técnica del punto medio genera las mismas posiciones de píxel que el algoritmo de Bresenham para círculos. Para un segmento de línea recta, el método del punto medio es completamente equivalente al algoritmo de Bresenham para líneas. Asimismo, el error máximo a la hora de determinar las posiciones de los píxeles para cualquier sección cónica utilizando el test del punto medio está limitado a un medio de la separación entre píxeles.

Algoritmo del punto medio para círculos

Como en el ejemplo de digitalización de líneas, muestreamos a intervalos unitarios y determinados la posición de píxel más próxima a la trayectoria circular especificada. Para un radio r dado y unas coordenadas del centro de valor , podemos primero ejecutar el algoritmo para calcular las posiciones de los píxeles alrededor de una trayectoria circular centrada en el origen de coordenadas (0, 0). Después, movemos cada posición calculada (x, y) a la posición de pantalla adecuada sumando.  a x y  a y. A lo largo de la sección circular que va desde x = 0 a x = y en el primer cuadrante, la pendiente de la curva varía desde 0 a — 1.0. Por tanto, podemos tomar pasos unitarios en la dirección x positiva a lo largo de este octante y utilizar un parámetro de decisión para determinar cuál de las dos posibles posiciones de píxel en cada columna está más cerca verticalmente a la trayectoria circular. Las posiciones en los otros siete octantes se obtienen entonces por simetría.

Para aplicar el método del punto medio, definimos una función circular como:

Las comprobaciones de la Ecuación anterior se realizan para los puntos intermedios situados en la vecindad de la trayectoria circular en cada paso de muestreo. Así. la función generadora del círculo es un parámetro decisión en el algoritmo del punto medio, y podemos determinar los cálculos incrementales necesarios para esta función, como hicimos con el algoritmo de generación de líneas.

En la figura anterior se  muestra el punto medio entre los dos pixeles candidatos para la posición de muestreo X y. Suponiendo que acabamos de dibujar el píxel . necesitaremos a continuación determinar si el píxel en la posición se encuentra más cerca o más lejos del círculo que el situado en la posición . Nuestro parámetro de decisión será la Ecuación siguiente de generación del círculo, evaluado en punto medio entre estos dos pixeles:

Si , este punto medio se encontrará en el interior del círculo y el píxel situado en la línea de exploración estará más cerca de la frontera del círculo. En caso contrario, el punto intermedio se encuentra fuera del círculo o sobre la misma circunferencia, y seleccionaremos el píxel correspondiente a la línea de exploración .

Los sucesivos parámetros de decisión se obtienen utilizando cálculos incrementales. Podemos obtener una fórmula recursiva para el siguiente parámetro de decisión evaluando la función circular en la posición de muestreo :

Donde  es ó , dependiendo del signo de .

Los incrementos para obtener son (si es negativo) o . La evaluación de los términos  y  también puede hacerse incrementalmente mediante las fórmulas:

En la posición inicial (0,r), estos dos términos tienen los valores 0 y 2r, respectivamente. Cada valor sucesivo para el término se obtiene sumando 2 al valor anterior y cada valor sucesivo del término se obtiene restando 2 al valor anterior.

El parámetro de decisión inicial se obtiene evaluando la función de generación del círculo en la posición inicial :

 

Si el radio r está especificado como un valor entero, podemos simplemente redondear de la forma siguiente:

        (Para r entero)

dado que Todos los incrementos son enteros.

Como en el algoritmo de líneas de Bresenham, el método del punto medio calcula las posiciones de los pixeles a lo largo de la circunferencia utilizando sumas y restas enteras, suponiendo que los parámetros del círculo estén especificados en coordenadas enteras de pantalla. Podemos resumir los pasos del algoritmo del punto medio para generación de círculos de la forma siguiente.


Algoritmo:

1. Introducir el valor de r y el centro del círculo . Punto inicial del círculo .

2. Calcular el valor inicial del parámetro de decisión como:

3. Para cada posición comenzando en k=0, realizar la siguiente comprobación:

Si , el siguiente punto a lo largo de un círculo centrado en (0,0) será y

en caso contrario, el siguiente punto del círculo será: y    

Donde:         

4. Determinar los puntos simétricos de los otros siete octantes.

5. Mover cada posición del píxel (x,y) calculando la trayectoria circular centrada en  y dibujar los valores de las coordenadas:

6. Repetir los pasos del 3 al 5 hasta que


2.4. Algoritmos para la generación de elipses

En términos simples, una elipse es un círculo alargado. También podemos escribir una elipse como un círculo modificado cuyo radio varía desde un valor máximo en una dirección hasta un valor mínimo en la dirección perpendicular. Los segmentos de línea recta trazados en el interior de la elipse en estas dos direcciones perpendiculares se denomina eje mayor y menor de la elipse.

Propiedades de las elipses

Puede darse una definición precisa de una elipse en términos de la distancia desde cualquier punto de la elipse a dos posiciones fijas, denominadas focos de la elipse. La suma de estas dos distancias es constante para todos los puntos de la elipse.

Si etiquetamos como  y  las distancias a los focos desde cualquier punto P = (x, y) de la elipse, la ecuación general de la elipse puede escribirse:

Expresando las distancias  y   en términos de las coordenadas de los focos  y . tendremos:

        (Ecuación 2.4.1)

Elevando esta ecuación al cuadrado, despejando la raíz cuadrada restante y volviendo a elevar al cuadrado, podremos reescribir la ecuación general de la elipse de la forma

        (Ecuación 2.4.2)

donde los coeficientes A, B, C, D, E y F se evalúan en términos de las coordenadas de los focos y de las dimensiones de los ejes mayor y menor de la elipse. El eje mayor es el segmento de línea recta que se extiende desde un lado de la elipse hasta el otro a través de los focos. El eje menor abarca la dimensión más pequeña de la elipse, bisecando perpendicularmente el eje mayor en su punto medio (centro de la elipse) situado entre los dos focos.

Un método interactivo para especificar una elipse con una orientación arbitraria consiste en introducir los dos focos y un punto de la elipse. Con estos tres conjuntos de coordenadas, podemos evaluar la constante de la Ecuación 2.4.1. Entonces, se pueden calcular los valores de los coeficientes de la Ecuación 2.4.2 y utilizarlos para generar los píxeles a lo largo de la trayectoria elíptica.

Las ecuaciones de la elipse se pueden simplificar enormemente si se alinean los ejes mayor y menor con los ejes de coordenadas. En la Figura se muestra una elipse en “posición estándar”, con los ejes mayor y menor orientados en paralelo a los ejes.x e y.

El parámetro rx de este ejemplo indica el semieje mayor, mientras que el parámetro ry indica el semieje menor. La ecuación de la elipse mostrada en la Figura puede escribirse en términos de las coordenadas del centro de la elipse y de los parámetros rx y ry de la forma siguiente:

                Ecuación 2.4.3

Utilizando las coordenadas polares r y ϴ, podemos también describir la elipse en su posición estándar con las ecuaciones paramétricas.

 

El ángulo ϴ, denominado ángulo de excentricidad de la elipse, se mide a lo largo del perímetro de un círculo circunscrito. Si , el radio del círculo circunscrito es . En caso contrario, el círculo circunscrito tiene como radio .

Al igual que con el algoritmo del círculo, pueden utilizarse consideraciones de simetría para reducir los cálculos. Una elipse en posición estándar presenta simetría entre los distintos cuadrantes pero, a diferencia del círculo, los dos octantes de cada cuadrante no son simétricos. Por tanto, deberemos calcular las posiciones de los píxeles a lo largo del arco elíptico que recorre un cuadrante y luego utilizar las consideraciones de simetría para obtener las posiciones de la curva en los tres cuadrantes restantes.

Algoritmo del punto medio para la elipse

La técnica que vamos a utilizar es similar a la que hemos empleado para visualizar el círculo digitalizado. Dados los parámetros ,  y , determinamos las posiciones  de la curva para una elipse en posición estándar centrada en el origen y luego desplazamos todos los puntos utilizando un desplazamiento constante, de modo que la elipse está centrada en . Si queremos también mostrar la elipse en posición no estándar, podemos rotarla alrededor de su centro con el fin de reorientar los ejes mayor y menor en las direcciones deseadas. Pero por el momento, vamos a considerar únicamente la visualización de elipses en posición estándar.

El método del punto medio para la elipse se aplica en dos partes para todo el primer cuadrante.

La Figura muestra la división del primer cuadrante de acuerdo con la pendiente de una elipse con rx < ry. Procesamos este cuadrante tomando pasos unitarios en la dirección x allí donde la pendiente de la curva tenga una magnitud inferior a 1.0 y luego tomando pasos unitarios en la dirección y cuando la pendiente tenga una magnitud superior a 1.0.

Las regiones 1 y 2 de la figura anterior pueden procesarse de diversas formas. Podemos empezar en la posición (0, ry) y avanzar en el sentido de las agujas del reloj a lo largo del primer cuadrante de la trayectoria elíptica, pasando de utilizar pasos unitarios según x a pasos unitarios según y cuando la pendiente sea inferior a -1.0. Alternativamente, podríamos empezar en (rx , 0) y seleccionar los puntos en sentido contrario a las agujas del reloj, pasando de utilizar pasos unitarios según y a pasos unitarios según x cuando la pendiente sea superior a -1.0. Si tuviéramos varios procesadores trabajando en paralelo, podríamos calcular las posiciones de los píxeles en ambas regiones simultáneamente. Como ejemplo de implementación secuencial del algoritmo del punto medio, vamos a tomar como posición inicial (0, ry ) y a recorrer la trayectoria de la elipse en el sentido de las agujas del reloj para todo el primer cuadrante.

Podemos definir una función de la elipse a partir de la Ecuación 2.4.3 con (xc, yc) = (0, 0), de la forma siguiente:

        Ecuación 2.4.4

que tiene las siguientes propiedades:

Así, la función de la elipse se puede utilizar como parámetro de decisión para el algoritmo del punto medio, En cada posición de muestreo, seleccionamos el siguiente píxel de la trayectoria elíptica de acuerdo con el signo de la función de la elipse, evaluado en el punto medio entre los dos píxeles candidatos.

Comenzando en (0, ry) tomamos pasos unitarios en la dirección x hasta que alcanzamos la frontera entre las regiones 1 y 2. Después, pasamos a utilizar pasos unitarios en la dirección y para el resto de la curva dentro del primer cuadrante. En cada paso, necesitamos comprobar el valor de la pendiente de la curva. La pendiente de la elipse se calcula a partir de la Ecuación 2.4.4:

En la frontera entre la región 1 y la región 2, y,

Por tanto, habremos salido de la región 1 cuando:

La Figura muestra el punto medio entre los dos píxeles candidatos en la posición de muestreo xk+1. dentro de la primera región. Suponiendo que hayamos seleccionado la posición (xk,yk) en el paso anterior, determinamos la siguiente posición a lo largo de la trayectoria elíptica evaluando el parámetro de decisión (es decir, la función de la elipse dada en la Ecuación 2.4.4) en dicho punto intermedio:

Si  < 0, el punto medio estará dentro de la elipse y el píxel de la línea de exploración estará más próximo a la frontera de la elipse. En caso contrario, el punto medio está fuera de la elipse o sobre ella y seleccionaremos el píxel situado en la línea de exploración .

En la siguiente posición de muestreo , el parámetro de decisión para la región 1 se evalúa como:

donde , puede ser ó , dependiendo del signo de  .

Los parámetros de decisión se incrementan de la forma siguiente:

Los incrementos para los parámetros de decisión pueden calcularse utilizando únicamente sumas y restas, como en el algoritmo de los círculos, ya que los valores para los términos  y  pueden obtenerse incrementalmente. En la posición inicial , estos dos términos tienen como valor:

                Ecuación 2.4.5

                Ecuación 2.4.6

A medida que se incrementan x e y, los valores actualizados se obtienen sumando  al valor actual del término de incremento de la Ecuación 2.4.5 y restando  del valor actual del término de incremento de la Ecuación 2.4.6. Los valores de incremento actualizados se comparan en cada caso y nos moveremos de la región 1 a la región 2 cuando se satisfaga la condición .

En la región 1, el valor inicial del parámetro de decisión se obtiene evaluando la función de la elipse en la posición inicial :

En la región 2, muestreamos a intervalos unitarios en la dirección y negativa y el punto medio se tomará ahora entre píxeles horizontales para cada paso de muestreo como se muestra la Figura.

Para esta región, el parámetro de decisión se evalúa como:

Si  > 0, el punto medio se encontrará fuera de la elipse y seleccionaremos el píxel correspondiente a . Si . el punto medio estará sobre la elipse o dentro de ella y seleccionaremos la posición de píxel

Para determinar la relación entre parámetros de decisión sucesivos dentro de la región 2, evaluamos la función de la elipse en el siguiente punto de muestreo :

donde , vale  ó , dependiendo del signo de .

Cuando entramos en la región 2, se toma como posición inicial  la última posición seleccionada en la región 1. y el parámetro de decisión inicial en la región 2 será entonces:

Para simplificar el cálculo de . podemos seleccionar las posiciones de los pixeles en sentido contrario a las agujas del reloj, comenzando en (, 0). Los pasos unitarios se tomarían entonces en la dirección y positiva, hasta alcanzar la última posición seleccionada en la región 1.

El algoritmo de punto medio puede adaptarse para generar una elipse en posición no estándar, utilizando la función de la elipse dada por la Ecuación  y calculando las posiciones de los pixeles a lo largo de toda la trayectoria elíptica. Alternativamente, podemos reorientar los ejes de la elipse para ponerlos en posición estándar, utilizando los métodos de transformación explicados en los siguientes apartados del presente documento, después de lo cual se aplicaría el algoritmo del punto medio para elipses con el fin de determinar las posiciones de la curva; finalmente, las posiciones de píxel calculadas se convertirían para obtener las posiciones correspondientes según la orientación original de la elipse.

Suponiendo que nos den ,  y  el centro de la elipse en coordenadas de pantalla enteras, sólo hacen falta cálculos incrementales enteros para determinar los valores de los parámetros de decisión en el algoritmo del punto medio para generación de elipses. Los incrementos ,  , y   se evalúan una única vez al principio del procedimiento.


Algoritmo del punto medio para generación de una elipse

1. Introducir ,  y  el centro de la elipse y obtener el primer punto sobre una elipse centrada en el origen, de la forma siguiente:

2. Calcular el valor inicial del parámetro de decisión en la región 1 mediante la fórmula:

3. En cada posición  dentro de la región 1. comenzando en k = 0, realizar la siguiente comprobación. Si  , el siguiente punto a lo largo de la elipse centrada en (0, 0) es         y

En caso contrario, el siguiente punto a lo largo de la elipse será y  y.

con

debiendo continuar este proceso hasta que .

4. Calcular el valor inicial del parámetro de decisión en la región 2 mediante la fórmula:

donde  es la última posición calculada para la región 1.

5. En cada posición  de la región 2, comenzando en k = 0, realizar la siguiente comprobación. Si  > 0, el siguiente punto a lo largo de la elipse centrada en (0, 0) será y

 

En caso contrario, el siguiente punto a lo largo de la elipse será  y

utilizando los mismos cálculos incrementales para x e y que en la región 1. Este proceso debe continuar hasta que y = 0.

6. Para ambas regiones, determinar los puntos simétricos en los otros tres cuadrantes.

7. Mover cada posición de píxel (x, y) calculada a la trayectoria elíptica centrada en (xc, yc) y dibujar los valores de coordenadas:


Ejemplo Dibujo de una elipse mediante el algoritmo del punto medio dados los parámetros de entrada para la elipse rx = 16 y ry = 18 y (Xc,Yc)=(4,4).


2.5. Primitivas de rellenado de áreas

Otro elemento útil, además de los puntos, los segmentos lineales y las curvas, para la descripción de los componentes de una imagen son las áreas rellenas con algún color homogéneo o patrón. Un elemento de imagen de este tipo se denomina normalmente área rellena. La mayoría de las veces, las áreas rellenas se utilizan para describir las superficies de los objetos sólidos, pero también resultan útiles en diversas otras aplicaciones.

Asimismo, las regiones rellenas suelen ser superficies planas, principalmente polígonos. Pero en términos generales hay muchos tipos de formas posibles para una región del dibujo que podamos querer rellenar con algún determinado color.

Aunque pueden existir áreas rellenas de cualquier forma, las bibliotecas gráficas no suelen soportar la especificación de formas de relleno arbitrarias. La mayoría de las rutinas de biblioteca requieren que las áreas de relleno se especifiquen en forma de polígonos. Las rutinas gráficas pueden procesar más eficientemente los polígonos que otros tipos de áreas de relleno, porque las fronteras de los polígonos se describen mediante ecuaciones lineales. Además, la mayoría de las superficies curvas pueden aproximarse razonablemente bien mediante una serie de parches poligonales, de la misma forma que una línea curva puede aproximarse mediante un conjunto de segmentos lineales. Y cuando se aplican efectos de iluminación y procedimientos de sombreado de superficies, la superficie curva aproximada puede mostrarse con un grado de realismo bastante bueno. La aproximación de una superficie curva mediante caras poligonales se denomina en ocasiones teselación de la superficie, o ajuste de la superficie mediante una malla poligonal. La visualización de tales tipos de figuras puede generarse muy rápidamente mediante vistas alámbricas, que sólo muestran las aristas de los polígonos con el fin de proporcionar una indicación general de la estructura de la superficie. Posteriormente, el modelo alámbrico puede sombrearse para generar una imagen de una superficie material con aspecto natural. Los objetos descritos con un conjunto de parches de superficie poligonales se suelen denominar objetos gráficos estándar o simplemente objetos gráficos.

En general, podemos crear áreas rellenas con cualquier especificación de contorno, como por ejemplo un círculo o un conjunto conectado de secciones de curvas de tipo spline. Y algunos de los métodos poligonales explicados en la siguiente sección pueden adaptarse para mostrar áreas de relleno con contomos no lineales.

2.5.1. Áreas de relleno poligonales

Desde el punto de vista matemático, un polígono se define como una figura plana especificada mediante un conjunto de tres o más puntos, denominados vértices, que se conectan en secuencia mediante segmentos lineales, denominados bordes, o aristas del polígono. Además, en geometría básica, es necesario que las aristas del polígono no tengan ningún punto en común aparte de los extremos. Así, por definición, un polígono debe tener todos sus vértices en un mismo plano y las aristas no pueden cruzarse. Como ejemplos de polígonos podemos citar los triángulos, los rectángulos, los octógonos y los decágonos. Algunas veces, cualquier figura plana con un contorno de tipo polilínea cerrado se denomina también polígono, y si además sus aristas no se cortan se le denomina polígono estándar o polígono simple. Para tratar de evitar referencias ambiguas

a los objetos, utilizaremos el término “polígono” para referirnos exclusivamente a las formas planas que tienen un contorno de tipo polilínea cerrada y en el que las aristas no se cortan.

Para una aplicación infográfica, es posible que un conjunto designado de vértices de un polígono no caigan exactamente en un mismo plano. Esto puede deberse a los errores de redondeo en el cálculo de los valores numéricos, a errores en la selección de las coordenadas de los vértices o, más normalmente, a la aproximación de una superficie curva mediante un conjunto de parches poligonales. Una forma de rectificar este problema consiste simplemente en dividir la malla de superficie especificada en una serie de triángulos. Pero en algunos casos puede haber razones para retener la forma original de los parches de la malla, así que se han desarrollado métodos para aproximar una forma poligonal no plana mediante una figura plana.

Clasificaciones de los polígonos

Un ángulo interior de un polígono es un ángulo dentro del contorno del polígono que está formado por dos aristas adyacentes. Si todos los ángulos interiores de un polígono son menores o iguales que 180°, el polígono es convexo. Una definición equivalente de polígono convexo es la que dice que el interior del polígono está completamente contenido en uno de los lados de la línea de extensión infinita de cualquiera de sus aristas.

Asimismo, si seleccionamos cualesquiera dos puntos del interior de un polígono convexo, el segmento de línea que une los dos puntos se encuentra también en el interior del polígono. Un polígono que no es convexo se denomina cóncavo. Dibujar ejemplos de polígonos convexos y cóncavos.

A menudo se utiliza el término polígono degenerado para describir un conjunto de vértices que son colineales o en el que algunos de los vértices son coincidentes. Los vértices polilineales generan un segmento de línea, mientras que los vértices repetidos pueden generar una forma poligonal con líneas extrañas, aristas solapadas o aristas de longitud 0. Algunas veces se aplica también el término polígono degenerado a una lista de vértices que contienen menos de tres vértices.

Para ser robusto, un paquete gráfico podría rechazar los conjuntos de vértices degenerados o no planares, pero esto requiere pasos de procesamiento adicionales para identificar estos problemas, por lo que los sistemas gráficos suelen dejar dicho tipo de consideraciones al programador.

Los polígonos cóncavos también presentan problemas. La implementación de los algoritmos de rellenado y de otras rutinas gráficas es más complicada para los polígonos cóncavos, por lo que suele ser más eficiente partir un polígono en un conjunto de polígonos convexos antes de continuar con su procesamiento. Al igual que sucede con otros algoritmos de preprocesamiento de polígonos, la división de polígonos cóncavos no suele incluirse en las bibliotecas gráficas. Algunos paquetes gráficos, incluyendo OpenGL, requieren que todos los polígonos rellenos sean convexos, mientras que otros sistemas sólo aceptan áreas de relleno triangulares, que simplifican enormemente muchos de los algoritmos de visualización.

Un polígono cóncavo tiene al menos uno de sus ángulos interiores superior a 180°. Asimismo, la extensión de algunas aristas de un polígono cóncavo se cortará con otras aristas, y algunas parejas de puntos del interior del polígono producirá un segmento de línea que intercepta al contorno del polígono. Por tanto, podemos utilizar cualquiera de estas características de un polígono cóncavo como base para construir un algoritmo de identificación.

Si asignamos un vector a cada arista de un polígono, podemos utilizar el producto vectorial de las aristas adyacentes para comprobar la concavidad. Todos esos productos vectoriales tendrán el mismo signo (positivo o negativo) en los polígonos convexos. Por tanto, si algún producto vectorial nos da un valor positivo y otro nos da un valor negativo, tendremos un polígono cóncavo. La Figura ilustra el método del producto vectorial de los vectores de las aristas para la identificación de polígonos cóncavos.

Otra forma de identificar un polígono cóncavo consiste en examinar las posiciones de los vértices del polígono en relación con la línea de extensión de cualquier arista. Si algunos de los vértices se encuentran a un lado de la línea de extensión y otros están en el otro lado, el polígono será cóncavo.

División de los polígonos cóncavos

Una vez identificado un polígono cóncavo, podemos dividirlo en un conjunto de polígonos convexos. Esto puede realizarse utilizando los vectores de las aristas y los productos vectoriales correspondientes. Alternativamente, podemos utilizar las posiciones de los vértices en relación con la línea de extensión de una arista para determinar qué vértices se encuentran en un lado de la línea y cuáles están en el otro. Para los siguientes algoritmos, vamos a suponer que todos los polígonos se encuentran en el plano xy. Por supuesto, la posición original de un polígono descrita en coordenadas universales puede no estar en el plano xy pero siempre podemos moverlo hasta ese plano utilizando los métodos de transformación.

Con el método vectorial para dividir un polígono cóncavo, primero necesitamos formar los vectores de las aristas. Dadas dos posiciones de vértice consecutivas,  y , definimos el vector de la arista que los une de la forma siguiente:

A continuación calculamos los productos vectoriales de los sucesivos vectores de las aristas, siguiendo el orden del perímetro del polígono. Si la componente Z de algún producto vectorial es positiva mientras que otros productos vectoriales tienen una componente z negativa, el polígono es cóncavo, mientras que en caso contrario el polígono será convexo. Esto presupone que no haya tres vértices sucesivos o lineales, ya que en ese caso el producto vectorial de los dos vectores representativos de las aristas que conectan estos vértices será cero. Si todos los vértices son colineales, tendremos un polígono degenerado (una línea recta). Podemos aplicar el método vectorial procesando los vectores de las aristas en sentido contrario a las agujas del reloj. Si cualquiera de los productos vectoriales tiene una componente z negativa (como la Figura), el polígono será cóncavo y podemos partirlo utilizando la línea del primero de los vectores con los que se ha calculado el producto vectorial.

El siguiente ejemplo ilustra este método para la división de un polígono cóncavo.

 

También podemos dividir un polígono cóncavo utilizando un método rotacional. Vamos a movernos en sentido contrario a las agujas del reloj siguiendo las aristas del polígono, y vamos a desplazar la posición del polígono de modo que cada vértice  se encuentre por tumo en el origen de coordenadas. A continuación, rotamos el polígono alrededor del origen en el sentido de las agujas del reloj, de modo que el siguiente vértice se encuentre sobre el eje x. Si el siguiente vértice, , está por debajo del eje x, el polígono será cóncavo. En este caso, partiremos el polígono según el eje x para formar dos nuevos polígonos y repetiremos el test de concavidad para cada uno de los dos nuevos polígonos. Los pasos anteriores se repiten hasta que hayamos comprobado todos los vértices de la lista de polígonos. La Figura ilustra el método rotacional para la división de un polígono cóncavo.

División de un polígono convexo en un conjunto de triángulos

Una vez obtenida la lista de vértices para un polígono convexo, podemos transformarlo en un conjunto de triángulos. Esto puede hacerse seleccionando primero cualquier secuencia de tres vértices consecutivos y formando con ella un nuevo polígono (un triángulo). Entonces se borra el vértice intermedio del triángulo de la lista de vértices original, volviéndose a aplicar el mismo procedimiento a esta lista de vértices modificada para extraer otro triángulo. Continuamos formando triángulos de esta forma hasta que el polígono original quede reducido a sólo tres vértices, que definirán el último triángulo del conjunto. Un polígono cóncavo también puede dividirse en un conjunto de triángulos utilizando esta técnica, siempre y cuando los tres vértices seleccionados en cada caso formen un ángulo interior que sea inferior a 180° (un ángulo convexo).

2.6. Generación de caracteres.

Las imágenes gráficas incluyen a menudo información textual, como por ejemplo etiquetas, gráficas, carteles en edificios o vehículos e información general de identificación para aplicaciones de simulación y visualización. La mayoría de los paquetes gráficos incluyen rutinas para generar primitivas de caracteres gráficos. Algunos sistemas proporcionan un amplio conjunto de funciones de caracteres, mientras que otros sólo ofrecen un soporte de generación de caracteres mínimo.

Las letras, los números y otros caracteres pueden mostrarse con diversos tamaños y estilos, el estilo global de diseño para un conjunto (o familia) de caracteres se denomina tipo de letra. Hoy en día, hay disponibles miles de tipos de letra distintos para aplicaciones informáticas, como por ejemplo Courier, Helvética, New York, Palatino o Zapf Chancery. Originalmente, el término fuente hacía referencia a un conjunto de caracteres extruidos en metal con un tamaño y formato concretos, como por ejemplo Courier Itálica de 10 puntos o Palatino Negrita de 12 puntos. Una fuente de 14 puntos tiene una altura total de los caracteres de unos 0,5 centímetros; en otras palabras 72 puntos es aproximadamente equivalente a 2,54 centímetros (una pulgada).

Hoy en día, se usan los términos fuente y tipo de letra de manera intercambiable, ya que las tareas modernas de impresión raramente se realizan con caracteres extruidos en metal.

Los tipos de letra (o fuertes) pueden dividirse en dos amplios grupos: serif y sans serif. Un tipo serif tiene pequeñas líneas o acentos en los extremos de los principales trazos de los caracteres, mientras que los tipos sans serif no tiene este tipo de acentos. Los tipos serif son generalmente más legibles; es decir, es más fácil leer grandes bloques de texto. Por otra parte, los caracteres individuales de los tipos sans-serif son más fáciles de reconocer, por lo que este tipo de letra resulta adecuada para etiquetas y cortos encabezados.

Las fuentes también se clasifican dependiendo de si son monoespaciadas o proporcionales. Todos los caracteres de una fuente monoespaciada tienen la misma anchura, mientras que en una fuente proporcional la anchura de los caracteres varía.

Se utilizan dos representaciones diferentes para almacenar fuentes en una computadora. Un método simple para representar las formas de los caracteres en un tipo de letra concreto consiste en definir un patrón de valores binarios sobre una cuadrícula rectangular. Entonces, ese conjunto de caracteres se denomina fuente de mapa de bits. Un conjunto de caracteres de mapa de bits también se denomina en ocasiones fuente ráster o fuente digitalizada.

Otro esquema más flexible consiste en describir las formas de los caracteres utilizando secciones de línea rectas y de curvas, como por ejemplo en PostScript, en este caso, el conjunto de caracteres se denomina fuente de contorno o fuente de trazos. La figura ilustra los dos métodos para la representación de caracteres. Cuando se aplica el patrón de la parte izquierda de la Figura a un área del búfer de imagen, los bits con valor 1 designan qué posiciones de píxel hay que mostrar en un color especificado. Para visualizar la forma del carácter de la parte de la derecha de la Figura, el interior del contorno de carácter se trata como un área de relleno.

Las fuentes de mapa de bits son las más simples de definir y de visualizar: basta con asignar las cuadrículas de caracteres a una posición dentro del búfer de imagen. Sin embargo, en general, las fuentes de mapa de bits requieren más espacio de almacenamiento, ya que es necesario guardar cada variante (tamaño y formato) dentro de una caché de fuentes. Se pueden generar diferentes tamaños y otras variaciones, como por ejemplo negrita e itálica a partir de un conjunto de fuentes en mapa de bits, pero los resultados que se obtienen no suelen ser buenos. Podemos incrementar o decrementar el tamaño del mapa de bits de un carácter solamente en múltiplos enteros del tamaño del píxel. Si queremos doblar el tamaño de un carácter, tenemos que doblar el número de píxeles del mapa de bits, con lo que los bordes del carácter tendrán una apariencia escalonada.

Por contraste con las fuentes de mapa de bits, las fuentes de contomo pueden incrementarse de tamaño sin distorsionar la forma de los caracteres. Además, estas fuentes requieren menos espacio de almacenamiento, porque no hace falta una caché de fuente separada para cada una de las variantes del tipo de caracteres.

Podemos generar caracteres en negrita, e itálica o de diferentes tamaños manipulando las definiciones de las curvas que especifican el contorno de los caracteres. Pero obviamente hace falta más tiempo para procesar las fuentes de contorno, ya que es necesario digitalizar los caracteres para almacenarlos en el búfer de imagen.

Hay una diversidad de posibles funciones para visualizar caracteres. Algunos paquetes gráficos proporcionan una función que acepta cualquier cadena de caracteres y una indicación de cuál debe ser la posición de inicio de la cadena dentro del búfer de imagen. Otro tipo de funciones son aquellas que muestran un único carácter en una o más posiciones seleccionadas. Puesto que esta rutina de caracteres resulta muy útil para mostrar caracteres en una imagen, por ejemplo, de una red de computadoras o a la hora de mostrar una gráfica con los puntos correspondientes a un conjunto de datos discretos, el carácter mostrado por esta rutina se denomina en ocasiones símbolo marcador o polimarcador, por analogía con la primitiva de polilínea. Además de los caracteres estándar, otras formas geométricas especiales como los puntos, los círculos y las cruces suelen estar disponibles como símbolos marcadores. La Figura muestra una gráfica de un conjunto de datos discreto donde se utiliza un asterisco como símbolo marcador.

Las descripciones geométricas de los caracteres se proporcionan en coordenadas universales, al igual que con las otras primitivas, y esta información se hace corresponder con las coordenadas de pantalla mediante las transformaciones de visualización. Un carácter de mapa de bits se describe mediante una cuadrícula rectangular de valores binarios y una posición de referencia para la cuadrícula. Esta posición de referencia se asigna entonces a una ubicación especificada dentro del búfer de imagen. Un carácter de contorno está definido por un conjunto de puntos que hay que conectar mediante una serie de segmentos curvos y rectos, junto con una posición de referencia que hay que hacer corresponder con una ubicación determinada del búfer de imagen. La posición de referencia puede especificarse para un único carácter de contorno o para una cadena de caracteres. En general, las rutinas de caracteres permiten generar imágenes con caracteres tanto bidimensionales como tridimensionales.

2.7 Atributos de puntos

Básicamente, podemos establecer dos atributos para los puntos: el color y el tamaño. En un sistema de estados, el color y el tamaño mostrados de un punto están determinados por los valores actuales almacenados en la lista de atributos. Las componentes de color se establecen con valores RGB o con un índice de una tabla de color. En un sistema de gráficos digitalizados, el tamaño del punto es un múltiplo del tamaño del píxel, por lo que un punto grande se muestra como un bloque cuadrado de píxeles.

2.8 Atributos de líneas

Un segmento de línea recta se puede mostrar con tres atributos básicos: el color, el grosor y el estilo. El color de la línea se establece habitualmente con la misma función de todas las primitivas gráficas, mientras que el grosor y el estilo de la línea se seleccionan con funciones independientes para las líneas. Adicionalmente, las líneas se pueden generar con otros efectos, tales como los trazos de un lapicero y una brocha.

El grosor de las líneas

La implementación de las opciones del grosor de las líneas depende de las capacidades del dispositivo de salida. Una línea gruesa se podría mostrar en un monitor de vídeo como líneas adyacentes paralelas, mientras que un trazador de plumillas podría precisar el cambio de la plumilla para dibujar una línea gruesa.

En implementaciones de gráficos digitalizados, una línea de grosor estándar se genera con un único píxel en cada posición muestreada, como en el algoritmo de Bresenham. Las líneas más gruesas se visualizan como múltiplos enteros positivos de la línea estándar mediante el dibujo de píxeles adicionales a lo largo de líneas paralelas adyacentes. Si una línea tiene una pendiente menor o igual que 1.0, podemos modificar la subrutina de dibujo de líneas para mostrar líneas gruesas mediante el dibujo de píxeles de extensión en cada columna (posición x) a lo largo de la línea. El número de píxeles que se van a mostrar en cada columna se define como el valor entero del grosor de la línea. En la Figura se muestra una línea de grosor doble mediante la generación de una línea paralela encima de la trayectoria de la línea original.

En cada posición x muestreada, calculamos la coordenada correspondiente y y se dibujan píxeles en las coordenadas de pantalla (x, y) y (x, y +1). Podríamos mostrar líneas con un grosor igual a 3 o mayor, dibujando alternativamente píxeles por encima y por debajo de la línea de grosor simple.

En una línea de pendiente mayor que 1.0, podemos mostrar líneas gruesas empleando extensiones horizontales, añadiendo píxeles alternativamente a la derecha y a la izquierda de la trayectoria de la línea. Este planteamiento se muestra en la siguiente Figura, donde un segmento de línea con un grosor de 4 se dibuja empleando múltiples píxeles transversales a cada línea de barrido.

De forma similar, una línea gruesa con una pendiente menor o igual que 1.0 se puede mostrar empleando extensiones verticales de píxeles. Podemos implementar este procedimiento mediante la comparación de las magnitudes de las separaciones horizontal y vertical ( y ) de los puntos extremos de la línea. Si , los píxeles se repiten a lo largo de las columnas. En caso contrario, múltiples píxeles se dibujan de forma transversal a las filas.

Aunque las líneas gruesas se generan fácilmente mediante el dibujo de extensiones de píxeles horizontales o verticales, el grosor visualizado de una línea (medido perpendicularmente a la trayectoria de la línea) depende de su pendiente. Una línea de 45° se visualizará más fina debido al factor comparada con una línea horizontal o vertical dibujada con la misma longitud de extensiones de píxeles.

Otro problema con la implementación de las opciones de grosor utilizando extensiones de píxeles horizontales y verticales es que el método produce líneas cuyos extremos son horizontales o verticales independientemente de la pendiente de la línea. Este efecto es más apreciable con líneas muy gruesas. Podemos ajustar la forma de las terminaciones de la línea para darles una mejor apariencia añadiendo extremos de línea ( como se aprecia en la Figura).

Un tipo de extremo de línea es el extremo abrupto, que presenta terminaciones cuadradas que son perpendiculares a la trayectoria de la línea. Si la línea tiene una pendiente m, las terminaciones cuadradas de la línea gruesa tienen una pendiente . Cada una de las líneas paralelas componentes se visualiza entonces entre las dos líneas perpendiculares a cada terminación de la trayectoria de la línea. Otro tipo de extremo de línea es el redondeado que se obtiene añadiendo un semicírculo relleno a cada extremo abrupto. Los arcos circulares tienen su centro en la zona media de la línea gruesa y un diámetro igual al grosor de la línea. Un tercer tipo de extremo de línea es el cuadrado. En este caso, simplemente extendemos la línea y añadimos extremos abruptos que se posicionan en la mitad del grosor de la línea más allá de las terminaciones.

Entre otros métodos para producir líneas gruesas se pueden incluir la visualización de la línea como un rectángulo relleno o la generación de la línea con un patrón de plumilla o brocha determinado. Para obtener una representación con forma de rectángulo para el límite de la línea, calculamos la posición de los vértices del rectángulo a lo largo de las perpendiculares a la trayectoria de la línea, para que las coordenadas de los vértices del rectángulo se desplacen de las posiciones originales de los extremos de la línea la mitad del grosor de la misma. La línea rectangular tiene entonces el aspecto de la Figura de extremos de línea ubicado a la izquierda. Podríamos añadir extremos redondeados a! rectángulo relleno, o podemos extender su longitud para mostrar extremos cuadrados.

La generación de polilíneas gruesas requiere algunas consideraciones adicionales. Por lo general, los métodos que hemos considerado para mostrar segmentos de línea no producirán series de segmentos de línea conectados suavemente. La representación de polilíneas gruesas empleando extensiones de píxeles horizontales y verticales, por ejemplo, producen huecos en los píxeles en los límites entre los segmentos de línea con diferentes pendientes donde hay un cambio de extensiones de píxeles horizontales a extensiones verticales.

Podemos generar polilíneas gruesas que estén unidas suavemente a costa de un procesamiento adicional en los extremos de los segmentos. La Figura siguiente muestra tres posibles métodos para unir suavemente dos segmentos de línea.

Una unión en punta se consigue extendiendo las fronteras de cada uno de los dos segmentos de línea hasta que se encuentran. Una unión redondeada se produce tapando la conexión entre los dos segmentos con una frontera circular cuyo diámetro es igual al grosor de la línea. Y una unión biselada se genera visualizando los segmentos de línea con extremos abruptos y rellenando el hueco triangular donde los elementos se encuentran. Si el ángulo entre los dos segmentos de línea conectados es muy pequeño, una unión en punta puede generar una larga púa que distorsiona la apariencia de la polilínea. Un paquete gráfico puede evitar este efecto cambiando de unión en punta a unión biselada cuando, por ejemplo, el ángulo entre dos segmentos cualesquiera consecutivos es pequeño.

Estilo de las líneas

Entre las posibles elecciones del atributo de estilo de línea se incluyen las líneas continuas, las líneas discontinuas y las líneas punteadas. Modificamos el algoritmo de dibujo de líneas para generar tales líneas mediante el cambio de la longitud y del espaciado de las secciones continuas mostradas a lo largo de la trayectoria de la línea. En muchos paquetes gráficos, podemos seleccionar tanto la longitud de los trazos discontinuos como el espacio entre dichos trazos.

Los algoritmos de líneas en sistemas digitalizados muestran los atributos de estilo de las líneas dibujando extensiones de píxeles. En patrones discontinuos, de puntos o ambas a la vez. el procedimiento de dibujo de líneas produce como salida secciones continuas de píxeles a lo largo de la trayectoria de la línea, saltando un número de píxeles entre las extensiones continuas. La cantidad de píxeles utilizada en la longitud de las extensiones y el espacio entre las mismas se puede especificar mediante una máscara de píxel, la cual es un patrón de dígitos binarios que indica qué posiciones se han de dibujar a lo largo de la trayectoria de la línea. La máscara lineal 11111000, por ejemplo, se podría utilizar para mostrar una línea discontinua con una longitud de trazo de cinco píxeles y un espacio entre trazos de tres píxeles. A las posiciones de píxel correspondientes al bit 1 se les asigna el color actual, y a las posiciones de píxel correspondientes al bit 0 se les asigna el color de fondo.

El dibujo de trazos con un número fijo de píxeles provoca trazos de longitud desigual según las diferentes orientaciones de la línea, como se muestra en la Figura siguiente.

Ambos trazos se dibujan con cuatro píxeles pero el trazo diagonal es más largo en un factor de . En dibujos en los que se necesita precisión, las longitudes de los trazos deberían permanecer aproximadamente constantes para cualquier orientación de la línea. Para conseguir esto, podríamos ajustar la cantidad de píxeles de las extensiones continuas y el espacio entre dichas extensiones de acuerdo con la pendiente de la línea. En la Figura anterior podemos visualizar trazos de longitud aproximadamente igual mediante la reducción del trazo diagonal a tres píxeles.

Otro método para mantener la longitud del trazo consiste en tratar los trazos como segmentos individuales de línea. Las coordenadas de los puntos extremos de cada trazo se localizan y se pasan a la subrutina de línea, la cual entonces calcula las posiciones de los píxeles a lo largo de la trayectoria del trazo.

Opciones de plumilla y brocha

En algunos paquetes, particularmente en los sistemas de dibujo y pintura, podemos seleccionar directamente diferentes estilos de plumilla y brocha. Entre las opciones de esta categoría se incluyen la forma, el tamaño y el patrón de la plumilla o brocha. Algunos ejemplos de formas de plumilla y brocha se muestran en la Figura siguiente.

Esta forma se puede almacenar en una máscara de píxel que identifica la matriz de posiciones de píxel que se deben cambiar a lo largo de la trayectoria de la línea. Por ejemplo, una plumilla rectangular se podría implementar con la máscara que se muestra en la Figura.

Mediante el movimiento del centro (o una esquina) de la máscara a lo largo de la trayectoria de la línea, como en la siguiente Figura.

Para evitar cambiar los píxeles más de una vez en el búfer de imagen, podemos simplemente acumular las extensiones horizontales generadas en cada posición de la máscara y mantener la pista del comienzo y el final de las posiciones x de las extensiones a lo largo de cada línea de barrido. Las líneas generadas con plumilla (o brocha) se pueden visualizar con varios grosores mediante el cambio del tamaño de la máscara. Por ejemplo, la línea generada con una plumilla rectangular de la Figura anterior se podría estrechar con una máscara rectangular de tamaño 2 por 2 o ensanchar con una máscara de tamaño 4 por 4. También, las líneas se pueden representar con patrones creados mediante la superposición de varios patrones en una máscara de plumilla o brocha.

2.9 Atributos de curvas

Los parámetros de los atributos de las curvas son los mismos que los de los segmentos de línea recta. Podemos mostrar curvas variando los colores, los grosores, utilizando patrones de punto y guión, y opciones disponibles de plumillas o brochas. Los métodos para la adaptación de los algoritmos de dibujo de curvas para acomodarlos a las selecciones de los atributos son similares a aquellos empleados para el dibujo de líneas.

Las curvas digitalizadas de varios grosores se pueden representar empleando el método de las extensiones verticales y horizontales de píxeles. Donde la magnitud de la pendiente de la curva sea menor o igual que 1.0, dibujaremos extensiones verticales; donde la magnitud de la pendiente sea mayor que 1.0, dibujaremos extensiones horizontales. La Figura siguiente muestra este método para la representación de un arco circular de grosor 4 en el primer cuadrante.

Utilizando la simetría del círculo, podemos generar una trayectoria circular con extensiones verticales en el octante que va desde x = 0 a x = y, y después reflejar las posiciones de los píxeles sobre la línea y=x para obtener el reflejo de la curva mostrada. Las secciones circulares de otros cuadrantes se obtienen mediante reflexión de las posiciones de los píxeles del primer cuadrante según los ejes de coordenadas.

El grosor de las curvas representadas con este método es de nuevo función de la pendiente de la curva. Los círculos, elipses y otras curvas aparecerán más finas donde la pendiente tenga una magnitud de 1. Otro método para representar curvas gruesas consiste en rellenar el área entre dos trayectorias de curva paralelas, cuya distancia de separación sea igual al grosor deseado. Podríamos hacer esto empleando la trayectoria de la curva especificada como una frontera y establecer la segunda frontera dentro o fuera de la trayectoria de la curva original. Esta técnica, sin embargo, cambia la trayectoria de la curva original hacia dentro o hacia afuera, dependiendo de la dirección que elijamos para la segunda frontera. Podemos mantener la posición de la curva original estableciendo dos curvas frontera a una distancia de medio grosor a cada lado de la trayectoria de la curva especificada. Un ejemplo de esta técnica se muestra en la Figura siguiente para un segmento circular con radio 16 y grosor 4.

Los arcos límite se establecen entonces con una distancia de separación de 2 a cada lado del radio de valor 16. Para mantener las dimensiones adecuadas del arco circular, podemos establecer el radio para los arcos límite concéntricos en r = 14 y r= 17. Aunque este método es preciso para la generación de círculos gruesos, proporciona en general, sólo una aproximación al área verdadera de otras curvas gruesas. Por ejemplo, los límites internos y externos de una elipse gruesa generada con este método no tienen el mismo foco.

CAPÍTULO III: TRANSFORMACIONES GEOMÉTRICAS

En este apartado veremos las operaciones de transformación que se pueden aplicar a objetos para reubicarlos o darles un tamaño diferente. Estas operaciones también son usadas en la visualización de rutinas que convierten una descripción de una escena de coordenadas universales en un despliegue para un dispositivo de salida. Además, son usados en variedad de otras aplicaciones, tales como diseño de ayuda y animación por computador. Las operaciones que se aplican a descripciones geométricas de un objeto para cambiar su posición, orientación o tamaño se llaman transformaciones geométricas.

3.1. Transformaciones geométricas bidimensionales básicas

Las funciones de transformaciones geométricas que se pueden encontrar en todos los paquetes gráficos, son aquellas que se usan para la traslación, la rotación y el cambio de escala. Otras rutinas de transformaciones útiles, que a veces se incluyen en los paquetes, son las operaciones de reflexión e inclinación.

Traslaciones bidimensionales

Se realiza una traslación de un punto sencillo de coordenadas, mediante la inclusión de compensaciones en sus propias coordenadas, para generar una nueva posición de coordenadas. En efecto, se está moviendo la posición del punto original a lo largo de una trayectoria en línea recta hacia su nueva localización. De modo similar, una traslación es aplicable a un objeto que se define con múltiples posiciones de coordenadas, tales como cuadriláteros, mediante la recolocación de todas las posiciones de sus coordenadas, usando el mismo desplazamiento a lo largo de trayectorias paralelas. Así, el objeto completo se muestra en la nueva localización.

Para trasladar una posición bidimensional, añadimos distancias de traslación y  a las coordenadas originales para obtener la nueva posición de coordenadas  como se muestra a continuación.

Podemos expresar las Ecuaciones de traslación como una única ecuación de una matriz, usando los siguientes vectores columna para representar posiciones de coordenadas y el vector de traslación.

                

Esto nos permite escribir las ecuaciones de traslación bidimensionales en forma de matriz.

La traslación es un tipo de transformación de sólido-rígido que mueve objetos sin deformarlos. Esto es, cada punto de un objeto es trasladado en la misma medida. Un segmento en línea recta es trasladado mediante la aplicación de una ecuación de transformación a cada uno de los puntos finales de la línea y redibujando la línea entre los dos nuevos puntos finales. Un polígono se traslada de forma similar. Se añade un vector de traslación a la posición de las coordenadas para cada vértice y después se regenera el polígono usando un nuevo conjunto de coordenadas de vértices.

*

Rotaciones bidimensionales

Se genera una transformación de rotación de un objeto mediante la especificación de un eje de rotación y un ángulo de rotación. Iodos los puntos del objeto son entonces transformados a la nueva posición, mediante la rotación de puntos con el ángulo especificado sobre el eje de rotación. Una rotación bidimensional de un objeto se obtiene mediante la recolocación del objeto a lo largo de una trayectoria circular sobre el plano xy.

En este caso, se está rotando el objeto sobre un eje de rotación que es perpendicular al plano (paralelo al eje de coordenadas z). Los parámetros para la rotación bidimensional son el ángulo de rotación , y una posición llamada punto de rotación (o punto de pivote) sobre los cuales el objeto va a ser rotado. El punto de pivote es la posición de intersección entre el eje de coordenadas y el plano xy. Un valor positivo para el ángulo  define una rotación en sentido contrario a las agujas del reloj sobre el punto de pivote, y un valor negativo rota objetos en el sentido de las agujas del reloj.

Para simplificar la explicación del método básico, primero hay que determinar las ecuaciones de transformación para la rotación de un punto de posición P, cuando el punto de pivote está en el origen de coordenadas. La relación entre el angular y las coordenadas de las posiciones originales y transformadas se muestra en la siguiente Figura.

En esta figura, r es la distancia constante del punto respecto del origen, el ángulo es la posición angular original del punto desde la horizontal, y es el ángulo de rotación. Usando identidades trigonométricas estándar, podemos expresar las coordenadas transformadas en función de los ángulos  y  como:

Con las representaciones del vector columna, para posiciones de coordenadas, podemos escribir las ecuaciones de rotación en forma de matriz donde la matriz de rotación es:

La rotación de un punto sobre una posición de pivote arbitraria se ilustra en la Figura. Usando las relaciones trigonométricas indicadas por los dos triángulos rectángulos de esta figura, se pueden generalizar las Ecuaciones básicas de rotación para obtener las ecuaciones de transformación para la rotación de un punto sobre cualquier posición de rotación específica :

Estas ecuaciones de rotación generales difieren de las ecuaciones de la rotación sobre el origen, por la inclusión de términos aditivos, así como factores multiplicativos en los valores de coordenadas. La expresión de la matriz puede modificarse para incluir las coordenadas pivote añadiendo la matriz de vector columna, cuyos elementos contienen los términos aditivos (traslacionales) de las Ecuaciones. Al igual que con las traslaciones, las rotaciones son transformaciones de sólido-rígido que mueven objetos sin deformarlos.

Cada punto de un objeto se rota un mismo ángulo. Un segmento en línea recta se rota mediante la aplicación de las ecuaciones de rotación a cada uno de sus puntos finales o extremos y redibujando luego la línea entre los nuevos extremos. Un polígono se rota desplazando cada uno de sus vértices usando el ángulo de rotación especificado y después regenerando el polígono usando los nuevos vértices. Rotamos una curva reposicionando los puntos de definición para la curva y redibujando después. Un círculo o una elipse, por ejemplo, pueden rotarse sobre un punto de pivote no centrado, moviendo la posición del centro a través del arco que sustenta el ángulo de rotación especificado. Y podemos rotar una elipse sobre su propio centro de coordenadas, sencillamente rotando el eje mayor y el eje menor.

Cambio de escala bidimensional

Para alterar el tamaño de un objeto, aplicamos transformaciones de escala. Una simple operación de cambio de escala bidimensional se lleva a cabo multiplicando las posiciones de los objetos por los factores de escala  y para producir las coordenadas transformadas .

                

El factor de escala cambia la escala de un objeto en la dirección X, mientras que hace el cambio de escala en la dirección Y. Las ecuaciones básicas del cambio de escala en dos dimensiones pueden también escribirse en la forma de la matriz siguiente.

donde S es la matriz 2 por 2 de cambio de escala.

Cualquier valor positivo puede ser asignado a los valores de escala y . Valores inferiores a 1 reducen el tamaño de los objetos; valores superiores a 1 producen alargamientos. Especificando un valor de 1 tanto para como para  se deja el tamaño del objeto inalterado. Cuando a  y  se les asigna el mismo valor, se produce un cambio de escala uniforme que mantiene las proporciones relativas del objeto. Valores desiguales de  y  resultan en un cambio de escala diferente que es a menudo usado en aplicaciones de diseño, donde los dibujos son construidos desde unas pocas formas básicas que pueden ajustarse mediante escalas y transformaciones posicionales. En algunos sistemas, los valores negativos también pueden especificarse mediante parámetros de escala. Ello no sólo le da un nuevo tamaño al objeto, además lo refleja sobre uno o más ejes de coordenadas.

Podemos controlar la localización de un objeto cambiado de escala eligiendo una posición, llamada punto fijo, que debe permanecer sin cambios después de la transformación de escala. Las coordenadas para el punto fijo, son a menudo elegidas de la posición de algún objeto, tal como su centroide, aunque puede elegirse cualquier otra posición espacial. A los objetos se les da ahora otro tamaño mediante el cambio de escala de las distancias entre los puntos de los objetos y el punto fijo. Para la posición de coordenadas las coordenadas de escala  se calculan a partir de las siguientes relaciones.

Incluir las coordenadas para un punto fijo en las ecuaciones de escala es similar a incluir coordenadas para un punto de pivote en ecuaciones de rotación. Los polígonos cambian de escala mediante la aplicación de las Ecuaciones de cambio de escala a cada vértice, regenerando después el polígono usando los vértices transformados. Para otros objetos, aplicamos las ecuaciones de transformación de escala a los parámetros que definen el objeto. Para cambiar el tamaño de un círculo, podemos reducir su radio y calcular las nuevas posiciones de las coordenadas del contorno de la circunferencia. Y para cambiar el tamaño de una elipse, aplicamos el escalado de los parámetros sobre sus ejes para luego trazar la nueva posición de la elipse sobre su centro de coordenadas.

3.2. Representaciones de matriz y coordenadas homogéneas

Muchas aplicaciones gráficas implican secuencias de transformaciones geométricas. Una animación debería requerir que un objeto fuese trasladado y rotado tras cada incremento de movimiento. En diseño y aplicaciones de construcción de dibujos, se llevan a cabo traslaciones, rotaciones y cambios de escala para acoplar los componentes del dibujo dentro de sus propias posiciones. Y la visualización de las transformaciones implican secuencias de traslaciones y rotaciones para llevamos desde la escena original especificada a la visualización en un dispositivo de salida. Aquí, consideramos cómo las representaciones de matrices discutidas en la sección anterior pueden acumularse. de tal forma que las secuencias de transformaciones puedan ser procesadas eficientemente.

Hemos visto anteriormente que cada una de las tres transformaciones bidimensionales básicas (traslación, rotación y cambio de escala) pueden expresarse en forma de matriz general:

con posiciones de coordenadas P y P' representados en vectores columnas. La matriz  es una matriz de 2 por 2 que contiene factores multiplicativos, y , es una matriz columna de 2 elementos que contiene los términos traslacionales. Para la traslación, es la matriz identidad. Para la rotación o el cambio de escala, , contiene los términos traslacionales asociados con el punto de pivote o con el punto fijo de escalado. Para producir una secuencia de transformaciones con esas ecuaciones, como por ejemplo, un cambio de escala seguido de una rotación y luego una traslación, podemos calcular las coordenadas transformadas haciendo una cosa cada vez. Primero, se cambia la escala de la posición de las coordenadas, luego dichas coordenadas se giran y, finalmente, las coordenadas rotadas son trasladadas. Sin embargo, una forma más eficiente de hacerlo, es combinar transformaciones de tal suerte que la posición final de las coordenadas se obtenga directamente a partir de las coordenadas iniciales, sin calcular valores de coordenadas intermedios. Podemos hacer esto, re formulando la Ecuación anterior para eliminar la operación de suma de matrices.

Coordenadas homogéneas

Los términos multiplicativos y traslacionales para una transformación geométrica bidimensional pueden ser combinados dentro de una matriz sencilla, si expandimos la representación a matrices de 3 por 3. En ese caso, podemos usar la tercera columna de la matriz de transformación para los términos traslacionales, y todas las ecuaciones de transformación pueden expresarse como multiplicación de matrices. Pero para poder hacer esto, necesitamos además expandir la representación matricial para posiciones de coordenadas bidimensionales a una matriz columna de 3 elementos. Una técnica estándar para lograr esto consiste en expandir cada representación de posición-coordenada bidimensional (x, y) en representaciones de 3 elementos  llamadas coordenadas homogéneas, donde el parámetro homogéneo h es un valor distinto de cero tal que:

 y

Por tanto, una representación de coordenadas homogéneas bidimensionales, puede escribirse también como . Para transformaciones geométricas, podemos elegir el parámetro homogéneo h para que sea cualquier valor distinto de cero. Así, hay un número infinito de representaciones homogéneas equivalentes para cada punto de coordenadas (x,y). Una elección acertada es fijar h=1. Cada posición bidimensional se representa con coordenadas homogéneas (x, y, 1). Se necesitan otros valores para el parámetro h, por ejemplo en formulaciones de matrices para mostrar transformaciones tridimensionales.

El término coordenadas homogéneas se usa en matemáticas para referirse al efecto de esta representación en coordenadas cartesianas. Cuando un punto cartesiano (x, y) se convierte a representación homogénea las ecuaciones que contienen x e y tales como f(x, y) = 0, se convierten en ecuaciones homogéneas en los tres parámetros . Esto significa precisamente, que si cada uno de los tres parámetros es sustituido por cualquier valor, v veces, dicho valor v puede ser despejado de la ecuación.

Expresar posiciones en coordenadas homogéneas nos permite representar todas las ecuaciones de transformaciones geométricas como multiplicación de matrices, que es el método estándar usado en los sistemas gráficos. Las posiciones de coordenadas bidimensionales se representan con vectores columna de tres elementos, y las operaciones de transformación bidimensionales se representan como matrices de 3 por 3.

Matriz de traslación bidimensional

Usando la aproximación de coordenadas homogéneas, podemos representar las ecuaciones para una traslación bidimensional de una posición de coordenadas usando la siguiente matriz de multiplicación.

Esta operación de traslación puede escribirse en su forma abreviada:

Matriz de rotación bidimensional

De manera similar, las ecuaciones de transformación de rotación bidimensional sobre el origen de coordenadas pueden expresarse en forma de matriz,

En algunas bibliotecas gráficas, una función de rotación bidimensional genera sólo rotaciones sobre el eje de coordenadas. Una rotación sobre cualquier otro punto de pivote debe representarse como una secuencia de operaciones de transformación. Una alternativa en paquetes gráficos es ofrecer parámetros adicionales en la rutina de rotación para las coordenadas del punto de pivote. Una rutina de rotación que incluye parámetros del punto de pivote, luego establece una matriz general de rotación, sin la necesidad de invocar una sucesión de funciones de transformación.

Matriz de cambio de escala bidimensional

Finalmente, una transformación de cambio de escala relativa al origen de coordenadas puede ahora expresarse como la matriz de multiplicación:

Algunas bibliotecas ofrecen una función de cambio de escala que puede generar sólo un cambio de escala con respecto al origen de coordenadas, como en la Ecuación 5.21. En este caso, una transformación de cambio de escala relativa a otra posición de referencia es llevada a cabo como una sucesión de operaciones de transformación. Sin embargo, otros sistemas sí incluyen una rutina de cambio de escala general que puede construir matrices homogéneas para realizar cambios de escala con respecto a puntos fijos designados.

Transformaciones inversas

Para la traslación, obtenemos la matriz inversa mediante la negación de las distancias de traslación. Así, si tenemos distancias de traslación bidimensionales  y , la matriz de traslación inversa es:

Esto produce una traslación en la dirección opuesta, y el producto de la matriz de traslación y su inversa producen la matriz identidad.

Una rotación inversa se obtiene sustituyendo el ángulo de rotación por su negativo. Por ejemplo, una rotación bidimensional a través del ángulo  sobre el origen de coordenadas, tiene la matriz de transformación:

Los valores negativos para los ángulos de rotación generan rotaciones en el sentido de las agujas del reloj, así, la matriz identidad se produce cuando alguna matriz de rotación se multiplica por su inversa. Puesto que por el cambio de signo del ángulo de rotación sólo se ve afectada la función seno, la matriz inversa puede obtenerse también intercambiando filas por columnas.

Formamos la matriz inversa para cualquier transformación de escala sustituyendo los parámetros de escala por sus recíprocos. Para escalas bidimensionales con parámetros  y  aplicados respecto al origen de coordenadas, la matriz de transformación inversa es:

La matriz inversa genera una transformación de escala opuesta, de tal forma que la multiplicación de cualquier matriz de escala por su inversa produce la matriz identidad.

3.3. Transformaciones Compuestas bidimensionales

Usando la representación de matrices, podemos establecer una secuencia de transformaciones como matriz de transformación compuesta calculando el producto de las transformaciones individuales. Formando productos con las matrices de transformación es común referirse a ello como concatenación, o composición, de matrices. Desde una posición de coordenadas representada como una matriz columna homogénea, debemos premultiplicar la matriz columna por las matrices, representando una secuencia de transformaciones. Y, como muchas posiciones de una escena son normalmente transformadas por la misma secuencia, es más eficiente primero multiplicar la transformación de matrices para formar una única matriz compuesta. Así, si queremos aplicar dos transformaciones a la posición de un punto P, la ubicación transformada se calcularía como:

La posición de coordenadas se transforma usando la matriz compuesta M, mejor que aplicando las transformaciones individuales  y luego .

Otras transformaciones bidimensionales

Las transformaciones básicas tales como la traslación, la rotación y el cambio de escala son componentes estándares de las bibliotecas gráficas. Algunos paquetes ofrecen algunas transformaciones adicionales que pueden ser útiles en ciertas aplicaciones. Dos de dichas transformaciones son la reflexión y la inclinación.

Reflexión

Una transformación que produce la imagen de un objeto en un espejo se llama reflexión. Para una reflexión bidimensional, esta imagen se genera respecto a un eje de reflexión rotando el objeto 180° sobre dicho eje de reflexión. Podemos elegir un eje de reflexión en el plano .o perpendicular al plano . Cuando el eje de reflexión es una línea en el plano , la trayectoria de la rotación está también en el plano . A continuación se proporcionan ejemplos de algunas reflexiones comunes.

La reflexión respecto de la línea  (el eje ) se logra con la matriz de transformación:

Esta transformación conserva los valores , pero “da la vuelta” a las posiciones de coordenadas de valores . La orientación resultante de un objeto después de haber sido reflejado sobre el eje  se muestra en la Figura siguiente.

Para imaginar la trayectoria de la transformación de rotación para esta reflexión, podemos pensar en el objeto plano moviéndose fuera del plano  y girando 180° a través de un espacio tridimensional alrededor del eje  y colocado de nuevo sobre el plano  al otro lado del eje .

Una reflexión sobre la línea (el eje ) vuelca las coordenadas  mientras que mantiene las mismas coordenadas . La matriz para esta transformación es:

La figura siguiente ilustra el cambio de posición de un objeto que ha sido reflejado respecto de la línea .

La rotación equivalente en este caso es 180° a través del espacio tridimensional sobre el eje .

Damos la vuelta tanto a las coordenadas  como a las  de un punto, mediante la reflexión relativa de un eje que es perpendicular al plano  y que pasa por el origen de coordenadas. Esta reflexión a veces se denomina reflexión relativa al origen de coordenadas, y es equivalente a reflejar con respecto a ambos ejes de coordenadas. La matriz de representación para esta reflexión es:

La figura siguiente muestra un ejemplo de reflexión respecto del origen. La matriz de reflexión anterior es la misma que la matriz de rotación con . Sencillamente estamos girando el objeto en el plano media vuelta alrededor del origen.

La matriz de reflexión para el caso anterior se puede generalizarse para la reflexión de cualquier punto en el plano  como se muestra en la figura siguiente. Esta reflexión es lo mismo que la rotación de 180° en el plano , alrededor de un punto de reflexión.

Si elegimos el eje de reflexión como la línea diagonal , la matriz de reflexión es:

Y la figura muestra el resultado.

Podemos obtener esta matriz concatenando una secuencia de rotaciones y reflexiones de matrices sobre los ejes de coordenadas. Una posible secuencia se muestra en la Figura siguiente.

Aquí, primero llevamos a cabo una rotación en el sentido de las agujas del reloj con respecto al origen a través de un ángulo de 45°, que rota la línea  y sobre el eje . A continuación realizamos una reflexión con respecto al eje . El paso final consiste en girar la línea  de vuelta a su posición original con una rotación de 45° en sentido contrario al de las agujas del reloj. Otra secuencia de transformaciones equivalente consiste en reflejar primero el objeto sobre el eje  y luego rotarlo  en el sentido de las agujas del reloj.

Ejercicio obtener una matriz para la reflexión con respecto a la línea .

Las reflexiones sobre cualquier línea  en el plano  pueden realizarse con una combinación de transformaciones traslación-rotación-reflexión. En general, primero trasladamos la línea de tal forma que pase por el origen. Luego podemos girar la línea hacia uno de los ejes de coordenadas y reflejarla sobre dicho eje. Finalmente, reestablecemos la línea a su posición original con las transformaciones inversas de rotación y traslación.

Podemos implementar reflexiones con respecto a los ejes de coordenadas o al origen de coordenadas como transformaciones de escala con factores de escala negativos. Además, los elementos de la matriz de reflexión pueden definirse con valores distintos de ± 1. Un parámetro de reflexión de una magnitud superior a 1 cambia la imagen del espejo por un punto más alejado del eje de reflexión, y un parámetro cuya magnitud es inferior a 1 trae la imagen del espejo a un punto más cercano al eje de reflexión. Así, un objeto reflejado puede también agrandarse, reducirse o distorsionarse.

Inclinar

Una transformación que distorsiona la forma de un objeto de tal manera que la forma obtenida aparece como si el objeto estuviera compuesto por capas internas que se hubieran obtenido resbalando unas sobre otras es lo que se denomina inclinación. Dos transformaciones comunes para producir una inclinación son aquellas que desplazan los valores de las coordenadas  y las que desplazan los valores de .

Una inclinación en la dirección  respecto al eje  se produce con la matriz de transformación:

La cual transforma la posición de coordenadas como sigue:

Cualquier número real puede asignarse a los parámetros de inclinación . Entonces, una posición de coordenadas se cambia horizontalmente por una cantidad proporcional a su distancia perpendicular (valor ) desde el eje .

Ejemplo, Establecer el parámetro  por ejemplo con el valor 2, mostrar entonces el resultado de inclinar el recuadro de vértices (0,0) (1,0) (1,1) (0,1).

Los valores negativos para cambian las posiciones de las coordenadas hacia la izquierda.

Transformaciones entre sistemas de coordenadas bidimensionales

Las aplicaciones de gráficos por computadora implican transformaciones de coordenadas de un marco de referencia a otro durante varias etapas del procesamiento de la escena. Las rutinas de visualización transforman descripciones de objetos de las coordenadas universales a unas coordenadas de dispositivo de salida. Para aplicaciones de modelado y diseño, los objetos individuales se definen típicamente en sus propias referencias cartesianas locales. Estas descripciones de coordenadas locales deben, por tanto, transformarse en posiciones y orientaciones dentro del sistema de coordenadas total de la escena. Un programa para facilitar la gestión de la disposición de oficinas, por ejemplo, tiene descripciones de coordenadas individuales para sillas y mesas y otros muebles que pueden colocarse en el plano de la planta, con múltiples copias de sillas y otros elementos en diferentes posiciones.

Además, las escenas a veces se describen en marcos de referencia no cartesianos que aprovechan las simetrías de los objetos. Las descripciones de coordenadas en estos sistemas deben convertirse a coordenadas universales cartesianas para ser procesadas.

La Figura siguiente muestra un sistema cartesiano  especificado con el origen de coordenadas y un ángulo de orientación en un marco de referencia cartesiano . Para transformar las descripciones del objeto de las coordenadas  a las coordenadas . establecemos una transformación que superpone los ejes  sobre los ejes . Esto se realiza en dos pasos:

(1) Traslación de tal forma que el origen  del sistema se mueva al origen (0,0) del sistema .

(2) Rotación del eje sobre el eje .

La transformación del origen de coordenadas se lleva a cabo con la matriz de transformación:

La orientación de los dos sistemas después de la operación de traslación deberían aparecer como en la Figura siguiente.

Para conseguir que los ejes de los dos sistemas coincidan, hacemos una rotación en el sentido de las agujas del reloj:

Concatenar estas dos matrices de transformación, nos da como resultado la matriz compuesta completa para transformar las descripciones del objeto desde el sistema  al sistema :

CAPÍTULO IV: RECORTES

4.1. Algoritmos de recorte

Generalmente, cualquier procedimiento que elimina aquellas porciones de una imagen que están dentro o fuera de una región del espacio especificada se denomina algoritmo de recorte o simplemente recorte. Habitualmente, una región de recorte es un rectángulo en posición estándar, aunque podríamos utilizar cualquier forma en una aplicación de recorte.

La aplicación de recorte más común está en la pipeline de visualización, donde el recorte se aplica para extraer una porción designada de la escena (bidimensional o tridimensional) para su visualización en un dispositivo de salida. Los métodos de recorte también se utilizan para suavizar los límites de los objetos, para construir objetos utilizando métodos de modelado de sólidos, gestionar entornos multiventana y para permitir que partes de una imagen se muevan, se copien o se borren en programas de dibujo y pintura.

Los algoritmos de recorte se aplican en procedimientos de visualización bidimensional para identificar aquellas partes de una imagen que están dentro de la ventana de recorte. Todo lo que se encuentra fuera de la ventana de recorte, se elimina de la descripción de la escena que se transfiere al dispositivo de salida para su visualización. Una implementación eficiente de recorte en la pipeline de visualización consiste en aplicar los algoritmos a los límites normalizados de la ventana de recorte. Esto reduce los cálculos, porque todas las matrices de transformación geométrica y de visualización se pueden concatenar y aplicar a una descripción de una escena antes de que el recorte se lleve a cabo. La escena recortada se puede después transferir a las coordenadas de pantalla para el procesamiento final. Se puede tratar, algoritmos bidimensionales para:

El recorte de puntos, líneas y polígonos es un componente estándar de los paquetes gráficos. Pero se pueden aplicar métodos similares a otros objetos, particularmente cónicas, tales como círculos, elipses y esferas, además de curvas de tipo spline y a superficies. Habitualmente, sin embargo, los objetos con límites no lineales se aproximan mediante segmentos de línea recta o superficies de polígonos para reducir los cálculos. A menos que se indique otra cosa, asumimos que la región de recorte es una ventana rectangular en posición estándar, con las aristas límite en las coordenadas , , , . Estas aristas límite habitualmente se corresponden con un cuadrado normalizado, en el que los valores de x e y se encuentran dentro del rango que varía desde 0 a 1 ó desde -1 a 1.

4.2 Recorte de puntos bidimensionales

En un rectángulo de recorte ubicado en la posición estándar, mantenemos un punto bidimensional para su visualización si se satisfacen las siguientes desigualdades:

Si no se satisface una de estas cuatro ecuaciones, el punto se recorta (no se guarda para su visualización). Aunque el recorte de puntos se aplica menos a menudo que el recorte de líneas o de polígonos, resulta útil en diversas situaciones, sobre todo cuando las imágenes se modelan como sistemas de partículas. Por ejemplo, se puede aplicar recorte de puntos a escenas que incluyan nubes, espuma de mar, humo o explosiones que están modeladas mediante “partículas”, tales como las coordenadas de los centros de pequeños círculos o esferas.

4.3 Recorte de líneas bidimensionales

La Figura muestra posibles posiciones de segmentos de línea recta en relación con una ventana de recorte estándar. Un algoritmo de recorte de líneas procesa cada línea de una escena mediante una serie de pruebas y cálculos de intersecciones para determinar si se debe guardar la línea completa o una parte de ésta. La parte más costosa de un procedimiento de recorte de líneas es el cálculo de las intersecciones de una línea con las aristas de la ventana. Por tanto, un objetivo importante en cualquier algoritmo de recorte de líneas consiste en minimizar los cálculos de intersecciones. Para ello, podemos realizar en primer lugar pruebas para determinar si un segmento de línea está completamente dentro de la ventana de recorte o está completamente fuera. Es sencillo determinar si una línea está completamente dentro de una ventana, pero es más difícil identificar todas las líneas que están completamente fuera de la ventana. Si somos incapaces de identificar si una línea está completamente dentro o completamente fuera de un rectángulo de recorte, debemos entonces realizar los cálculos de intersección para determinar si una parte de la línea cruza el interior de la ventana.

Comprobamos un segmento de línea para determinar si está completamente dentro o fuera del borde de una ventana de recorte seleccionada, aplicando las pruebas de recorte de puntos de la sección anterior. Cuando ambos puntos extremos de un segmento de línea están dentro de los cuatro límites de recorte, como la línea que va de a  en la Figura anterior, la línea está completamente dentro de la ventana de recorte y la guardamos. Cuando ambos puntos extremos de un segmento de línea se encuentran fuera de cualquiera de los cuatro límites (línea a  en la Figura anterior), dicha línea se encuentra completamente fuera de la ventana y se elimina de la descripción de la escena. Pero si ambas pruebas fallan, el segmento de línea intersecta con al menos un límite de recorte y puede o no cruzar el interior de la ventana de recorte.

Un modo de formular la ecuación de un segmento de línea recta consiste en utilizar la siguiente representación paramétrica, donde las coordenadas y designan los dos puntos extremos de la línea.

        

Podemos utilizar esta representación para determinar dónde un segmento de línea corta cada arista de la ventana de recorte, asignando el valor de la coordenada de cada arista a x o y y resolviendo para el parámetro u. A modo de ejemplo, el límite izquierda de la ventana está en la posición  por lo que sustituimos x por este valor y resolvemos para u, y calculamos el valor de intersección y correspondiente. Si este valor de u se encuentra fuera del rango que varía desde 0 a 1, el segmento de línea no intersecta con dicha arista de la ventana. Pero si el valor de u se encuentra dentro del rango que varía entre 0 y 1, parte de la línea se encuentra dentro de dicho borde. Podemos a continuación procesar esta porción interior del segmento de línea con respecto a los demás límites de recorte hasta que hayamos recortado la línea entera o encontremos una parte que esté dentro de la ventana.

El procesamiento de segmentos de línea de una escena utilizando la sencilla técnica descrita en el párrafo anterior es directo, pero no muy eficiente. Es posible reformular la prueba inicial y los cálculos de intersección para reducir el tiempo de procesamiento de un conjunto de segmentos de línea. Se han desarrollado algoritmos de recorte de líneas más rápidos. Algunos de estos algoritmos se han diseñado explícitamente para imágenes bidimensionales y algunos se adaptan fácilmente a conjuntos de segmentos de línea tridimensionales.

Recorte de líneas de Cohen-Sutherland

Éste es uno de algoritmos más antiguos que se ha desarrollado para el recorte de líneas rápido, y variaciones de este método se utilizan ampliamente. El tiempo de procesamiento se reduce en el método de Cohen-Sutherland realizando más pruebas antes de proceder con los cálculos de las intersecciones. Inicialmente, se asigna a cada punto extremo de las líneas de una imagen un valor binario de cuatro dígitos llamado código de región. Cada bit se utiliza para indicar si está dentro o fuera de uno de los límites de la ventana de recorte. Podemos hacer referencia a las aristas de la ventana en cualquier orden.

 

La Figura anterior muestra una posible ordenación en la que los bits están numerados de 1 a 4 de derecha a izquierda. Por tanto, para esta ordenación, el bit situado más a la derecha (bit 1) hace referencia al borde izquierdo de la ventana de recorte, y el situado más a la izquierda (bit 4) hace referencia al borde superior de la ventana. Un valor de 1 (o verdadero) en cualquier bit indica que el punto extremo está fuera de la ventana. De forma similar, un valor de 0 (o falso) en cualquier bit indica que el punto extremo no está fuera (está dentro o sobre) del límite correspondiente de la ventana. A veces, un código de región se denomina código de «fuera» porque un valor de 1 en cualquier bit indica que el punto del espacio está fuera del correspondiente borde de recorte.

Cada arista de la ventana de recorte divide el espacio bidimensional en un semiespacio interior y un semiespacio exterior. En total, los cuatro límites de la ventana crean nueve regiones. La Figura siguiente enumera el valor del código binario en cada una de estas regiones. Por tanto, a un punto extremo que esté situado debajo y a la izquierda de la ventana de recorte se le asigna un código de región 0101, y el valor del código de región de cualquier punto interior a la ventana de recorte es 0000.

1001

1000

1010

0001

0000

Ventana de recorte

0010

0101

0100

0110

Los valores de los bits de un código de región se determinan comparando los valores de las coordenadas de un punto extremo con los límites de recorte. El bit 1 se pone a 1 si . Los valores de los otros tres bits se determinan de forma semejante. En lugar de utilizar pruebas de desigualdad, podemos determinar más eficientemente los valores de un código de región utilizando las operaciones de procesamiento de bits y siguiendo dos pasos:

  1. Calcular las diferencias entre las coordenadas de los puntos extremos y los límites de recorte.
  2. Utilizar el bit de signo resultante de cada cálculo de diferencia para cambiar el valor correspondiente de cada código de región. (un 0 denota un número positivo, y un 1 denota un número negativo)

En el caso del esquema de ordenación mostrado en la Figura anterior, el bit 1 es el bit de signo de ; el bit 2 es el bit de signo de ; el bil 3 es el bit de signo de ; y el bit 4 es el bit de signo de .

Una vez que hemos establecido los códigos de región de todos los puntos extremos de todas las líneas, podemos determinar rápidamente qué líneas se encuentran completamente dentro de la ventana de recorte y cuáles se encuentran claramente fuera. Cualesquiera líneas que se encuentran completamente contenidas dentro de las aristas de la ventana tienen un código de región 0000 en ambos puntos extremos y estos segmentos de línea los guardamos. Cualquier línea que tenga un código de región de valor 1 en el mismo bit en cada punto extremo está completamente fuera del rectángulo de recorte, por lo que eliminamos dicho segmento de línea. A modo de ejemplo, una línea que tenga un código de región 1001 en un punto extremo y un código 0101 en el otro punto extremo está completamente a la izquierda de la ventana de recorte, como lo indica el valor 1 en el primer bit de cada código de región.

Podemos realizar las pruebas de dentro-fuera para los segmentos de línea utilizando operadores lógicos. Cuando la operación or entre los dos códigos de región de los puntos extremos de un segmento de línea es falsa (0000), la línea se encuentra dentro de la ventana de recorte. Por tanto, guardamos la línea y procedemos a comprobar la línea siguiente de la descripción de la escena. Cuando la operación and entre los dos códigos de región de los puntos extremos de una línea es verdadera (no 0000), la línea está completamente fuera de la ventana de recorte, y podemos eliminarla de la descripción de la escena. En el caso de las líneas que no se pueden identificar como que están completamente dentro o completamente fuera de una ventana de recorte mediante las pruebas del código de región, se comprueba a continuación si intersectan con los límites de la ventana. Como se muestra en la Figura siguiente, los segmentos de línea pueden interceptar con los límites de recorte sin entrar dentro del interior de la ventana.

 

Por tanto, para recortar un segmento de línea podrían ser necesarios varios cálculos de intersecciones, dependiendo del orden en que se procese los límites de recorte. Cuando procesamos cada arista de la ventana de recorte, se recorta una parte de la línea, y la parte que permanece de la línea se comprueba frente a los restantes límites de la ventana. Continuaremos eliminando partes hasta que la línea esté totalmente recortada o la parte que permanece de la línea se encuentre dentro de la ventana de recorte. En el siguiente estudio, asumimos que las aristas de la ventana se procesan en el orden: izquierda, derecha, inferior, superior. Para determinar si una línea cruza un límite de recorte seleccionado, podemos comprobar los valores correspondientes de los bits de los códigos de región de los dos puntos extremos. Si uno de estos bits es 1 y el otro es 0, el segmento de línea cruza dicho límite.

La Figura Anterior muestra dos segmentos de línea que se pueden identificar inmediatamente como completamente dentro o completamente fuera de la ventana de recorte. Los códigos de región de la línea desde  a  son 0100 y 1001. Por tanto,  está dentro del límite izquierdo de recorte y , está fuera de dicho límite.

A continuación, calculamos la intersección , y recortamos la parte de la línea desde a . La parte que permanece de la línea se encuentra dentro de la línea límite derecha, y por ello a continuación comprobamos el límite inferior. El punto extremo  se encuentra por debajo de la arista inferior de recorte y  se encuentra por encima de ésta, por lo que determinamos la intersección con esta arista . Eliminamos la parte de la línea desde  a  y procedemos con la arista superior de la ventana. Allí determinamos la intersección . El último paso consiste en recortar la parte situada por encima del límite superior y guardar el segmento interior desde , hasta . En el caso de la segunda línea, obtenemos que el punto , se encuentra fuera del límite izquierdo y  se encuentra dentro. Por tanto, calculamos la intersección  y eliminamos la parte de la linca que va desde a y Comprobando los códigos de región de los puntos extremos  y , observamos que la parte que permanece de la línea se encuentra por debajo de la ventana de recorte y se puede eliminar también. Cuando se recorta un segmento de línea utilizando esta técnica se puede calcular una intersección con los cuatro límites de recorte, dependiendo de cómo se procesan los puntos extremos de la línea y qué ordenación utilicemos en los límites.

La Figura muestra las cuatro intersecciones que se podrían calcularse para un segmento de línea que se procesa frente a las aristas de la ventana de recorte en el orden izquierda, derecha, inferior, superior. Por tanto, se han desarrollado variaciones de esta técnica básica en un esfuerzo por reducir los cálculos de intersecciones.

Para determinar una intersección de un segmento de línea con la frontera, podemos utilizar la forma pendiente-punto de corte de la ecuación de la línea. Para una línea con coordenadas en sus puntos extremos y , la coordenada  del punto de intersección con un borde de recorte vertical se puede obtener mediante el cálculo,

donde el valor de  se establece en  o , y la pendiente de esta línea se calcula como . De forma similar, si buscamos la intersección con el borde horizontal, la coordenada  se puede calcular como:

(estableciendo  en  o .

Ejemplo:

Queremos mostrar varios segmentos, pero únicamente dentro de nuestra vista representada por un rectángulo vertical descrito con las siguientes esquinas: superior izquierda (-1,3) e inferior derecha (3,-3). Tenemos los siguientes segmentos definidos por parejas de puntos que forman sus extremos:

A = (-2, 1) y B = ( 2, 2),

C = ( 1, 4) y D = ( 0,-4),

E = ( 4, 3) y F = ( 3, 0),

G = (-3,-1) y H = (-2,-4).

   Calculamos los códigos regionales para cada punto:                 

                

A: 0001  B: 0000
C: 1000  D: 0100
E: 0010  F: 0000
G: 0001  H: 0101

Aplicamos nuestros criterios a los resultados de las operaciones a nivel de bit de los códigos regionales de cada punto dando lugar a:

AB: 0001 OR 0000 = 0001  ⇒  0001 AND 0000 = 0000  ⇒  Hay que recortar
CD: 1000 OR 0100 = 1100  ⇒  1000 AND 0100 = 0000  ⇒  Hay que recortar
EF: 0010 OR 0000 = 0010  ⇒  0010 AND 0000 = 0000  ⇒  Hay que recortar
GH: 0001 OR 0101 = 0101  ⇒  0001 AND 0101 = 0001  ⇒  Inmediatamente lo rechazamos

Hacemos la primera tanda de recortes de los puntos con sus primeras aristas del algoritmo, obteniendo:



Recalculamos los códigos de cada punto:                 

                

A′B: 0000 OR 0000 = 0000  ⇒  Aceptamos el segmento
C′D: 0000 OR 0100 = 0100  ⇒  0000 AND 0100 = 0000  ⇒  Hay que recortar
E′F: 0000 OR 0000 = 0000  ⇒  Aceptamos el segmento

Nos falta recortar una segunda vez para el segmento C′D. El algoritmo elige el punto D para recortar, obteniendo:                 

                

Recalculamos los códigos de cada punto:                 

                

C′D′: 0000 OR 0000 = 0000  ⇒  Aceptamos el segmento

Al final, obtenemos la siguiente imagen con los segmentos recortados e interiores al rectángulo de recorte.  

Recorte de lineas de Liang-Barsky

Se han desarrollado algoritmos de recorte de líneas más rápidos que realizan una comprobación mayor de las líneas antes de proceder con los cálculos de intersección. Uno de los más antiguos esfuerzos en esta dirección es un algoritmo desarrollado por Cyrus y Beck, que se basa en el análisis de las ecuaciones paramétricas de las líneas. Posteriormente, Liang y Barsky de forma independiente idearon una forma incluso más rápida del algoritmo de recorte de líneas paramétrico.

Para un segmento de línea cuyos puntos extremos son y podemos describir la línea en forma paramétrica:

donde  y . En el algoritmo de Liang-Barsky, las ecuaciones paramétricas de la línea se combinan con las condiciones de recorte de puntos para obtener las desigualdades:

que se pueden expresar como:

donde los parámetros  y  sedefinenn como:

,                

,                

,                

,                

Cualquier línea que sea paralela a una de las aristas de la ventana de recorte tiene  para el valor de  correspondiente a dicho límite, donde  se corresponde con los límites izquierdo, derecho, inferior y superior, respectivamente. Si, para ese valor de , también observamos que , entonces la línea está completamente fuera del límite y se puede eliminar de las consideraciones posteriores. Si , la línea se encuentra dentro del límite de recorte paralelo.

Cuando , el alargamiento infinito de la línea está orientado desde fuera hacia dentro del alargamiento infinito de ese borde particular de la ventana de recorte. Si , la línea procede de dentro hacia fuera. Para un valor distinto de cero de , podemos calcular el valor de  que se corresponde con el punto donde la línea alargada hasta el infinito intersecta con la ampliación del borde  de la ventana del siguiente modo:

Para cada línea, podemos calcular los valores de los parámetros y que definen aquella parte de la línea que se encuentra dentro del rectángulo de recorte. El valor de , se determina mediante la búsqueda en las aristas del rectángulo para las que la línea está orientada de afuera hacia dentro . Para estas aristas, calculamos . El valor de se obtiene como el mayor del conjunto que contiene 0 y los valores de r. Inversamente, el valor de se determina examinando los límites para los que la línea está orientada de dentro hacia afuera . Para cada una de estas aristas se calcula un valor de  y el valor de es el mínimo del conjunto que contiene 1 y los valores de r calculados. Si  , la línea está completamente fuera de la ventana de recorte y se puede rechazar. De lo contrario, los puntos extremos de la línea recortada se calculan a partir de los dos valores del parámetro .

Por lo general, el algoritmo de recorte de lineas de Liang-Barsky es más eficiente que el de Cohen-Suthcrland.


Ejemplo de recorte utilizando el algoritmo de Liang-Barsky

Tenemos un rectángulo de recorte cuya diagonal es de (-1,3) a (3,-3) que representa nuestra vista. Queremos mostrar el segmento AB, en tal rectángulo de recorte, descrito por los puntos, A = ( -2, 1 )  y  B = ( 2, 2 ).

        

        

                        

Obtenemos los parámetros p y q:

,        (Izquierdo)

,        (Derecho)

,        (Inferior)

,                        (Superior)

Determinamos los parámetros, y para definir que parte de la línea se encuentra en la ventana de recorte:

Verificar  (:

(FALSO la línea no está completamente fuera sino intercepta a la ventana de recorte.

En base a las ecuaciones paramétricas:

                                                

Si entonces  o también calcular si Si entonces

Asumiendo que la línea intercepta al borde izquierdo:

                

Recorte de líneas de Nicholl-Lee-Nicholl

Mediante la creación de más regiones alrededor de la ventana de recorte, el algoritmo de Nicholl-Lee-Nicholl (NLN) evita los múltiples cálculos de las intersecciones de la línea. En el método de Cohen-Sutherland, por ejemplo, se podían calcular múltiples intersecciones a lo largo de la trayectoria de un segmento de línea antes de localizar una intersección en el rectángulo de recorte o de rechazar completamente la línea. Estos cálculos adicionales de intersecciones se eliminan en el algoritmo NLN mediante una mayor comprobación de regiones antes de calcular las intersecciones. Comparado tanto con el algoritmo de Cohen-Sutherland como con el de Liang-Barsky, el algoritmo de Nicholl-Lee-Nicholl realiza menos comparaciones y divisiones. La desventaja del algoritmo NLN es que sólo se puede aplicar al recorte bidimensional, mientras que tanto el algoritmo de Liang-Barsky como el de Cohen-Sutherland se pueden ampliar fácilmente a escenas tridimensionales.

La comprobación inicial para determinar si un segmento de línea está completamente dentro de la ventana de recorte o fuera se puede realizar con comprobaciones de códigos de región, como en los dos algoritmos previos. Si no es posible una aceptación o un rechazo triviales, el algoritmo NLN procede a establecer regiones de recorte adicionales.

Para una línea con puntos extremos y , primero determinamos la posición del punto  respecto a las nueve posibles regiones relativas a la ventana de recorte. Sólo se necesita considerar las tres regiones que se muestran en la Figura.

Si  se encuentra en cualquiera de las otras seis regiones, podemos moverlo a una de las tres regiones de la Figura anterior mediante una transformación de simetría. Por ejemplo, se puede transformar la región situada directamente encima de la ventana de recorte en la región situada a la izquierda de la ventana utilizando una reflexión respecto de la línea y = -x, o podríamos utilizar una rotación de 90° en sentido contrario al movimiento de las agujas del reloj.

Asumiendo que y no están ambos dentro de la ventana de recorte, a continuación determinamos la posición de respecto de . Para ello, creamos algunas regiones nuevas en el plano, dependiendo de la posición de . Los límites de las nuevas regiones son los segmentos de línea semi-infinitos que comienzan en y pasan a través de las esquinas de la ventana de recorte. Si se encuentra dentro de la ventana de recorte, establecemos las cuatro regiones que se muestran en la Figura siguiente.

Después, dependiendo de cuál de estas cuatro regiones (L, T, R, o B) contenga , calculamos la intersección de la línea con el límite correspondiente de la ventana.

Si se encuentra en la región situada a la izquierda de la ventana, establecemos las cuatro regiones etiquetadas como L, LT, LR y LB en la Figura anterior estas cuatro regiones de nuevo determinan una única arista de la ventana de recorte para el segmento de línea, relativa a la posición de . Por ejemplo, si  está en una de las tres regiones etiquetadas como L, recortamos la línea del límite izquierdo de la ventana y guardamos el segmento de línea desde esta intersección a . Si está en la región LT, salvarnos el segmento desde el límite izquierdo de la ventana hasta el límite superior. Un procesamiento similar se lleva a cabo en las regiones LR y LB. Pero si no está en ninguna de las cuatro regiones L, LT, LR o LB, se recorta la línea completa.

En el tercer caso, cuando  está a la izquierda y encima de la ventana de recorte, utilizamos las regiones de la Figura anterior. En este caso, tenemos las dos posibilidades mostradas, dependiendo de la posición de con respecto a la esquina superior izquierda de la ventana de recorte. Cuando está cerca del límite izquierdo de recorte de la ventana, utilizamos las regiones del apartado (a) de esta figura. De lo contrario, cuando está cerca del límite superior de recorte de la ventana, utilizamos las regiones del apartado (b). Si  está en una de las regiones T, L, TR, TB, LR, o LB. esto determina un único borde de la ventana de recorte para los cálculos de intersección. De lo contrario, la línea entera se rechaza.

Para determinar la región en la que se encuentra , comparamos la pendiente del segmento de línea con las pendientes de los límites de las regiones del algoritmo NLN. Por ejemplo, si  está a la izquierda de la ventana de recorte, entonces está en la región LT si.

o

Y recortamos la línea entera si,

Los cálculos de diferencias de coordenadas y los cálculos de productos utilizados en los tests de las pendientes se almacenan y se utilizan también en los cálculos de las intersecciones. A partir de las ecuaciones paramétricas:

calculamos la coordenada  de la intersección con el límite izquierdo de la ventana como , por lo que y la coordenada  de la intersección es:

Y para una intersección con el límite superior tenemos ,y , por lo que la coordenada  vale:

Ejemplo de recorte utilizando el algoritmo de Liang-Barsky

Tenemos un rectángulo de recorte cuya diagonal es de (-1,3) a (3,-3) que representa nuestra vista. Queremos mostrar el segmento AB, en tal rectángulo de recorte, descrito por los puntos, A = ( -2, 1 )  y  B = ( 2, 2 ).

CAPÍTULO V: REPRESENTACIONES TRIDIMENSIONALES DE OBJETOS

5.1. Conceptos básicos.

5.2. Métodos de despliegue tridimensional.

5.3. Superficies de polígonos y líneas

5.4. Superficies cuadráticas  y súper cuadráticas

5.5. Representación

 

CAPÍTULO V: TRANSFORMACIONES Y MODELADO TRIDIMENSIONAL

6.1. Transformaciones básicas.

6.2. Transformaciones compuestas

6.3. Transformaciones de modelado y de coordenadas