Duda Open GL

Bueno acudo a ustedes con la siguiente, duda, estoy trazando círculos con el algoritmo de punto medio de OpenGl, estoy utilizando el codeBlocks y GLUT, el caso es que cuándo, intento trazar un círculo con le mouse este simplemente no se dibuja, espero que me puedan ayudar, les adjunto el código:


#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 + x, yc + y);
Pintar_Pixel( xc - x, yc + y);
Pintar_Pixel( xc + x, yc - y);
Pintar_Pixel( xc - x, yc - y);
}

//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

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 )
{
xc = x;
yc = winHeight-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
x = x;
y = winHeight-y;

radio = sqrt((x - xc) * (x - xc) + (y - yc) * (y - yc));
}

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;
}
Primero un consejo, usa las etiquetas [code] , sino el código fuente no se entiende nada. Viendo por encima el código estás intentando dibujar la figura desde el callback de movimiento del mouse y leyendo los pixels de la pantalla desde la función donde deberias hacer el dibujado ¬_¬ , hasta que no arregles eso no esperes ver algo en pantalla. Si necesitas eventos de actualización de pantalla luego de mover el mouse, puedes llamar a glutPostRedisplay().

P.D.: el mega-arreglo de colores lo veo innecesario ya que solo lo guardas y lo vuelves a mostrar y no lo utilizas para almacenar algo en especifico.
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]
2 respuestas