Ok, gracias por la sugerencia, pero lo del arreglo de colores así lo quiere la maestra, se supone que guarda lo que le usuario va dibujando para después volver a re dibujar, vendría siendo algo como glutPostRedisplay(), la maestra no quiere que utilicemos nada definido de OpenGL, quiere que todo lo hagamos nosotros pero ya que, gracias por tu consejo, voy a intentar lo que me dices.
UPDATE: Ya arregle el error ya pinta los circulos, aquí les dejo el código para que lo vean:
[code]#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
//Coordenadas para dibujar la Circunferencia
int xc = 0;
int yc = 0;
int radio = 0;
GLsizei winWidth = 640, winHeight = 480; //Define le Tamaño inicial de ventana de la aplicacion
int colores[640 * 480]; //Arreglo que guarda los colores de la pantalla Deacuerdo a la definición de la pantalla, en este caso 640 * 480
int pinto = 0; //Bandera que me indica que se pinto una Linea
/*Se pintan los pixels deacuardo a los parámetros Obtenidos por el Algoritmo de Trazado de Circunferencias*/
void Pintar_Pixel(int x, int y)
{
glColor3f(0.0, 1.0, 1.0);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
//Funcion, que pinta los pixeles de la circunferencia por medio de la simetría
void Simetria( int xc, int yc, int x, int y)
{
Pintar_Pixel( xc + x, yc + y);
Pintar_Pixel( xc - x, yc + y);
Pintar_Pixel( xc + x, yc - y);
Pintar_Pixel( xc - x, yc - y);
Pintar_Pixel( xc + y, yc + x);
Pintar_Pixel( xc - y, yc + x);
Pintar_Pixel( xc + y, yc - x);
Pintar_Pixel( xc - y, yc - x);
}
//Funcion que dibuha la circunferencia, que partimnos, esta en el origen 0,0 para posteriormente trasladarla a su pocisión original
void Circunferencia(int xc, int yc, int radio)
{
int pd = 0, x = 0, y = 0;
//Se pinta el primer punto, que esta en la coordenada x = 0, y =radio, partimos del origen
x = 0;
y = radio;
Simetria(xc, yc, x, y);
pd = 1 - radio;
while(x < y)
{
if(pd < 0)
{
x++;
pd += + 2 * x + 1;
}
else
{
x++;
y--;
pd += 2 * (x -y) + 1;
}
Simetria(xc, yc, x, y);
}
}
//Funcion que procesa las coordenadas obtenidas por el mause en movimiento y dibuja la linea de bresenham, mientras este en movimiento, mientras haya eventos
void processMouseActiveMotion( int x, int y )
{
if(pinto == 1) //Bandera que indica que se pinto una Circunferencia
{
glDrawPixels(winWidth, winHeight, GL_RGB, GL_UNSIGNED_BYTE, colores); // Se dibujan las circunferencias que se guardaron antes
x = x;
y = winHeight-y;
radio = sqrt((x - xc) * (x - xc) + (y - yc) * (y - yc));
Circunferencia( xc, yc, radio ); //Traza la Circunferencia, que el usuario esta dibujando con el mouse
glEnd();
glFlush(); //Procesa la pantalla
}
}
//Función que procesa el mause cuándo se inicializa la aplicación
void processMouse( int boton, int estado, int x, int y )
{
if(boton==GLUT_LEFT_BUTTON && estado==GLUT_DOWN) //Si se presiono el click izquierdo y esta sumido
{
pinto = 1; //Me indica que pinto una Circunferencia y se inicializan las coordenadas x, y
xc = x;
yc = winHeight-y;
}
if( boton==GLUT_LEFT_BUTTON && estado==GLUT_UP )
{
glReadPixels(0, 0,winWidth, winHeight, GL_RGB, GL_UNSIGNED_BYTE, colores); //Se leen los pixeles de como quedo la pantalla depues de pintarla
}
if (boton == GLUT_RIGHT_BUTTON && estado == GLUT_DOWN )
pinto = 0;
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT); // visualización del color asignado a la ventana
glReadPixels(0, 0, winWidth, winHeight, GL_RGB, GL_UNSIGNED_BYTE, colores); //Lee los colores iniciales de la pantalla
glEnd();
}
//Inicializacion de los atributos de la ventana
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); // se establece el color de la ventana de visualización (blanco)
glMatrixMode(GL_PROJECTION); // proyección ortogonal en una zona rectangular bidimensional
gluOrtho2D(0.0, GLdouble (winWidth) , 0.0, GLdouble(winHeight)); // Sistema de coordenas de referencia de 0 a winWidth=640 para x, y de 0 a winHeight=480; para y
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); // inicialización de GLUT
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // único búfer de refresco en la ventana de visualización y el modo de color RGB
glutInitWindowPosition(50, 100); // posición inicial de la ventana, esquina superior izquierda en el monitor
glutInitWindowSize(winWidth, winHeight); // alto y ancho en pixeles, de la ventana
glutCreateWindow("Trazado de Circunferencias"); // creación de ventana de visualización y asigna el título
init(); // función que inicialia la ventana
glutMouseFunc( processMouse ); //Se añaden aquí los callbacks de procesado del ratón
glutMotionFunc( processMouseActiveMotion ); //Procesa los movimientos del mause
glutDisplayFunc(display); // No puede conterner funciones con parámetros
glutMainLoop(); // bucle infinito que comprueba entrada de dispositivos
return EXIT_SUCCESS;
}[/code]