La computación gráfica 2D es la generación de imágenes digitales por computadora - sobre todo de modelos bidimensionales (como modelos geométricos, texto y imágenes digitales 2D) y por técnicas específicas para ellos. La palabra puede referirse a la rama de las ciencias de la computación que comprende dichas técnicas, o a los propios modelos.
La computación gráfica 2D se utiliza principalmente en aplicaciones que fueron desarrolladas originalmente sobre tecnologías de impresión y dibujo tradicionales, tales como tipografía, cartografía, dibujo técnico, publicidad, etc. En estas aplicaciones, la imagen bidimensional no es sólo una representación de un objeto del mundo real, sino un artefacto independiente con valor semántico añadido; los modelos bidimensionales son preferidos por lo tanto, porque dan un control más directo de la imagen que los gráficos 3D por computadora (cuyo enfoque es más semejante a la fotografía que a la tipografía).
Los gráficos 2D por computadora se han iniciado en la década de 1950, basándose en dispositivos de gráficos vectoriales. Éstos fueron suplantados en gran parte por dispositivos basados en gráficos raster en las décadas siguientes. El lenguaje PostScript y el protocolo de sistema de ventanas X fueron piezas claves en la evolución histórica del campo.
Linea:
Una línea es una sucesión continua de puntos (trazado), como por ejemplo un
trazo o un guion. Las líneas suelen utilizarse en la composición artística, se
denomina en cambio «raya» a trazos rectos sueltos, que no forman una figura o
forma en particular.
En matemáticas y geometría, línea suele denotar línea recta o curva. Otro concepto de línea desde la teoría de Kandinsky es, la línea geométrica es un ente invisible. La línea es un punto en movimiento sobre el plano; al destruirse el reposo del punto este se mueve por el espacio dando origen a la línea.
La línea es el elemento más básico de todo grafismo y uno de los sumamente utilizados. Representa la forma de expresión más sencilla y pura, que a la vez puede ser dinámica y variada. Enrique Lipszyc expresa: la línea que define un contorno es una invención de los dibujantes, ya que en la naturaleza un objeto es distinguido de otro por su diferencia de color o de tono.
En matemáticas y geometría, línea suele denotar línea recta o curva. Otro concepto de línea desde la teoría de Kandinsky es, la línea geométrica es un ente invisible. La línea es un punto en movimiento sobre el plano; al destruirse el reposo del punto este se mueve por el espacio dando origen a la línea.
La línea es el elemento más básico de todo grafismo y uno de los sumamente utilizados. Representa la forma de expresión más sencilla y pura, que a la vez puede ser dinámica y variada. Enrique Lipszyc expresa: la línea que define un contorno es una invención de los dibujantes, ya que en la naturaleza un objeto es distinguido de otro por su diferencia de color o de tono.
DDA
El
analizador diferenciador digital (DDA - Digital Differential Analyzer) es un algoritmo de conversión de rastreo
que se basa en el cálculo ya sea de Dy o Dx por medio de las ecuaciones:
(4) Dy = m Dx
(5) Dx = Dy / m
Se
efectúa un muestreo de la línea en intervalos unitarios en una coordenada y se
determina los valores enteros correspondientes mas próximos a la trayectoria de
la línea para la otra coordenada.
Tomemos
una línea con pendiente positiva, si la pendiente | m | £ 1, se hace el muestreo en x en intervalos unitarios (Dx = 1 y Dy = m dado que m = Dy / Dx) y se calcula cada valor sucesivo de y como:
(6) yk+1 = yk+ m
El
subíndice toma valores enteros a partir de 1 y aumenta a razón de 1 hasta
alcanzar el valor final.
Ya
que m puede ser cualquier numero real entre 0
y 1, los valores calculados de y deben redondearse al entero mas cercano.
Para líneas con una pendiente | m | > 1, se revierten las funciones de x y y, o sea, se realiza un muestreo de y en intervalos unitarios (Dy = 1 y Dx = 1/m dado que m = Dy / Dx) y se calcula cada valor sucesivo de x como:
(7) xk+1 = xk+ 1/m
Las
ecuaciones (6) y (7) se basan en la suposición de que las líneas deben
procesarse del extremo izquierdo al derecho.
Si
este procesamiento se revierte, entonces Dx o Dy serian -1, y yk+1 = yk - m o xk+1 = xk - 1/m
Algoritmo de Bresenham para trazar
líneas
Un
algoritmo preciso y efectivo para la generación de líneas de rastreo,
desarrollado por Bresenham (1965), convierte mediante rastreo las líneas
utilizando solo cálculos incrementales con enteros que se pueden adaptar para
desplegar también curvas.
El
algoritmo busca cual de dos pixeles es el que esta mas cerca según la
trayectoria de la línea.
Consideremos
el proceso de conversión para líneas con pendiente positiva 0 < m < 1.
Las
posiciones de pixel a lo largo de la trayectoria de una línea se determinan al
efectuar un muestreo de x en intervalos unitarios.
Si
se inicia desde el extremo izquierdo (x0,y0) de una línea determinada, se pasa a
cada columna sucesiva y se traza el pixel cuyo valor de y se aproxima mas a la trayectoria de la
línea de rastreo.
Si
suponemos que se debe desplegar el pixel en (xk,yk), a continuación se necesita decidir
que pixel se debe desplegar en la columna xk+1.
Las
alternativas son los pixeles (xk+1,yk), y (xk+1,yk+1).
Al
realizar el muestreo en la posición xk+1 designamos la separación de pixeles verticales
de la trayectoria de la línea matemática como d1 y d2.
La
coordenada de y en la línea matemática en la posición de
la columna de pixel xk+1 se calcula como:
(10) y = m (xk + 1) + b
Entonces
d1 = y - yk = m (xk + 1) + b – yk
y
d2 = (yk + 1) - y = yk + 1 - m (xk + 1) - b
La
diferencia entre estas dos separaciones es
(11) d1 - d2 = 2 m (xk + 1) - 2 yk + 2 b - 1
Un
parámetro de decisión pk para el paso k en el algoritmo de línea se puede
obtener al reordenar la ecuación anterior, de modo que implique solo cálculos
de enteros.
Esto
se logra sustituyendo m = Dy / Dx donde Dx y Dy son las separaciones horizontal y
vertical de las posiciones de los extremos de la línea y al definir:
(12) pk = Dx (d1 - d2) = Dx (2 Dy / Dx (xk + 1) - 2 yk + 2 b - 1)
=
2 Dy xk - 2 Dx yk + 2 Dy + 2 b Dx - Dx
=
2 Dy xk - 2 Dx yk + c
El
signo de pk es el mismo que el de d1 - d2 puesto que Dx > 0 en el ejemplo.
El
parámetro c es un constante, donde c = 2 Dy + 2 b Dx - Dx, que es independiente del pixel.
Si
el pixel yk esta mas cerca de la trayectoria de la
línea que el pixel yk + 1 (es decir d1 < d2), entonces el parámetro de decisión pk es negativo.
En
ese caso, trazamos el pixel inferior; de otro mode, trazamos el pixel superior.
Los
cambios de coordenadas a lo largo de la línea ocurren en pasos unitarios ya sea
en la dirección de x o en la de y.
Por
tanto, es posible obtener los valores de parámetros de decisión sucesivos al
utilizar cálculos incrementales en enteros. En el paso k + 1, el parámetro de decisión se evalúa
con base en la ecuación anterior como:
pk+1 = 2 Dy xk+1 - 2 Dx yk+1 + c
Al
sustraer la ecuación (12) de la anterior obtenemos
pk+1 - pk = 2 Dy (xk+1 - xk) - 2 Dx( yk+1 - yk)
Pero xk+1 = xk + 1, de manera que
(13) pk+1 = pk + 2 Dy - 2 Dx( yk+1 - yk)
donde
el termino yk+1 - yk es 0 o 1, dependiendo del signo del
parámetro p. Este calculo recurso de los parámetros
de decisión se realiza en cada posición entera de x, empezando en el extremo izquierdo de
las coordenadas de la línea. El primer parámetro p0 se evalúa a partir de la ecuación (12)
en la posición del pixel inicial (x0,y0), sustituyendo
con
b = y0 - m x0 y m = Dy / Dx.
p0 = Dx (2 Dy / Dx(x0 + 1) - 2 y0 + 2 (y0 - (Dy / Dx) x0) - 1)
=
2 Dy x0 + 2 Dy - 2 Dx y0 + 2 Dx y0 - 2 Dy x0 - Dx
donde
se obtiene la siguiente ecuación:
(14) p0 = 2 Dy - Dx
En
resumen, los pasos son:
1.
Se capturan los dos extremos de la línea y se almacena el extremo izquierdo en
(x0,y0).
2.
Se carga (x0,y0) en el bufer de estructura, o sea, se
traza el primer punto.
3.
Se calculan las constantes Dy, Dx, 2Dy, 2Dy-2Dx, y se obtiene el valor inicial para el
parámetro de decisión como p0 = 2 Dy - Dx.
4.
En cada xk a lo largo de la línea, que inicia en k
= 0, se efectúa la prueba siguiente: si pk < 0, el siguiente punto que se debe
trazar es (xk+1,yk) y pk +1 = pk + 2 Dy. De otro modo, el siguiente punto en
trazarse es (xk+1,yk+1)
y pk +1 = pk + 2 Dy - 2Dx.
5.
Se repite el paso 4 otras Dx veces.
2.2 Representacion y trazo de poligonos
OpenGL maneja polígonos correctamente siempre y cuando
sean simples y convexos. Si ese no es el caso, OpenGL dibuja cosas raras.
Además en algunas ocasiones se quiere especificar el
vector normal del plano en el cual se encuentra el polígono. Dicho vector
normal se necesita p.e. para algoritmos de visualización avanzada (``Phong
shading'').
Cuando se escriben aplicaciones gráficas nos
enfrentamos con el problema siguiente: desde alguna fuente ``vienen'' listas de
puntos (o bien de otro programa, o bien de un fichero, o bien de modo
interactivo) y hay que interpretar las listas como polígonos, es decir, hay que
verificar si las listas cumplen la definición de especificar polígonos simples
y convexos. Si ese no es el caso, a lo mejor se pueden ``corregir'' las listas.
(Programas con tal propiedades se llama robustos y tolerantes.)
Entonces (en el caso de mera visualización con
OpenGL):
Se puede eliminar puntos múltiples consecutivos en la
lista.
Se puede intentar calcular el plano en el cual se
encuentran más o menos los puntos del polígono (eso no es tan trivial).
En dicho plano, es decir, una vez corregidos los
puntos hasta que se encuentren exactamente en el plano, se puede verificar si
el polígono es simple y convexo (eso es algo bastante fácil).
Si no es así, se podría subdividir el polígono en
partes simples y convexos para seguir trabajando después con las partes sin
problemas (este paso no lo vamos a realizar en estas prácticas).
Antes de dedicarnos a los detalles, dibujamos
polígonos con OpenGL asumiendo que la lista de puntos cumple la definición.
Siempre que se quiera dibujar un objeto de OpenGL (en
este caso unos polígonos, antes vimos puntos y segmentos), hay que decírselo de
antemano con la función
glBegin()
La lista de puntos se define con consecutivas llamadas
a
glVertex*()
y se termina el trabajo con
glEnd()
En lugar de dibujar polígonos rellenados, OpenGL puede
dibujar, o bien solo las esquinas o bien solo los segmentos del borde. Eso se
realiza con la función
glPolygonMode()
a la cual hay que pasar también cuál de las dos
posibles caras del polígono se quiere pintar.
Además se pueden llenar los polígonos con patrones que
no detallamos por el momento.
glEnable()
glPolygonStipple()
2.3 Tranformaciones bidimencionales
Traslación
Se aplica una traslación en un objeto para cambiar su
posición a lo largo de la trayectoria de una línea recta de una dirección de
coordenadas a otra. Convertimos un punto bidimensional al agregar las
distancias de traslación, tx y ty la posición de coordenadas original (x,y)
El par de distancia de traslación se llama vector de
traslación o vector de cambio. Se pueden expresar las ecuaciones anteriores en
una sola ecuación matricial al utilizar vectores de columna para representar
las posiciones de coordenadas y el vector de traslación
Los polígonos se trasladan al sumar el vector de
traslación a la posición decoordenadas de cada vértice y se vuelve a generar el
polígono utilizando un nuevo conjuntode coordenadas y vértices y las
especificaciones actuales de los atributos.
Rotación
Se aplica una rotación bidimensional en un objeto al
cambiar su posición a lo largo de la trayectoria de una circunferencia en el
plano de xy . Para generar una rotación, especificamos un ángulo de rotación θ
y la posición (x r , y r ) del punto de rotación (o punto pivote) en torno al
cual se gira el objeto.
Escalación
Una transformación de escalación altera el tamaño de
un objeto. Se puede realizar esta operación para polígonos al multiplicar los
valores de coordenadas (x, y) de cada vértice por los factores de escalación s
x y s y para producir las coordenadas transformadas (x’, y’ ).
2.4 Representación matricial
• Muchas
aplicaciones incluyen secuencias de transformaciones geométricas:
– Una animación
requiere que los objetos se trasladen y roten en cada fotograma
– Un diseño CAD
requiere muchas transformaciones hasta obtener el resultado final
• Debemos
formular de forma muy eficiente toda la secuencia de transformaciones
• Cada transformación
puede representarse como P’ = P M1 + M2
• La matriz M1 contiene
la información de ángulos y factores de escala
• La matriz M2 contiene
los términos de traslación asociados al punto fijo y al centro de rotación
• Para producir
una secuencia de transformaciones hay que calcular las nuevas coordenadas en cada transformación! P’’ = P’
M3 + M4 = … = P M1 M3 + M2 M3 + M4
• Buscamos una
solución más eficiente que permita combinar las transformaciones para obtener directamente las coordenadas finales a
partir de las iniciales.
2.5 Ventana y puerto de visión
Colocación de ventanas y recorte
Los programas
de aplicaciones definen imágenes en un sistema de coordenadas mundiales. Este puede
ser cualquier sistema de coordenadas Cartesianas que un usuario halle
conveniente. Las imágenes definidas en coordenadas mundiales son procesadas por
el sistema de graficas en coordenadas de dispositivo. Comúnmente, un paquete de
graficas permite a un usuario especificar qué área de la definición de la
imagen se desplegara y donde se colocara en el dispositivo de despliegue.
Podría elegirse una sola área para el dispositivo de despliegue o bien podrían
seleccionarse varias áreas. Estas áreas pueden colocarse en localidades aparte
del despliegue o bien un área puede servir como una pequeña inserción en un
área mayor. Este proceso de transformación implica operaciones para trasladar y
escalar áreas seleccionadas y para borrar partes de la imagen que estén fuera
de las áreas. Estas operaciones se conocen como colocación de ventanas y
recorte.
Conceptos de colocación de ventanas
Un área
rectangular que se especifica en coordenadas mundiales se denomina ventana. El
área rectangular en el dispositivo de despliegue en el cual se coloca la
ventana se llama puerta de visión. La figura 1
ilustra el trazo o planimetría de la selección de una imagen que queda dentro
del área de ventana en una puerta de visión designada. Esta planimetría se
llamatransformación de la visión o bien transformación de normalización.
Los límites de la ventana se
especifican en coordenadas mundiales. Las coordenadas de dispositivo
normalizadas se usan con mayor frecuencia para la especificación de la puerta visión, aunque las coordenadas del dispositivo pueden
emplearse si hay solamente un dispositivo de salida en el sistemas. Cuando se
usan coordenadas de dispositivo normalizadas, el programador considera el
dispositivo de salida como aquel que tiene valores coordenados dentro del
intervalo de 0 a 1.
Planimetría de
una ventana en puerta de visión en coordenadas de dispositivo normalizadas.
Las posiciones
de coordenadas que se expresan en coordenadas de dispositivo normalizadas deben
convertirse a las coordenadas del dispositivo antes de que un dispositivo de
salida específico haga el despliegue. Una rutina específica del dispositivo se
incluye en paquetes de gráficas con este fin. La ventaja de emplear coordenadas
de dispositivo normalizadas es que el paquete de gráficas es considerablemente
independiente del dispositivo. Pueden utilizarse distintos dispositivos de
salida ofreciendo los conductores adecuados del dispositivo.
Cambiando la
posición de la puerta de visión, los objetos pueden desplegarse en diferentes
posiciones en un dispositivo de salida. Asimismo, variando el tamaño de las
puertas de visión, el tamaño y las proporciones de los objetos pueden
alterarse. Cuando se trazan en forma sucesiva ventanas de diferentes tamaños en
una puerta de visión, pueden lograrse efectos de acercamiento. Conforme las
ventanas se hacen pequeñas, un usuario puede lograr el acercamiento de alguna
parte de una escena para visualizar detalles que no se muestran con las
ventanas mayores.
Analógicamente,
puede obtener un panorama general más amplio realizando un acercamiento de una
sección de escena con ventanas cada vez más mayores. Los efectos de toma panorámica se producen moviendo o desplazando
una ventana de tamaño fijo a través de una imagen grande.
Un ejemplo del uso de comandos múltiples de colocación
de ventanas y puertas de visión se da en el siguiente procedimiento. Se
despliegan dos graficas en diferentes mitades de un dispositivo de despliegue.
Despliegue
simultaneo de dos gráficas, utilizando especificaciones múltiples de colocación
de ventanas y puertas de visión.
Otro método de
establecer múltiples áreas para la colocación de ventanas y puertas de visión
en un paquete de gráficas consiste en asignar un rotulo a cada especificación.
Esto podría hacerse incluyendo un quinto parámetro en los comandos de ventana y
puertas de visión para identificar cada área definida. El parámetro puede ser
un índice entero (0, 1, 2,…) que numere la definición de la ventana o puerta de
visión. Entonces se necesita un comando adicional para indicar un conjunto de
proporciones de salida. Este esquema de enumeración podría utilizarse también
para asociar una prioridad con cada puerta de visión de manera que la
visibilidad de las puertas de visión superpuestas se decida sobre una base de
prioridad. En la siguiente figura se
muestran puertas de visión desplegadas según su prioridad.
Despliegue de
puertas de vision en orden de prioridad. A las puertas de vision con numeración
inferior se les da mayor prioridad.
Para
implantaciones que incluyen estaciones de trabajo múltiples, podría definirse
un conjunto adicional de comandos de colocación de ventanas y puertas de
visión. Estos comandos incluyen un número de estación de trabajo para
establecer diferentes áreas de ventana y puertas de visión en diferentes
estaciones de trabajo. Esto permitirá a un usuario desplegar varias partes de
la imagen final en diferentes dispositivos de salida. Por ejemplo, un
arquitecto podría desplegar la totalidad de un plano de una casa en un monitor
y solamente el segundo piso en un segundo monitor.
No hay comentarios:
Publicar un comentario