Bresenham_Circulo.c



// ALGORITMO DE BRESENHAM PARA EL TRAZO DE UN CIRCULO

#include <GL/glut.h>
#include <stdio.h>

float colores[7][3]={1.,1.,1.,1.,0.,0.,0.,1.,0.,0.,0.,1.,0.,1.,1.,1.,0.,1.,1.,1.,0.};

void setPixel(int, int);
void circulo(int, int, int);
void EnCuadrantes(int, int);

void circulo(int Radio, int x, int y)
{
	float p=0;								// VALOR INICIAL DEL PARAMETRO DE DESICION
	int xc, yc,CX, CY;							//  xc, yc coordenadas del circulo
											// CX, CY terminos para el calculo del parametro de desicion

	xc = 0; yc = Radio;							// coordenadas iniciales
	EnCuadrantes(xc, yc);						// Coloca los puntos en los 8 octantes
	p = 1 - Radio;								// Es con enteros. Valor inicial del parametro de desicion
	CX = 2 * xc;
	CY = 2 * yc;

	while (xc < yc)							// Se repite hasta que xc >= yc
	{
		if  (p  < 0) { xc +=1; p += CX + 1; }
		else { xc += 1; yc -= 1; p += CX + 1 - CY; }
		CX = 2*(xc+1); CY = 2*yc;
		EnCuadrantes(xc, yc);
		x += xc; y += yc;
	}
}

void EnCuadrantes(int x, int y)		// Primer punto (xc, yc)
{
		setPixel(x, y); setPixel(y, x);		// CUADRANTE 1
		setPixel(-y, x); setPixel(-x, y);		// CUADRANTE 2
		setPixel(-x, -y); setPixel(-y, -x);		// CUADRANTE 3
		setPixel(y, -x); setPixel(x, -y);		// CUADRANTE 4
}

void setPixel(int x, int y)
{
        glBegin(GL_POINTS);
		glColor3f(1,0,0); glVertex3f(x,y,0);
	glEnd();
	glFlush();
}

void init(void)                                        
{
   glEnable (GL_POINT_SMOOTH);
   glHint (GL_POINT_SMOOTH_HINT, GL_DONT_CARE);
}

void display(void)
{
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-100, 100, -100, 100);
	glMatrixMode(GL_MODELVIEW);
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 0.0);
	glBegin(GL_LINES);
		glColor3f(1,1,0);
                glVertex3f(-50,0,0); glVertex3f(50,0,0);
		glVertex3f(0,-50,0); glVertex3f(0,50,0);
	glEnd();
	circulo(50, 0, 0);		// (radio, x, y)
}

void mouse(int Boton, int Estado, int x, int y)
{
	if (Boton==GLUT_LEFT_BUTTON && Estado==GLUT_DOWN)
	{
	}
}

void Medio(int id)
{
	glColor3f(colores[id][0], colores[id][1], colores[id][2]);
}


int main(int argc, char** argv)
{
	glutInit(&argc, argv);				// Inicializa la libreria auxiliar GLUT
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);	// Inicializa el modo de visualizacion
	glutInitWindowSize (500, 500);		// Indica el tamano de la ventana (ancho,alto)
	glutInitWindowPosition (20, 20);	// Indica la posiciOn inicial (xmin,ymin)
	glutCreateWindow ("Algoritmo del punto medio para el circulo");		// Abre la ventana con el tItulo indicado
	glutDisplayFunc(display);	// Indica cual es la funciOn de dibujo
	glutCreateMenu(Medio);
		glutAddMenuEntry("Blanco", 0);
		glutAddMenuEntry("Rojo", 1);
	glutAttachMenu(GLUT_MIDDLE_BUTTON);
	glutMouseFunc(mouse);
	init();
	glutMainLoop();	


}