Explicación Del Algoritmo de Bresenham
Explicación Del Algoritmo de Bresenham
Explicación 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<=x1 (es decir que mientras se recorre el ciclo el valor del punto inicial debe
terminar justo en el valor del punto final) que se ejecute las siguientes condiciones y
acciones:
Si parmetro de decisin di<0 entonces di= di+2Dy;
Si no se cumple de esta manera entonces y=y+1, di=2Dy-2Dx.
Ademas x=x+1 a cada iteracin y al cumplimiento de las condiciones se dibujar el
punto (x,y) con una funcin que se llame drwa(x,y)., donde sta parte del algoritmo es
una toma decisin hacia el pixel ms cercano.
do
{
if(di<0)
{
di=di+(2*Dy);
}
else
{
di=di+((2*Dy)-(2*Dx));
y=y+1;
}
x=x+1;
glBegin(GL_POINTS);
draw(x,y);
}while(x<=x1);
glFlush();
}
int main ( int argc, char ** argv )
{
glutInit ( &argc, argv);
glutInitDisplayMode(GLUT_SINGLE |
GLUT_RGBA);
glutInitWindowPosition(10,100);
glutInitWindowSize(300,300);
glutCreateWindow("Bresenham");
int x0=1,y0=2,x1=13,y1=9;
int Dx=x1-x0;
int Dy=y1-y0;
init();
glutDisplayFunc(Bresenham);
glutMainLoop();
}
#include<GL/glut.h>
#include <stdio.h>
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;
do
{
if(di<0)
{
di=di+(2*Dy);
}
else
{
di=di+((2*Dy)-(2*Dx));
y=y+1;
}
x=x+1;
glBegin(GL_POINTS);
draw(x,y);
}while(x<=x1);
glFlush();
}
int main ( int argc, char ** argv )
{
glutInit ( &argc, argv);
glutInitDisplayMode(GLUT_SINGLE |
GLUT_RGBA);
glutInitWindowPosition(10,100);
glutInitWindowSize(300,300);
glutCreateWindow("Bresenham");
init();
glutDisplayFunc(Bresenham);
glutMainLoop();
}
) (dnde el
para crear un octante de un circulo y los cuales son 8 puntos simtricos como se muestra
en la siguiente imagen:
Si pi>0
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
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();
}
#include<GL/glut.h>
#include <stdio.h>
while(x<=y)
{
dibujaoctantes(x,y);
if(p>0)
{
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();
}