Está en la página 1de 8

Pg.

ALGORITMOS PARA EL TRAZADO DE CIRCUNFERENCIAS


1. ALGORITMO BASADO EN LA ECUACIN DEL CRCULO.
y

(xc , yc )
r

(x - xc)2 + (y - yc)2 = r2 Esta ecuacin se simplifica suponiendo que el crculo est centrado en el origen de las coordenadas. A partir de la ecuacin de la circunferencia simplificada se pueden calcular los puntos del crculo mediante la siguiente ecuacin: = ( 2 + 2 ) Donde a partir de incrementos unitarios de la coordenada x se puede obtener los valores de y, de forma que el par (x, y) es un punto perteneciente al permetro del circulo. Algoritmo. Void circuloEcuacion(int r) { for(int x=0 ; x<=r ; x++) { = ( 2 + 2 ); x1=x; y2=y1* (-1); x2=x1 *(-1); setpixel(x1 , round(y1)); setpixel(x1 , round(y2)); setpixel(x2 , round(y1)); setpixel(x2 , round(y2)); } }
INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 2

Corrido manual.

-7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7

-6

-5

-4

-3

-2

-1

Para una circunferencia de radio (r= 5) si x = 0 y1= 25 0 = 5 y2=-5 si x = 1; x = -1 y1= 25 1 = 4,89 y2=-4,89 si x = 2; x = -2 y1= 25 4 = 4,58 y2=-4,58 si x = 3; x = -3 y1= 25 9 = 4 y2=-4
INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 3

si x = 4; x = -4 y1= 25 16 = 3 y2=-3 si x = 5; x = -5 y1= 25 25 = 0 y2=0

SIMETRA DE OCHO PUNTOS. Se puede aprovechar la simetra del crculo para slo calcular uno de los 8 segmentos de 45 y luego con ste determinar los dems octantes. La siguiente figura y procedimiento resumen el proceso:

(-x , y) (-y , x)

(x , y) (y , x)

(-y ,-x) (-x ,- y) (x ,- y)

(y , -x)

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 4

Algoritmo. void circuloSimetria(int r) { for(int x=0 ; x<=r ; x++) { = ( 2 + 2 ); x1=x; y2=y1* (-1); x2=x1 *(-1); setpixel(x1 , round(y1)); setpixel(x1 , round(y2)); setpixel(x2 , round(y1)); setpixel(x2 , round(y2)); } }

2. ALGORITMO DDA PARA EL TRAZADO DE CRCULOS. Partiendo de la ecuacin de la circunferencia, y derivando:

x2 + y2 = r2
Se obtiene su ecuacin diferencial. = Como en el caso de las rectas, este mtodo evala la ecuacin diferencial a intervalos finitos. Debe encontrar una secuencia de puntos de la pantalla (X0 , Y0), (X1 , Y1),..., (Xn , Yn) que formen el arco de circunferencia. Entonces si tengo un punto de la discretizacin (Xk , Yk), debe ser: Xk+1 = Xk - Yk Yk+1 = Yk + Xk Aqu no es constante. Con esta forma de determinar los puntos de la discretizacin resulta: + 1 = + 1

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 5

Por lo tanto evala la ecuacin diferencial a intervalos finitos. El valor de e determina la frecuencia de muestreo, si es muy pequeo, el cmputo ser redundante y si es muy grande los puntos estarn muy separados. El valor que se elige es x=1. El algoritmo empieza en el pixel P=(r,0) Algoritmo. void circuloDDA(int radio) { rx=radio; x=round(rx); while(y<=x) { setPixel(x,y); setPixel(y,x); setPixel(-x,y); setPixel(-y,x); setPixel(x,-y); setPixel(y,-x); setPixel(-x,-y); setPixel(-y,-x); rx=rx-y/rx; x=round(rx); y = y + 1; } }

3. ALGORITMO BRESENHAM DE DIBUJO DE CRCULOS. Este algoritmo considera la discretizacin del segmento de crculo de 45 correspondiente a x=0 hasta x=y=R/21/2, los dems puntos se pueden dibujar con la funcin puntosCirculo. Esta funcin se basa en aprovechar la simetra del crculo para slo calcular uno de los 8 segmentos de 45 y luego con ste determinar los dems octantes. La siguiente figura y procedimiento resume el proceso.

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 6

(-x, y)

(x, y)

(-y, x)

(y, x)

(-y, -x)

(y, -x) (-x, -y)

(x, -y)

void puntosCirculo(int x,int y) { setPixel(x, y);setPixel(y, x); setPixel(y, -x); setPixel(x, -y); setPixel(-x, -y);setPixel(-y, -x); setPixel(-y, x); setPixel(-x, y); } Ya en la implementacin del algoritmo. Sea P, el pixel elegido previamente en (xp, yp); E y SE los pixeles candidatos. Como podr apreciar en la siguiente figura.

E M SE

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 7

Y tomando en cuenta la ecuacin de la circunferencia. , = 2 + 2 2 Y sabiendo que cualquier punto (x, y) en el permetro del circulo con distancias correspondientes al radio satisface la ecuacin f(x, y)=0. Si el punto se encuentra dentro de la elipse, se dice que la funcin es negativa, si se encuentra en el exterior es positiva, tal como se muestra a continuacin.
< 0, si (x, y ) est dentro del permetro f(x, y) = = 0, si (x, y) est en el permetro >0, si (x, y) est fuera del permetro

Se define la variable de decisin d en el punto medio entre E y SE. = + 1, 1 1 = ( + 1)2 + ( )2 2 2 2

Si d < 0 se escoge E y la variable de decisin dnueva ser: = + 2, 1 = + 2 2


2

1 + ( )2 2 2

Lo cual da que la diferencia incremental es: = + 2 + 3 Por lo tanto se define el incremento por: = 2 + 3 Si d>0 se elije SE y la variable de decisin dnueva ser: 3 = + 2, = + 2 2
2

3 + 2

Lo cual da que la diferencia incremental es: = + 2 2 + 5 Por lo tanto, el incremento est dado por: = 2 2 + 5

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

Pg. 8

Es decir, en este caso los valores de son variables que dependen de los puntos seleccionados ( , ) en la iteracin previa. El clculo de la condicin inicial debe considerar que el punto de partida del circulo en (0,r), por lo tanto, el siguiente punto medio estar en (1, 2). Lo que es: 1, 1 5 = 2 4
1

Considerando todo lo mencionado, el algoritmo queda de la siguiente manera: void circuloBresenham(int radio) { x=0; y=radio; 5 d=4 ; puntosCirculo(x,y); while(y>x) { if(d<0) { = + 2 + 3; x+=1; } else { = + 2 2 + 5; x+=1; y-=1; } puntosCirculo(x,y); } }

INGENIERA INFORMTICA PROGRAMACIN GRFICA GRUPO # 2

También podría gustarte