Explicación Del Algoritmo de Bresenham
Click here to load reader
description
Transcript of Explicación Del Algoritmo de Bresenham
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
Explicacin del Algoritmo de Bresenham
1.- Se reciben los enteros x0,y0,x1,y1, los cuales son los pertenecientes a los pares
ordenados que corresponden al punto inicial (x0,y0) y al punto final (x1,y1).
2.- Se obtienen las constantes: Dx= x1-x0, Dy=y1-y0, 2Dy, 2Dy-Dx, donde Dy y Dx son
aquellos valores correspondientes a la pendiente de la recta donde ;
los valores de 2Dy y Dx son valores que se obtienen para poder definir un parmetro de
decisin.
3.- El parmetro de decisin di=2Dy-Dx, posteriormente definimos a x=x0 y a y=y0, esto
con fines de referencia al mandarse a llamar desde una funcin que dibuje dichos puntos
posteriormente atreves del algoritmo.
4.- Mientras x
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
Implementacin del lgoritmo de Bresenham para Lineas discretizadas:
#include #include int positivo(int a) { return a*(-1); } void draw(int ix, int iy) { glBegin(GL_POINTS); glVertex2i( ix, iy); glEnd(); } void init (void) { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 200.0, 0.0, 200.0); } void Bresenham(void) { glClearColor(0.0, 0.0, 0.0, 0.0 ); glClear(GL_COLOR_BUFFER_BIT); /*que inicie en el punto 0,0 y finalice en el punto 10,10 */
int x0=1,y0=2,x1=13,y1=9; int Dx=x1-x0; int Dy=y1-y0; int di= (2*Dy)-Dx; int x=x0; int y=y0; int absDx=positivo(Dx); if(Dy
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
#include #include int positivo(int a) { return a*(-1); } void draw(int ix, int iy) { glBegin(GL_POINTS); glVertex2i( ix, iy); glEnd(); } void init (void) { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 0.0, 0.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 200.0, 0.0, 200.0); } void Bresenham(void) { glClearColor(0.0, 0.0, 0.0, 0.0 ); glClear(GL_COLOR_BUFFER_BIT); /* que inicie en el punto 0,0 y finalice en el punto 10,10 */ int x0=0,y0=0,x1=10,y1=10; int Dx=x1-x0; int Dy=y1-y0; int di= (2*Dy)-Dx; int x=x0; int y=y0; int absDx=positivo(Dx); if(Dy
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
Principios Geomtricos aplicados en Algoritmo de Bresenham para circunferencias:
Se basa en un ciclo que inicia en (0,r) y termina en ( ) (dnde el y )
para crear un octante de un circulo y los cuales son 8 puntos simtricos como se muestra
en la siguiente imagen:
Ecuacin polinomial cuadrada (reducida) de la circunferencia
El tipo de coordenadas utilizadas para este caso son las cartesianas.
r2 = x2 + y2
Explicacin del Algoritmo de Bresenham para circunferencias
En este algoritmo se calculan los puntos de 0 a 45, el cual aprovecha la simetra de la
circunferencia para obtener el trazado del resto de los puntos. Est basado en la ecuacin
de la recta polinomial de segundo grado.
Se toman dos posibles valores: De x=0 a x=
A(xi+1, yi) o B(xi+1, yi-1)
r2 = (xi+1)2 + y2
y2 = r2 - (xi+1)2
d(a)= yi2 - y2
d(b)= y2 (yi -1)2
d(a)= yi2 r2 + (xi+1)
2
d(b)= r2 - (xi+1)2 (yi -1)
2
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
Si la distancias hacia algunos puntos candidatos es igual a 0, el punto est sobre la
circunferencia, sino es lo anterior, toma el punto ms cercano:
P1 = d(a) d(b)
P1 = yi2 r2 + (xi+1)
2 - r2 + (xi+1)2 + (yi -1)
2
P1 = 2(xi+1)2 + yi
2 + (yi -1)2 2r2
Si el punto inicial es x=0, y=r
Pi = 2(0+1)2 + r2 + (r -1)
2 2r2
Pi = 2 + r2 + (r -1)
2 2r2
Pi = 2 + r2 + r2 2r +1
2r2
Pi = 3 - 2r
Si el valor de Pi < 0
xi+1=xi+1 y i+1=y i
r2 = (xi+1)2 + (y i)
2
p i+1 = pi + 4xi + 6
Si el valor de Pi >= 0
xi+1=xi+1 y i+1=y i - 1
r2 = (xi+1)2 + (y i - 1)
2
p i+1 = pi + 4(xi - y i)+ 10
1. seleccionar como punto inicial la coordenada (0, r) donde r = radio
2. calcular el primer parmetro como:
P=3-2r
3. incrementando x en pasos unitarios, calcular cada parmetro sucesivo de pi+1 a partir
de los siguientes:
Si pi0
si si y i+1=y i - 1
p i+1 = pi + 4(xi - y i)+ 10
4. repetir paso 3 hasta que x sea mayor o igual que y
Para dibujar la circunferencia, aplicar la simetra de la circunferencia para los siete puntos
restantes, en los clculos se obtiene el primer punto(x, y), por lo que bastara que se
vayan intercambiando estas dos coordenadas, al igual que sus signos
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
algoritmo circulo_Bresenham(entero xc, entero yc, entero r)
inicio
entero p, x, y
x=0
y=r
p=3-2*r
mientras (x
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
Implementacin del Algoritmo de Bresenham para circunferencias:
#include #include void dibujaoctantes(int ix, int iy) { glBegin(GL_POINTS); glVertex2i(ix, iy); //Octante a 45 glVertex2i(-ix, -iy);//Octante a 90 glVertex2i(-ix, iy);//Octante a 135 glVertex2i(ix, -iy);//Octante a 180 /*Puntos de simetra*/ glVertex2i(iy,ix);//Octante a 225 glVertex2i(-iy,-ix);//Octante a 270 glVertex2i(-iy,ix);//Octante a 315 glVertex2i(iy,-ix);//Octante a 360 glEnd(); } void init (void) { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 1.0, 1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 200.0, 0.0, 200.0); } void Bresenhamcir(void) { glClearColor(0.0, 0.0, 0.0, 0.0 ); glClear(GL_COLOR_BUFFER_BIT); /* circulo de radio 10 */ int r=10; int x=0; int y=r; int p=3-(2*r);
while(x0) { y=y-1; p=p+(4*(x-y))+10; } else { p=p+(4*x)+6; } x=x+1; } if (x=y) { dibujaoctantes(x,y); } glFlush(); } int main(int argc, char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(300,300); glutInitWindowSize(300,300); glutCreateWindow("Bresenham"); init(); glutDisplayFunc(Bresenhamcir); glutMainLoop(); }
-
Miranda Hernndez Marco Antonio Graficacin Por Computadora
#include #include void dibujaoctantes(int ix, int iy) { glBegin(GL_POINTS); glVertex2i(ix, iy); //Octante a 45 glVertex2i(-ix, -iy);//Octante a 90 glVertex2i(-ix, iy);//Octante a 135 glVertex2i(ix, -iy);//Octante a 180 /*Puntos de simetra*/ glVertex2i(iy,ix);//Octante a 225 glVertex2i(-iy,-ix);//Octante a 270 glVertex2i(-iy,ix);//Octante a 315 glVertex2i(iy,-ix);//Octante a 360 glEnd(); } void init (void) { glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(1.0, 1.0, 1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 200.0, 0.0, 200.0); } void Bresenhamcir(void) { glClearColor(0.0, 0.0, 0.0, 0.0 ); glClear(GL_COLOR_BUFFER_BIT); /* circulo de radio 5 */ int r=5; int x=0; int y=r; int p=3-(2*r);
while(x0) { y=y-1; p=p+(4*(x-y))+10; } else { p=p+(4*x)+6; } x=x+1; } if (x=y) { dibujaoctantes(x,y); } glFlush(); } int main(int argc, char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowPosition(300,300); glutInitWindowSize(300,300); glutCreateWindow("Bresenham"); init(); glutDisplayFunc(Bresenhamcir); glutMainLoop(); }