Está en la página 1de 14

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD

Escuela de Ciencias Bsicas, Tecnologa e Ingeniera


Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

CAPTULO 5 Algoritmos bsicos


En este captulo se revisan los fundamentos geomtricos y matemticos a partir de
los cuales se generan los algoritmos que dibujan primitivas grficas como lneas,
circunferencias y arcos. Para su desarrollo se utiliz el captulo correspondiente del
texto de Claudio Delrieux y se complementa con la codificacin en Java de los
algoritmos.
Es muy difcil escoger un conjunto de primitivas grficas que sea adecuado para la
representacin de todo tipo de entidades grficas. Sin embargo, el siguiente
subconjunto resulta suficiente en la prctica:
Puntos: Se especifican a partir de su localizacin y color. Su discretizacin es
directa, como se mencion con anterioridad.
Segmentos de recta: Son esenciales para la mayor parte de las entidades. Se
especifican a partir de un par de puntos que representan sus extremos.
Circunferencias: En algunos casos representar entidades curvadas con
segmentos poligonales puede ser inadecuado o costoso, por lo que en la prcticas
las circunferencias o crculos se adoptan como primitivas. Se especifican con la
posicin de su centro y su radio.
Polgonos: Son indispensables para representar entidades slidas. Se representan
a partir de la secuencia de puntos que determina la poligonal de su permetro.

Leccin 21 Especificacin de una discretizacin


En el momento de escoger un mtodo de discretizacin para una primitiva grfica,
es indispensable contar con criterios que permitan evaluar y comparar las ventajas
y desventajas de las distintas alternativas. Entre todas las especificaciones
posibles, podemos mencionar las siguientes:
Apariencia: Es la especificacin ms obvia, aunque no es fcil describirla en
trminos formales. Normalmente se espera que un segmento de recta tenga una
apariencia recta ms all de que se hallan escogido los pixels matemticamente
ms adecuados. Tampoco debe tener discontinuidades. Debe pasar por la
discretizacin del primer y ltimo punto del segmento. Debe ser uniforme, etc.
Simetra e invariancia geomtrica: Esta especificacin se refiere a que un
mtodo de discretizacin debe producir resultados equivalentes si se modifican
algunas propiedades geomtricas de la primitiva que se est discretizando. Por

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

ejemplo, la discretizacin de un segmento no debe variar si dicho segmento se


traslada a otra localizacin en el espacio, o si es rotado, etc.
Simplicidad y velocidad de cmputo: Como los mtodos tradicionales de
discretizacin de primitivas se desarrollaron hace tres dcadas, en momentos en
que las posibilidades del hardware y software eran muy limitadas, los resultados
eran muy sensibles al uso de memoria u operaciones aritmticas complejas. Por lo
tanto, los mtodos tienden a no depender de estructuras complejas y a ser
directamente implementables en hardware especfico de baja complejidad.

21.1 Mtodos de discretizacin


Dada una primitiva grfica a discretizar, debemos encontrar los pixeles que la
representen de la manera ms correcta posible. Para ello, lo ms adecuado es
caracterizar matemticamente a dicha primitiva, de modo que su discretizacin
pueda efectuarse en forma sencilla. Entre los diversos mtodos que pueden
plantearse destacamos los dos siguientes:
Evaluar su ecuacin diferencial a diferencias finitas: Este mtodo, denominado
DDA (discrete diference analyzer) consiste en plantear la ecuacin diferencial de la
primitiva a discretizar, y luego evaluar dicha expresin a intervalos adecuados.
Anlisis del error: Estos mtodos fueron desarrollados por Bressenham y se
basan en analizar, dado un pixel que pertenece a la discretizacin de la primitiva,
cul es el prximo pixel que minimiza una determinada expresin que evala el
error que comete la discretizacin.

Leccin 22 Segmentos de recta


El anlisis de los mtodos de discretizacin de rectas parte de considerar el
comportamiento esperado en determinados casos particulares. Dichos casos
surgen de suposiciones especficas que simplifican el problema, pero que al mismo
tiempo se pueden generalizar a todos los dems casos por medio de simetras.
Dado un segmento de recta que va de (x0; y0) a (x1; y1), se supone que:

x = (x1 - x0 ) 0,
y = (y1 - y0 ) 0, y
x y.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Esto equivale a trabajar en el octavo del espacio de pantalla sombreado en la


Figura 38, donde el origen es el pixel que corresponde a la discretizacin del punto
(x0;y0) y la zona sombreada a los lugares donde puede ubicarse el punto (x1;y1 ).

Figura 38 Espacio designado para caracterizar la discretizacin de rectas

22.1 Segmentos de recta DDA


Como ya se mencion, los mtodos DDA evalan la ecuacin diferencial de la
primitiva a intervalos finitos. En el caso particular de los segmentos de recta, la
ecuacin diferencial es:

El mtodo busca encontrar una secuencia de n + 1 puntos tales que (x0;y0) =


(x0;y0); (x1;y1); (xn;yn) = (x1;y1). La discretizacin de cada uno de ellos son los
pixeles de la discretizacin del segmento. Esta propiedad, si bien es trivial, es de
gran importancia porque determina que la discretizacin de un segmento de recta
es invariante frente a transformaciones afines. Esto significa que es equivalente
transformar los extremos del segmento y discretizar el segmento transformado, o
discretizar primero y transformar cada punto obtenido. Sin embargo, la primera
alternativa es mucho ms eficiente.

Dada la ecuacin diferencial y un incremento finito arbitrario


, podemos
pasar de un pixel dado de la secuencia al siguiente por medio de la expresin

determina la frecuencia de muestreo del segmento. Un valor muy pequeo

determina que muchas muestras producirn puntos que sern discretizados al

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

mismo pixel. Por el contrario, un valor muy grande determinara que el segmento
aparezca punteado en vez de ser continuo como corresponde. Un valor prctico
es elegir x = 1 y por lo tanto n = x, es decir, la discretizacin tiene tantos pixeles
como longitud tiene el segmento en la variable que ms vara (ms uno, dado que
la secuencia tiene n + 1 puntos). Al mismo tiempo es fcil ver que

En la Figura 39 es posible ver el resultado de discretizar un segmento particular por


el mtodo DDA. Observese que los puntos extremos (x0; y0) a (x1;y1) son en
efecto puntos y por lo tanto estn ubicados en cualquier lugar dentro del pixel que
corresponde a su discretizacin.

Figura 39 Discretizacin de un segmento de recta con DDA

Un algoritmo sencillo escrito en lenguaje Java que computa la discretizacin de un


segmento de recta por el mtodo DDA se muestra en la Figura 40. Obsrvese que
se computan las variables en punto flotante, y que adems se requiere una divisin
en punto flotante que corresponde al clculo de m.
Un pequeo parntesis para explicar algunas sentencias que pueden causar
dudas:
1. Sobre el parmetro Graphics g (lnea 26), corresponde al contexto grfico de
la ventana (algo as como un lienzo) sobre el cual se dibuja.
2. La llamada al mtodo setColor (lnea 34) permite modificar el color actual
con el cual se est dibujando, se toma el color como un objeto de tipo Color
que puede ser de los preterminados de Java o creado a partir de los
parmetros r, g, b. Esta llamada al mtodo setColor permite modificar el
color del lpiz que dibuja sobre el contexto grfico.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Figura 40 Codificacin en Java del algoritmo DDA de dibujo de lneas

3. Java no tiene una sentencia bsica para dibujar puntos (pixeles), en este
caso se utiliza la sentencia g.drawRect (lnea 35) para dibujar un rectngulo
con un ancho y alto de 0, que en su ejecucin se traduce a pintar un nico
pixel ubicado en el punto enviado como parmetro.
4. En la misma sentencia g.drawRect (lnea 35) se utiliza el casting a enteros
para lograr la discretizacin de las coordenadas flotantes.

La ejecucin del algoritmo dara como resultado algo similar a lo mostrado en la


Figura 41 para 3 lneas diferentes.
Para poder discretizar un segmento de recta
en cualquiera de las posibilidades es
necesario considerar las simetras que se
aplican. Si por ejemplo no se cumple que y =
(y1 - y0) 0, entonces hay que considerar
pendientes negativas (simetra A), caso que el
algoritmo
de
la
Figura
40
realiza
automticamente.
En cambio, si x = (x1 - x0 ) 0, entonces es
Figura 41 Ejecucin del algoritmo DDA necesario decrementar a x en el ciclo e iterar
en Java
mientras no sea menor que x1 (simetra B).

Por ltimo, si no se cumple que x y, entonces es necesario intercambiar los


roles de las variables x e y (simetra C). Cualquier combinacin de situaciones se
puede resolver con combinaciones de simetras (ver Figura 42).

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Figura 42 Simetras para discretizar segmentos de recta

22.2 Segmentos de rectas por Bressenham


En el algoritmo DDA para segmentos de recta es necesario computar sumas entre
las variables en punto flotante, y adems se requiere una divisin en punto flotante
para computar la pendiente. El mrito del algoritmo que vamos a presentar consiste
en que todas las operaciones se realizan en aritmtica entera por medio de
operaciones sencillas, y por lo tanto, su ejecucin es ms rpida y econmica, y es
de fcil implementacin con hardware especfico.
El punto de partida del anlisis es el siguiente. Si la discretizacin de los puntos
extremos del segmento debe pertenecer a la discretizacin del segmento, entonces
es conveniente efectuar la llamada al algoritmo luego de discretizar los extremos.
Esto significa que (x0; y0) y (x1; y1),y por lo tanto x y y son enteros.

Figura 43 Si p pertenece a la discretizacin el


prximo punto ser E o D

Luego, si p es un pixel que pertenece a


la
discretizacin
del
segmento,
entonces
en
las
condiciones
particulares mencionadas, el prximo
pixel solamente puede ser el ubicado a
la derecha (E o hacia el este), o el
ubicado en diagonal hacia la derecha y
hacia abajo (D o en diagonal) como se
muestra en la Figura 43.

La decisin de ir hacia el paso E o D se toma en funcin del error que se comete en


cada caso. En este algoritmo se considera que el error es la distancia entre el

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

centro del pixel elegido y el segmento de recta, medida en direccin del eje Y
positivo del espacio de pantalla (es decir, hacia abajo). Si el error en p fuese cero,
entonces al ir hacia E el error pasa a ser m (la pendiente del segmento), y en D el
error pasa a ser m - 1 (ver Figura 44).

Figura 44 Error al desplazarse en E

Figura 45 Eleccin del prximo pixel

En general, si en p el error es e, la actualizacin del error es:

Paso a E : e = e + m
Paso a D : e = e + m 1

Por lo tanto, la eleccin del paso E o D depende de que el valor absoluto de e+m
sea o no menor que el valor absoluto de e+m-1. Expresado de otra manera, sea e
el error en un determinado pixel. Si e +m> 0.5 entonces el segmento de recta pasa
ms cerca del pixel D, y si no, pasa ms cerca del pixel E (ver Figura 45).
Una de las economas de cmputo del mtodo proviene de poder evaluar el error
preguntando por cero. Es fcil ver que si se inicializa el error en e = m 0.5
entonces en cada paso hay que chequear e >0 para elegir D. La otra economa
proviene de realizar manipulaciones algebraicas para efectuar un cmputo
equivalente pero en aritmtica entera. Como se evala el error por cero, multiplicar
el error por una constante no afecta el resultado. Por lo tanto, multiplicamos el error
por 2x. A partir de dicho cambio, se constatan las siguientes igualdades:

e0 2x
0.5 2y x
x

Paso a E : e = e+2y
Paso a D: e = e+2(y-x)

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

De esta manera todas las operaciones se efectan en aritmtica entera, con su


correspondiente agilizacin del tiempo de procesamiento.

Figura 46 Algoritmo de Bressenham para segmentos de recta

La implementacin del algoritmo de Bressenham para segmentos de recta se


muestra en la Figura 46. Teniendo en cuenta que los productos por 2 en aritmtica
entera se efectan con un desplazamiento a izquierda, es posible observar que el
mismo utiliza operaciones elementales e implementables con hardware especfico
muy sencillo.

Leccin 23 Discretizacin de circunferencias


Como en el caso de los segmentos de recta, en la discretizacin de circunferencias
o crculos es posible trabajar un slo segmento de la circunferencia y se obtienen
las dems por simetra. Igualmente se dispone de algoritmos DDA y de
Bressenham para el dibujo de circunferencias. En este aparte se mostrar una
adaptacin del algoritmo DDA a partir de la ecuacin de la circunferencia, tomado
de la pgina internet de Roberto Albornoz.
Para poder realizar el dibujo de la circunferencia usaremos las ecuaciones de la
circunferencia en coordenadas polares que son:

x r * cos
y r * sen

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Estas ecuaciones sern las que ocuparemos para calcular cada punto (x,y) del
crculo, donde el r ser obviamente el radio de crculo y ser el ngulo que forma
el radio con la parte positiva del eje x. En forma grfica sera as:

Figura 47 Circunferencia con coordenadas polares

El ngulo deber estar en radianes ya que las funciones de seno y coseno que
incluye Java, trabajan con los ngulos en radianes. La frmula para transformar
grados a radianes es la siguiente:
radianes

gra dos *
180

Entonces para dibujar el crculo de un radio determinado, solamente tenemos que


hacer un ciclo desde 0 hasta 360, pero con incrementos pequeos, calcular cada
punto con las ecuaciones en coordenadas polares e ir dibujando cada punto. El
ciclo en vez de ir de 0 a 360 (ngulos en grados) ir de 0 a 6.28
(360*3.14/180=6.28) ya que el ngulo debe estar en radianes.
Como dijimos el ciclo de 0 a 6.28 debe hacerse con incrementos pequeos, no
contando de uno en uno, ya que para un crculo de radio muy grande, podran
aparecer huecos entre un punto y el siguiente, por lo tanto tenemos que usar un
incremento fraccionario. El valor 0.005 produce buenos resultados. Dibujar el
crculo punto a punto es una tarea un poco lenta, debido a que se debe calcular en
cada punto el seno y el coseno del ngulo, y estas funcionas son muy lentas. Para
solucionar esto se pueden crear tablas predefinidas o pre-calculadas. En la
siguiente figura se muestra el cdigo en Java que permitira dibujar el crculo en
una ventana.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Figura 48 Cdigo en Java para el dibujo de circunferencias

Ntese que al calcular las


coordenadas x e y, estamos
sumndoles las coordenadas cx e
cy. Esto se hace para trasladar el
centro del crculo a cualquier punto
que queramos. De esta forma,
para dibujar un crculo solamente
es necesario especificar las
coordenadas del centro (cx, cy), el
radio, el color del crculo y el
contexto grfico.

Figura 49 Resultado de la ejecucin del algoritmo


dibujo de circunferencias

Leccin 24 Dibujo de polgonos


Se considera un polgono una figura cerrada, formada a partir de varias lneas.
Para la discretizacin de polgonos se considerarn 2 tipos de polgonos: los
irregulares y los regulares, en concordancia con lo mostrado por Steven R
Davidson en su curso de grficos disponible en internet.

24.1 Polgonos irregulares


La graficacin de polgonos irregulares se realiza a partir de un conjunto de puntos
que se unen secuencialmente, el polgono se cierra al unir el primer y ltimo
puntos. A continuacin se muestra el cdigo Java que dibujara un polgono
irregular a partir de un vector de elementos de tipo Punto y el correspondiente
nmero de puntos.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Figura 50 Cdigo en java para el dibujo de polgonos

Figura 51 Resultado de la ejecucin del


algoritmo de dibujo de Polgonos

Cabe recordar que en Java, al igual que


en C, el ndice de los vectores inicia en
0. Por tanto, la primera lnea se dibuja
desde el primer punto (ndice 0) hasta el
segundo punto (ndice 1), contina del
segundo al tercero (ndice 2) y as
sucesivamente, hasta dibujar la lnea
del penltimo punto (ndice N-2) hasta
el ltimo punto del vector (ndice N-1).
Al finalizar el ciclo, dibuja la lnea de
cierre del polgono entre el ltimo punto
(ndice N-1) y el primero (ndice 0).

Como se podr deducir del cdigo el objeto Punto incluye las coordenadas x e y de
un punto en el plano cartesiano.

24.2 Polgonos regulares


Un polgono regular se compone de aristas/lados de igual longitud. Esto implica
que el ngulo entre cada arista contigua es el mismo. Si trazamos un segmento del
centro a un vrtice y otro segmento del centro a otro vrtice contiguo, entonces el
ngulo entre estos dos segmentos es un divisor de 2 = 360. En otras palabras,
cada ngulo mencionado es inversamente proporcional a la cantidad de lados del
polgono regular. Podemos usar la siguiente frmula:

= 2 / N, donde es el ngulo, y N es la cantidad de lados

Crearemos polgonos regulares en base a una circunferencia que circunscribe


nuestro polgono regular. Esto implica, que el centro de la circunferencia coincide
con el centro geomtrico de cualquier polgono regular. Para esto, necesitamos
usar algunas funciones trigonomtricas, junto con el ngulo ya calculado. El paso

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

principal es averiguar la coordenada del siguiente vrtice de nuestro polgono.


Usaremos las siguientes frmulas:
x i = cx + r * cos( i* )
y i = cy + r * sen( i* )
donde:
i = 0,1,2,...,N-1,
r es el radio de la circunferencia, y
c = (cx, cy) es la coordenada del centro geomtrico de la circunferencia y del
polgono.
Al agregar el centro a nuestra frmula, conseguimos mover el centro geomtrico
del origen (0,0) al que nosotros deseemos. En la Figura 52 se muestra el cdigo
que generara los polgonos regulares.

Figura 52 Cdigo en java para dibujar polgonos regulares

Los parmetros de entra para el mtodo especifican el nmero de lados del


polgono (N), el punto centro de la circunferencia (centro), el radio de la
circunferencia (radio), el contexto grfico (g) y el color.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Observe que es necesario hacer un


proceso de conversin a entero del dato
resultante en la multiplicacin del coseno
del ngulo por el radio (lneas 46 y 47),
ya que las coordenadas de los puntos se
deben expresar como datos enteros. Los
datos as calculados se utilizan en la
conformacin de cada vrtice del
polgono (lnea 48). Finalmente, una vez
obtenidas las coordenadas de todos los
vrtices del polgono se realiza la llamada
al proceso de dibujarPolgonos explicado
Figura 53 Resultado de la ejecucin del
en la seccin anterior (lnea 50).
algoritmo para dibujar polgonos regulares

Leccin 25 Llenado de reas


Si bien existen diversos mtodos, aqu presentaremos el ms econmico y
difundido, que se basa en encontrar la interseccin de todos los lados del polgono
con cada lnea de barrido (a y constante), por lo que el mtodo se denomina
conversin scan del polgono. Este mtodo es de gran importancia porque se
generaliza a una clase de algoritmos denominados scan-line para resolver
determinados problemas de iluminacin y sombreado en tres dimensiones.
Todo polgono plano puede descomponerse en tringulos. Por lo tanto el tringulo
ser la base del anlisis de la conversin scan de polgonos en general. Para
computarla es necesario dimensionar dos arreglos auxiliares de enteros minx,
maxx que para cada lnea de barrido almacenarn el menor y mayor x
respectivamente.

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD


Escuela de Ciencias Bsicas, Tecnologa e Ingeniera
Ingeniera de Sistemas
Mdulo del curso Computacin Grfica

Figura 54 Dibujo scan de un polgono

1. Inicializar minx a infinito y maxx a menos infinito.


2. Discretizar cada arista del tringulo (con DDA o Bressenham) reemplazando
la sentencia de dibujado por
if (x>maxx[y]) maxx[y]=x;
if (x<minx[y]) minx[y]=x;
3. Para cada y activo, graficar una lnea de minx[y] a maxx[y].

También podría gustarte