Você está na página 1de 18

ETN-903 SISTEMAS DE COMPUTACIN

RELOJ ANALGICO ASSEMBLER 80X86


Diseo de reloj analgico
PABLO ZAMORA MERCADO RONAL SANDOVAL

GRUPO N 23
05/07/2011

El proyecto en su totalidad muestra dos programas uno que se realizo con el algoritmo de Bresenham y otro con el algortimo de Xiaolin Wu

ETN-903 SISTEMAS DE COMPUTACIN 2 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

RELOJ ANLOGO ASSEMBLER 80x86 1. INTRODUCCIN Para el diseo del siguiente proyecto se encuentra la dificultad que no se puede trazar lineas ni circulos con alguna instruccin por tanto se debe reucrrir al modo grfico y a algn algoritmo de trazado de lineas, este problema fue visto ya por varios programadores que desarrollaron bastantes algoritmos diversos en su calidad y en su velocidad de ejecucin por el computador en el que se corran. Un algoritmo especial para este cometido, muy usado en programacin por cierto es el algoritmo de Bresenham. Para este tipo de programas donde se trazan lineas con pixeles surgio el problema del aliasing que es la distorsin de la linea por la aproximacin de pixeles a la linea, en respuesta a este problema se desarrollo otro algoritmo mejorado que eliminaba casi por completo el aliasing de la linea, este algortimo es el algoritmo de Xiaolin Wu estos dos procedimientos son distintos pero ambos importantes, ya que son aplicados adems de crear lineas en el procesamiento digital de imgenes. Se puede nombrar tambin una tcnica importante, el algoritmo de rellenado de una zona delimitada por pixeles utilizada tambin en este proyecto. El proyecto en su totalidad muestra dos programas uno que se realizo con el algoritmo de Bresenham que requirio del uso del coprocesador matemtico, para comparar la velocidad del algoritmo de Xiaolin Wu no se utiliz el coprocesador para comparar y mostrar la velocidad a la que funciona.(y para demostrar que se investigo y para merecer un poco ms de nota ;-) ) 2. COPROCESADOR MATEMTICO Definimos las instrucciones bsicas del coprocesador matemtico que nos ser de gran ayuda para agilizar el clculo con el coprocesador, acelerando nuestro codigo FADD: Hace ST(1) ms ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FADD mem: Hace ST <- ST + [mem]. En mem deber haber un nmero real en punto flotante. FIADD mem: Hace ST <- ST + [mem]. En mem deber haber un nmero entero en complemento a dos. FADD ST(num), ST: Realiza ST(num) <- ST(num) + ST. FADD ST, ST(num): Realiza ST <- ST + ST(num). FADDP ST(num), ST: Realiza ST(num) <- ST(num) + ST y retira el valor de ST de la pila, con lo que ambos operandos se destruyen.

ETN-903 SISTEMAS DE COMPUTACIN 3 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

FSUB: Hace ST(1) menos ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FSUB mem: Hace ST <- ST - [mem]. En mem deber haber un nmero real en punto flotante. FISUB mem: Hace ST <- ST - [mem]. En mem deber haber un nmero entero en complemento a dos. FSUB ST(num), ST: Realiza ST(num) <- ST(num) - ST. FSUB ST, ST(num): Realiza ST <- ST - ST(num). FSUBP ST(num), ST: Realiza ST(num) <- ST(num) - ST y retira el valor de ST de la pila, con lo que ambos operandos se destruyen. FSUBR: Hace ST menos ST(1), ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FSUBR mem: Hace ST <- [mem] - ST. En mem deber haber un nmero real en punto flotante. FISUBR mem: Hace ST <- [mem] - ST. En mem deber haber un nmero entero en complemento a dos. FSUBR ST(num), ST: Realiza ST(num) <- ST - ST(num). FSUBR ST, ST(num): Realiza ST <- ST(num) - ST. FSUBRP ST(num), ST: Realiza ST(num) <- ST - ST(num) y retira el valor de ST de la pila, con lo que ambos operandos se destruyen. FMUL: Multiplicar el valor de ST(1) por ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FMUL mem: Hace ST <- ST * [mem]. En mem deber haber un nmero real en punto flotante. FIMUL mem: Hace ST <- ST * [mem]. En mem deber haber un nmero entero en complemento a dos. FMUL ST(num), ST: Realiza ST(num) <- ST(num) * ST. FMUL ST, ST(num): Realiza ST <- ST * ST(num). FMULP ST(num), ST: Realiza ST(num) <- ST(num) * ST y retira el valor de ST de la pila, con lo que ambos operandos se destruyen.

ETN-903 SISTEMAS DE COMPUTACIN 4 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

FDIV: Dividir el valor de ST(1) por ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FDIV mem: Hace ST <- ST / [mem]. En mem deber haber un nmero real en punto flotante. FIDIV mem: Hace ST <- ST / [mem]. En mem deber haber un nmero entero en complemento a dos. FDIV ST(num), ST: Realiza ST(num) <- ST(num) / ST. FDIV ST, ST(num): Realiza ST <- ST / ST(num). FDIVP ST(num), ST: Realiza ST(num) <- ST(num) / ST y retira el valor de ST de la pila, con lo que ambos operandos se destruyen. FDIVR: Hace ST dividido ST(1), ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos se destruyen. FDIVR mem: Hace ST <- [mem] / ST. En mem deber haber un nmero real en punto flotante. FIDIVR mem: Hace ST <- [mem] / ST. En mem deber haber un nmero entero en complemento a dos. FDIVR ST(num), ST: Realiza ST(num) <- ST / ST(num). FDIVR ST, ST(num): Realiza ST <- ST(num) / ST. FDIVRP ST(num), ST: Realiza ST(num) <- ST / ST(num) y retira el valor de ST de la pila, con lo que ambos operandos se destruyen. FABS: Pone el signo de ST a positivo (valor absoluto). FCHS: Cambia el signo de ST. FRNDINT: Redondea ST a un entero. FSQRT: Reemplaza ST con su raz cuadrada. FSCALE: Suma el valor de ST(1) al exponente del valor en ST. Esto efectivamente multiplica ST por dos a la potencia contenida en ST(1). ST(1) debe ser un nmero entero.

ETN-903 SISTEMAS DE COMPUTACIN 5 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

3. ALGORITMOS. 1. Ecuacin de la recta.

S Supongamos que queremos trazar una recta entre los puntos del plano (x1, y1) y (x2, y2). La ecuacin continua de la recta que pasa por estos puntos, que transformamos en la de la pendiente, es:

2. Algoritmo de Bresenham. En 1965 J. E. Bresenham [2] presenta un elegante algoritmo de descretizacin que emplea aritmtica entera. Jack Bresenham es un consultor grfico de la industria y, desde 1987, un profesor de informtica en la universidad Winthrop. Su carrera profesional desde 1960 a 1987 incluye trabajos sobre algoritmos de dibujado de lneas y crculos en IBM, del que destaca el que explicamos en este punto. Antes de ir directamente al cdigo del algoritmo implementado veamos algunos conceptos matemticos que dan una idea bastante completa del mismo y que son aconsejables para la implementacin de este algoritmo.

El algoritmo de Bresenham dibuja el conjunto de nodos azules que vemos en la ilustracin anterior que caen cerca de la lnea terica entre dos pixels dados (x1,y1) y (x2,y2). Vemos que la lnea roja es la lnea terica entre los dos puntos, la negra es el camino seguido para encontrar los nodos azules, que son los que realmente se ilumina. Podemos suponer que x1 es menor que x2 y que la pendiente de la recta est entre 0 y 1 (primer octante). Para simplificar la ecuacin de la recta supondremos que el primer punto es el origen de coordenadas, es decir (x1,y1) = (0,0), con lo cul, la ecuacin de la recta resultante es:

ETN-903 SISTEMAS DE COMPUTACIN 6 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

Donde dy = y2-y1, dx = x2-x1. Las coordenadas de cada nodo las vamos a definir a partir de las coordenadas del primero P0 = (x1,y1). As, si Pi = (xi,yi), el nodo Pi+1 = Pi + (k,j) = (xi+k, yi+j). La variable k=1 siempre porque estamos en el primer octante (siempre incrementamos en 1 el valor de la x). Para cada valor de k lo que tenemos que hacer es calcular el valor de j, que slo puede ser 0 1. 0 significa que el siguiente nodo est a la misma altura del anterior, 1 que est a una altura superior.

En funcin de la ecuacin (2), el error cometido por la eleccin de un Pi u otro sera la distancia vertical respecto a la recta terica (comparamos las coordenadas y):

Si estudiamos cul de estas distancias es la menor, sabremos en qu punto pintar: A o B.

Puesto que dx > 0 al suponer que x1 < x2, definimos la funcin error en P i: Ei = dx(b-a) = 2xidy - 2dxyi-1 - dx. Si Ei 0 entonces b a y escogeremos Pi = (xi-1 + 1, yi-1) Si Ei > 0 entonces b > a y escogeremos Pi = (xi-1 + 1, yi-1 + 1) Slo queda por averiguar cmo calcular un error a partir del anterior:
Ei+1 = 2xi+1dy - 2dxyi - dx

si b a entonces:

ETN-903 SISTEMAS DE COMPUTACIN 7 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO
Ei+1 = 2(xi + 1)dy - 2dxyi-1 - dx = 2xidy - 2dxyi-1 - dx + 2dy = Ei + 2dy

si b > a entonces:
Ei+1 = 2(xi + 1)dy - 2dx(yi-1 + 1) - dx = 2xidy - 2dxyi-1 - dx + 2dy - 2dx = Ei + 2dy - 2dx.

Cuando lo que hay entre corchetes slo se da cuando j = 1 a < b, entonces: Ei+1 = Ei + 2dy [- 2dx] Debe entenderse que hemos supuesto que estamos en el primer octante (dy < dx), donde la x se incrementa mucho ms rpido que la y, por lo que siempre incrementamos la x en cada paso y decidimos si debemos hacerlo tambin para la y o no. Es importante que distingamos en nuestro cdigo el caso especial de un punto. En el caso de estar en el segundo octante (dx < dy) los trminos cambian y aqu la y se incrementa ms rpido que la x. Veamos por qu.

Puesto que ahora lo que incrementamos en uno cada paso es la y, y lo que buscamos es la x, la ecuacin (2) nos queda:

Lo que buscamos ahora es el error cometido en horizontal entre el punto terico y los dos posibles A y B que podemos elegir, calculando su distancia.

ETN-903 SISTEMAS DE COMPUTACIN 8 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

Si estudiamos cul de estas distancias es la menor, sabremos en qu punto pintar: A o B.

Si suponemos que y1 < y2 entonces dy > 0 y definimos la funcin error en Pi:


Ei = dy(b-a) = 2yidx - 2dyxi-1 - dy.

Si Ei 0 entonces b a y escogeremos Pi = (xi-1, yi-1 + 1) Si Ei > 0 entonces b > a y escogeremos Pi = (xi-1 + 1, yi-1 + 1) De la misma forma de antes encontramos que el error cometido es:
Ei+1 = Ei + 2dx [- 2dy]

Entonces, para escribir un cdigo que dibuje una lnea recta segn Bresenham debemos tener en cuenta las dos posibilidades. Adems hay que chequear la posicin relativa entre x1 y x2, as como entre y1 e y2

Pseudocodigo.
/* Inicializamos variables */ dx = x2 - x1 dy = y2 - y1 E = 2 * dy - dx Dn = E + dx = 2dy Dp = E - dx = 2dy - 2dx x = x1 DO WHILE x <= x2 IF E < 0 THEN E = E + Dn /* y = y + 0 */ ELSE E = E + Dp y = y + 1 END IF x = x + 1 DrawPoint (x, y) LOOP

ETN-903 SISTEMAS DE COMPUTACIN 9 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

3. Algoritmo de Xiaolin Wu (Double - step). Este algoritmo fue creado por Xiaolin Wu y G. Rokne en el ao 1985 [3] donde se intenta incrementar la velocidad con la que se dibuja la lnea en pantalla. La idea es avanzar dos pxeles en cada iteracin. Adems, al igual que el algoritmo de Bresenham usa aritmtica entera, necesitando la misma cantidad de operaciones en cada iteracin pero con la ventaja de requerir slo la mitad de las iteraciones para completar la lnea. A continuacin veamos los conceptos ms significativos necesarios para el buen entendimiento de este algoritmo. Tenemos el plano dividido en cuatro zonas: a) Cuadrante 1: 0<dy/dx<=1 b) Cuadrante 2: 1 < dy/dx < c) Cuadrante 3: - <dy/dx <-1 d) Cuadrante 4: -1<= dy/dx<=0 donde la pendiente de la recta la llamaremos m y viene dado por el valor dy/dx, quedandonos la recta: y = mx + b = (dy/dx) x + b. El algoritmo est restringido al primer caso a) (pendiente entre cero y uno) ya que el resto de los casos se tratara de la misma forma intercambiando x e y o cambiando la direccin del incremento (recordamos que en la aplicacin tanto en este algoritmo como en el resto, reciben los puntos en el primer octante (cuadrante 1) e internamente a la hora de mostrar los pxeles en pantalla, stos se sitan en su posicin original). Las lneas tendrn coordenadas enteras donde (xP, yP) la coordenada inicial (xQ, yQ) la coordenada final determinando as la recta a dibujar. Cuando el intervalo que se avanza al dibujar la lnea es de dos (double step) existen slo cuatro opciones posibles que se muestran a continuacin:

De estos cuatro tipos de patrones solo dos de ellos pueden ocurrir simultneamente: patrn 1 y 2 (3) o patrn 2 (3) y 4 (donde 2(3) es abreviatura de patrn 2 o patrn 3). En este algoritmo double step las lneas sern clasificadas dependiendo de su pendiente m = dy/dx donde dx = xq xp y dy = yq yp.

ETN-903 SISTEMAS DE COMPUTACIN 10 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

En la figura se muestra la situacin antes de la iteracin i donde el pixel (xi-1 , yi-1 ) ha sido dibujado en la iteracin anterior.

Tras incrementar x por dos se quiere decidir cual de los pxeles L, M y U correspondientes a los patrones 1, 2(3) y 4 ser la mejor aproximacin de la lnea. Comentar tambin que la posibilidad de ocurrir un conjunto de patrones depende del valor de la pendiente, exactamente en dos casos, si dy/dx < o si dy/dx >= , comportndose de una manera u otra el algoritmo.

Un discriminador Di ser modificado en cada iteracin dependiendo de la direccin que x haya seguido. Este discriminador determina que patrn debe ser escogido. Pseudocodigo. pendiente < : incr1 = 4dy D1= incr1 dx, para i =1,2,... incr2 = 4dy 2dx

pendiente >= : incr1 = 4dy 2x D1= 4dy - 3dx, para i = 1,2, ... incr2 = 4(dy - dx)

ETN-903 SISTEMAS DE COMPUTACIN 11 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

4. Algoritmo para dibujar circunferencias(Basado en el algoritmo de Bresenham).

La misma lgica del algoritmo de Bresenham para dibujar lneas puede ser aplicada al crculo, que puede ser dibujado sin trigonometra y sin multiplicaciones, por eso se le suele conocer como algoritmo de Bresenham para dibujar crculos. La ecuacin de una circunferencia que tiene su centro en el punto (x0, y0) y de radio R es:
(x-x0)2 + (y-y0)2 = R2

Si suponemos que su centro es el origen de coordenadas, entonces la frmula queda as:


x2 + y2 = R2.

Las circunferencias son simtricas respecto de los ejes x, y de las lneas y=x, y=-x. De modo que basta dibujar los puntos de la circunferencia en su primer octante, el resto de puntos se calculan por simetra.

ETN-903 SISTEMAS DE COMPUTACIN 12 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

En el primer octante la y cambia ms rpidamente que la x, por lo que la incrementaremos siempre y buscaremos el valor de la x a partir de ella. Comenzaremos en el eje de las ordenadas en el sentido contrario a las agujas del reloj, decrementando la x cuando toque y incrementado siempre la y. Los puntos que dibujemos pueden cumplir o no la ecuacin de la circunferencia vista arriba, x2 + y2 = R2. En todo caso buscaremos el punto que diste lo mnimo posible del valor terico. Para ello definimos la funcin del error cometido:
Ei = xi2 + yi2 - R2

Partiendo de un punto (xi, yi) se trata de encontrar el valor del siguiente punto (xi+1, yi+1). Ya hemos dicho que siempre yi+1 = yi + 1 en nuestro primer octante. Tenemos que encontrar xi+1. Slo hay dos posibilidades: xi+1 = xi xi+1 = xi-1 Cogeremos uno u otro en funcin del menor error que origine, da igual que est dentro o fuera de la circunferencia. Por tanto, para calcular qu error es menor tendremos que elevarlo al cuadrado y compararlos. 1. (1) Supongamos que xi+1 = xi-1, entonces el error es: [(xi-1)2 + (yi+1)2 - R2]2 = [xi2 - 2xi + 1 + yi2 + 2yi + 1 - R2]2 = [xi2 + yi2 - R2 - 2xi + 2yi + 2]2 = [xi2 + yi2 - R2 + 2yi + 1]2 + (1 - 2xi)2 + 2(1 - 2xi)(xi2 + yi2 - R2 + 2yi + 1). 2. (2) Supongamos que xi+1 = xi entonces el error generado es: [xi2 + (yi+1)2 - R2]2 = [xi2 + yi2 + 2yi + 1 - R2]2 = [xi2 + yi2 - R2 + 2yi + 1]2. (1) < (2) <=> (1 - 2xi)2 + 2(1 - 2xi)(xi2 + yi2 - R2 + 2yi + 1) < 0 <=> (1 - 2xi)[(1 - 2xi) + 2(xi2 + yi2 - R2 + 2yi + 1)] < 0 <=> (1 - 2xi) + 2(xi2 + yi2 - R2 + 2yi + 1) > 0 si (1 - 2xi) < 0 <=> 2[(xi2 + yi2 - R2) + (2yi + 1)] + (1 - 2xi)> 0 Sean:

ETN-903 SISTEMAS DE COMPUTACIN 13 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO
RE = xi2 + yi2 - R2 XChange = 1 - 2xi YChange = 2yi + 1

Los valores iniciales sern X = R, Y = 0 y, por tanto, RE = 0, XChange = 1-2R, YChange = 1. Cmo cambian estas variables en funcin de su valor anterior cuando cambien X e Y: RE(i) = xi2 + yi2 - R2 YChange(i) = 2yi + 1 XChange(i) = 1 - 2xi Independientemente del valor de xi: YChange(i+1) = 2(yi+1) + 1 = 2yi + 2 + 1 = YChange(i) + 2. Siempre Si xi+1 = xi - 1 entonces: 2 2 2 2 2 2 2 o RE(i+1) = (xi+1) + (yi+1) - R = xi - 2xi + 1 + yi + 2yi + 1 - R = (xi + 2 2 yi - R ) + (2yi + 1) + (1 - 2xi) = RE(i) + YChange(i) + XChange(i) o XChange(i+1) = 1 - 2(xi - 1) = 1 - 2xi + 2 = XChange(i) + 2 Si xi+1 = xi entonces: 2 2 2 2 2 2 2 2 2 o RE(i+1) = xi + (yi + 1) - R = xi + yi + 2yi + 1 - R = (xi + yi - R ) + (2yi + 1) = RE(i) + YChange(i) o XChange(i+1) = 1 - 2xi = XChange(i) Por lo tanto:
RE(i+1) = RE(i) + YChange(i) [+ XChange(i)] YChange(i+1) = YChange(i) + 2 siempre XChange(i+1) = XChange(i) [+ 2]

Donde lo que hay entre corchetes se da slo en el caso en que xi+1 = xi - 1. Pseudocodigo.
; Valores iniciales X = R Y = 0 XChange = 1-2R YChange = 1 RE = 0 while x <= y DrawPoint(x,y) ; Para los 8 octantes Temp = 2(RE+YChange)+XChange Inc(Y) RE += YChange YChange += 2 if Temp > 0 inc(X) RE += XChange XChange += 2 endif endwhile

ETN-903 SISTEMAS DE COMPUTACIN 14 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

5. Algoritmo para dibujar circunferencias(basado en el algoritmo de Wu).

Este algoritmo sigue los mismos parmetros que el de dibujo por bresenham pero se debe tener cuidado en lo siguiente, dado que en este caso se asume que el centro del crculo est situado en el centro de coordenadas. Se analizar el proceso de dibujo slo en el primer octante, ya que los otros siete se deducen inmediatamente por el teorema de los 8 octantes. El punto de partida ser la interseccin de la figura con el eje vertical en el primer cuadrante P0 = (X0,Y0) = (0,R). El barrido de dibujo deber realizarse a travs del eje X. De este modo, en el siguiente paso, X1 = X0 + 1, y por lo tanto

Si se denomina al elemento constante aparecido en la ecuacin como la constante K, se tiene que

ETN-903 SISTEMAS DE COMPUTACIN 15 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

6. Algortimo de Rellenado de figuras delimitadas por pixeles(Algoritmo de Rellenado de lineas adyacentes). Podemos definir una regin como un grupo de pixels conectados en el bfer de vdeo delineados por algn tipo de lmite. 6.1 . Pixels del interior y del borde En este captulo slo trataremos aquellas regiones en que todos los pixels del borde tienen un valor especificado y los del interior pueden tener cualquier otro. En algunos casos podremos tomar los bordes de una regin fuera del rango de la pantalla del monitor 6.2.Conectividad Para distinguir los pixels del borde de los del interior, deberemos especificar las formas en que estn conectados. Este no es aspecto irrelevante, pues si permitimos que los pixels del borde puedan estar conectados tanto ortogonal como horizontalmente, no podremos permitir que los pixels del interior puedan estar conectados diagonalmente, porque entonces podran conectarse con pixels de fuera de la regin. Si los pixels del borde de la regin slo pueden estar conectados ortogonalmente, podremos permitir que los pixels del interior estn conectados tanto ortogonal como horizontalmente. Evidentemente, si los pixels del borde slo pueden estar conectados ortogonalmente, nos restringe el nmero de pasos y posibilidades a la hora de la bsqueda de los pixels constituyentes del borde de la regin. Consideramos el interior de la regin como un grupo de segmentos de lneas adyacentes que estn conectados verticalmente. La estrategia general es localizar cada grupo de pixels conectados horizontalmente en el interior de la regin. Este algoritmo parte de un pixel semilla conocido que est en el interior de la regin, barre a izquierda y derecha para encontrar el final de la fila, que pinta por completo. El algoritmo localiza todos los grupos de pixels conectados horizontalmente que son adyacentes verticalmente al grupo que se acaba de barrer. Cada vez que se encuentra un grupo adyacente de pixels no rellenado, una funcin de pintado de pixels es llamada recursivamente para pintarlo. El algoritmo termina cuando todos los pixels del interior han sido pintados. La estrategia general es localizar cada grupo de pixels conectados horizontalmente en el interior de la regin. Este algoritmo parte de un pixel semilla conocido que est en el interior de la regin, barre a izquierda y derecha para encontrar el final de la fila, que pinta por completo. El algoritmo localiza todos los grupos de pixels conectados horizontalmente que son adyacentes verticalmente al grupo que se acaba de barrer. Cada vez que se encuentra un grupo adyacente de pixels no rellenado, PintaLinAdj es llamado recursivamente para pintarlo. El algoritmo termina cuando todos los pixels del interior han sido pintados.

ETN-903 SISTEMAS DE COMPUTACIN 16 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

7 6 5 4 3 2 1 8

El pixel 1 se corresponde con el pixel semilla. Se busca a izquierda y a derecha todos los pixels adyacentes horizontalmente que no han sido dibujados previamente y se pintan. Posteriormente buscamos recursivamente hacia abajo el pixel adyacente y encontramos el nmero 2. A continuacin vamos hacia arriba y encontramos el punto 3, pintando la lnea entre los bordes, seguimos hacia arriba y encontramos el punto 4 pintando su lnea entre los bordes, as sucesivamente hasta encontrar el punto 7 y pintar su lnea entre los bordes. Volvemos a la posicin previa de la recursin y encontramos el pixel 8, dibujando su linea entre los bordes. Con lo que hemos terminado. 7. Comparacin Algoritmo de Bresenham vs. Double step Como se ver en los programas el algortimo de Bresenham es inferior al de Wu sin embargo el algoritmo de bresenham es menos engorroso y requiere de menos codigo aunque sea ms lento. En definitiva si de rapidez se habla el algoritmo de Wu es el ganador, pero se debe tomar en cuenta que el algoritmo de bresenham maneja solamente nmeros enteros por esto se convierte en uno de los favoritos de los programadores. Para muestra se elabor dos programas uno con el algoritmo de Wu y otro con el de Bresenham.

ETN-903 SISTEMAS DE COMPUTACIN 17 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

DISEO DEL PROGRAMA. 1. Flujograma programa con algoritmo Double Step de Wu


INICIO A

Se define el centro del reloj Se define el tamao del reloj Se define el color del reloj y sus agujas

Algoritmo de Double step para realizar el horero igual al minutero

Se dibuja un pixel en el centro

Se pone en modo video y se borra pantalla Para poner la configuracin inicial, titulo y los nmeros del reloj

Con el dato del segundero se traza una linea con el algoritmo de Double step

Presiona Cambio de tamao? Se inicia las variables correspondientes al centro de la circunferencia restando el tamao con el centro del reloj SI Se incrementa el valor de radio del reloj

NO

Se establecen los puntos externos calculando el coseno y el seno con el dato del radio y sacando mediante un bucle de restas para graficar la circunferencia

Se presiona cambio de color? Si Cambia el valor del dato de color para iniciarse en modo video

NO

Algoritmo de Double step Para dibujar la circunferencia dados todos los puntos NO

SI Se presiona Q?

Se obtiene la hora del sistema

ACTUALIZA Vuelve al DOS FIN

Con la hora del sistema se dibuja las 4 lineas que conforman el minutero formando un diamante de angulo 30 grados.

ETN-903 SISTEMAS DE COMPUTACIN 18 RELOJ ANALGICO ASSEMBLER 80X86 PABLO ZAMORA MERCADO

El flujograma para el programa de bressenham es el mismo sin contar el cambio de cualquier atributo al reloj.

IMPLEMENTACIN RELOJ con el Algoritmo de Wu

RELOJ con algoritmo de Bressenham

Você também pode gostar