Pág. 1
ALGORITMOS PARA EL TRAZADO DE CIRCUNFERENCIAS 1. ALGORITMO BASADO EN LA ECUACIÓN DEL CÍRCULO. y
(xc , yc ) r
x 2
2
2
(x - x c) + (y - y c) = r
Esta ecuación se simplifica suponiendo que el círculo está centrado en el origen de las coordenadas. A partir de la ecuación de la circunferencia simplificada se pueden calcular los puntos del círculo mediante la siguiente ecuación:
= ± ( + ) 2
2
Donde a partir de incrementos incrementos unitarios unitarios de la coordenada coordenada x se puede obtener obtener los valores de y, de forma que el par (x, y) es un punto perteneciente al perímetro 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 , setpixel(x1 , setpixel(x2 , setpixel(x2 ,
round(y 1)); round(y 2)); round(y 1)); round(y 2));
} }
INGENIERÍA INFORMÁTICA – INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRÁFICA GRUPO GRUPO # 2
Pág. 2
Corrido manual.
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7
Para una circunferencia de radio (r= 5) si x = 0
− 0 = 5
y1= 25 y2=-5
si x = 1; x = -1
− 1 = 4,89
y1= 25
y2=-4,89 si x = 2; x = -2
− 4 = 4,58
y1= 25
y2=-4,58 si x = 3; x = -3
− 9 = 4
y1= 25 y2=-4
INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
7
Pág. 3
si x = 4; x = -4
− 16 = 3
y1= 25 y2=-3
si x = 5; x = -5
− 25 = 0
y1= 25 y2=0
SIMETRÍA DE OCHO PUNTOS. Se puede aprovechar la simetría del círculo para sólo calcular uno de los 8 segmentos de
45º
y luego con éste determinar los demás octantes. La siguiente figura y
procedimiento resumen el proceso:
-x ,
(x , y) (y , x)
(-y , x)
(y , -x)
- ,-x
(-x ,- y)
x ,-
INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
Pág. 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 , setpixel(x1 , setpixel(x2 , setpixel(x2 ,
round(y1)); round(y2)); round(y1)); round(y2));
} }
2. ALGORITMO DDA PARA EL TRAZADO DE CÍRCULOS. Partiendo de la ecuación de la circunferencia, y derivando: 2
2
2
x +y =r Se obtiene su ecuación diferencial.
= − Como en el caso de las rectas, este método evalúa la ecuación 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 discretización (X k , Yk), debe ser: Xk+1 = Xk - Yk Yk+1 = Yk + Xk
Aquí no es constante. Con esta forma de determinar los puntos de la discretización resulta:
+ 1 − = − + 1 − INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
Pág. 5
Por lo tanto evalúa la ecuación diferencial a intervalos finitos. El valor de e determina la frecuencia de muestreo, si es muy pequeño, el cómputo será redundante y si es muy grande los puntos estarán 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 CÍRCULOS. Este algoritmo considera la discretización del segmento de círculo de 45° correspondiente a x=0 hasta x=y=R/2
1/2
, los demás puntos se pueden dibujar con la
función puntosCirculo. Esta función se basa en aprovechar la simetría del círculo para sólo calcular uno de los 8 segmentos de 45° y luego con éste determinar los demás octantes. La siguiente figura y procedimiento resume el proceso.
INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
Pág. 6
y
(-x, y)
(x, y)
- ,x
,x
(-y, -x)
, -x
-x, -
x
(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 implementación 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
INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
Pág. 7
Y tomando en cuenta la ecuación de la circunferencia.
, = + − 2
2
2
Y sabiendo que cualquier punto (x, y) en el perímetro del circulo con distancias correspondientes al radio satisface la ecuación f(x, y)=0. Si el punto se encuentra dentro de la elipse, se dice que la función es negativa, si se encuentra en el exterior es positiva, tal como se muestra a continuación. < 0, si (x, y ) está dentro del perímetro f(x, y) =
= 0, si (x, y) está en el perímetro >0, si (x, y) está fuera del perímetro
Se define la variable de decisión d en el punto medio entre E y SE.
= + 1, − 12 = ( + 1)
2
+(
− 12) − 2
2
Si d < 0 se escoge E y la variable de decisión d nueva será:
= + 2, − 12 = + 2
2
+(
− 12) − 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 decisión d nueva será:
3
3
2
= + 2, − 2 = + 2 + − 2 − 2
Lo cual da que la diferencia incremental es:
= + 2 − 2 + 5 Por lo tanto, el incremento está dado por:
∆ = 2 − 2 + 5 INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2
2
Pág. 8
Es decir, en este caso los valores de puntos seleccionados (
∆ ∆ son variables que dependen de los
, ) en la iteración previa.
El cálculo de la condición inicial debe considerar que el punto de partida del circulo en (0,r), por lo tanto, el siguiente punto medio estará en (1,
−
1 2
). Lo que es:
1, − 12 = 54 − 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); }
−
}
INGENIERÍA INFORMÁTICA – PROGRAMACIÓN GRÁFICA GRUPO # 2