Professional Documents
Culture Documents
3 Discretización de Primitivas
Grácas
Antes de iniciar este capítulo, vale la pena aclarar el concepto de
Primitiva Gráca: Se reere a las guras básicas de dibujo, a partir
de las cuales se realizan todas las demás. Estas guras básicas son
los puntos, los segmentos de rectas, círculos, elipses y polígonos.
Por otro lado, antes de comenzar con este capítulo, se sugiere hacer
un repaso de los temas de geometría analítica básica. Aquí sólo se
mencionarán las formas de las ecuaciones usadas en el resto del
libro, sin describirlas formalmente ya que se asume que el lector
ha aprobado algún curso básico de geometría analítica vectorial.
(x − x0 )2 + (y − y0 )2 = R2
yi+1 = mxi+1 + B
= m(xi + ∆x) + B
= mxi + m∆x + B
= m∆x + (mxi + B)
yi+1 = yi + m∆x
55
3 Discretización de Primitivas Grácas
F (x, y) = ax + by + c = 0 (3.1)
1
Entonces, tenemos que evaluar el signo de F (M ) = F xp + 1, yp + 2
para saber si M está arriba o abajo de la recta ideal.
P (xi+1 ) = mxi+1 + B
= m(xi + 1) + B
= (mxi + B) + m
P (xi+1 ) = P (xi ) + m
P (xi+1 ) − P (xi ) = m
58
3.4 Algoritmo de línea de punto medio
dinicial = F (M )
1 1
= F (x0 + 1, y0 + ) = a(x0 + 1) + b(y0 + ) + c
2 2
1
= ax0 + a + by0 + b + c
2
1
= ax0 + by0 + c + a + b
2
1
= (ax0 + by0 + c) + a + b
2
1
= F (x0, y0 ) + a + b; F (x0, y0 ) = 0
2
1
dinicial = a+ b
2
∆y
y = x+B
∆x
∆x · y = ∆y · x + ∆x · B
0 = ∆y · x − ∆x · y + ∆x · B
F (x, y) = ∆y · x − ∆x · y + ∆x · B = 0
por lo que:
a = ∆y
b = −∆x
c = ∆x · B
Tenemos entonces:
59
3 Discretización de Primitivas Grácas
∆E = F (xi+1 , yi ) − F (xi , yi ) = a = ∆y
∆NE = F (xi+1 , yi+1 ) − F (xi , yi ) = a + b = ∆y − ∆x
1
dinicial = a + 12 b = ∆y − ∆x
2
Pero esto nos fuerza a usar coma otante sólo por el valor inicial
de d. Todos los demás valores sucesivos son enteros...
∆y
y = x+B
∆x
∆y
2y = 2 x + 2B
∆x
2∆x · y = 2∆y · x + 2∆x · B
F (x, y) = 2∆y · x − 2∆x · y + 2∆x · B = 0 (3.3)
a = 2∆y
b = −2∆x
c = 2∆x · B
1
y volvemos a calcular los valores que nos interesan . Llegamos a:
Con esto hemos resuelto el problema del valor inicial otante para
d.
Ahora, el algoritmo usa exclusivamente artimética entera, sin el
costoso tiempo para hacer operaciones en coma otante.
1
Basta con repetir el proceso con la nueva ecuación F
60
3.4 Algoritmo de línea de punto medio
5 x = x0 , y = y0 ;
6
7 // Cuando ' horizontal ' es verdadero , el ciclo
iterará a través de x , sino , lo hará a través
de y
8 int horizontal = delta_y < delta_x ;
9
10 // Inicializaciones
11 if ( horizontal ) {
12 d = ( delta_y *2) - delta_x ;
13 delta_E = delta_y *2;
14 delta_NE = ( delta_y - delta_x ) *2;
15 } else {
16 d = ( delta_x *2) - delta_y ;
17 delta_E = delta_x *2;
18 delta_NE = ( delta_x - delta_y ) *2;
19 }
20
21 // Dibujar el primer pixel
22 marcarPixel (x , y ) ;
23 if ( horizontal )
24 while ( x < x1 ) { // Iterar a través de x
25 if (d <=0)
26 d += delta_E ;
27 else {
28 y ++;
29 d += delta_NE ;
30 }
31 x ++;
32 marcarPixel (x , y ) ;
33 }
34 else
35 while ( y < y1 ) { // Iterar a través de y
36 if (d <=0)
37 d += delta_E ;
38 else {
39 x ++;
40 d += delta_NE ;
41 }
42 y ++;
43 marcarPixel (x , y ) ;
44 }
45 }
Llegamos a lo siguiente :
2
0 1
1
d = F xp − 1, yp − 2 = a (xp − 1) + b yp − +c
2
∆O = −2∆y = −∆E
∆SO = −2∆y + 2∆x = −∆N E
0
dinicial = −2∆y + ∆x = −dinicial
2
La demostración de esto se deja como ejercicio
3
tal como lo hizo el autor de este libro
63
3 Discretización de Primitivas Grácas
45 }
46 y += dir_y ;
47 marcarPixel (x , y ) ;
48 }
49 }