• Sábado 14 de Diciembre de 2024, 20:42

Autor Tema:  Teclado  (Leído 1615 veces)

kingston

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Teclado
« en: Miércoles 17 de Enero de 2007, 02:57 »
0
He hecho un programita que reproduce 6 letras tal y como las he escrito antes en un papel mediante curvas de bezier, pero tengo un problema. Estas letras deberían aparecer en pantalla confome yo vaya pulsando esas letras en el teclado, pero no se como hacerlo... ¿alguien me podría ayudar?

Aki os dejo el codigo para las letras G y E...



void Dibuja_Puntos (wcPt3D bezCurvePt)
{
   glColor3f (1.0, 0.0, 0.0); // Establece el color de los puntos en rojo.
   glPointSize (3); // Establece el tamaño de los puntos
   glBegin (GL_POINTS); // Comienza a dibujar puntos
      glVertex2f (bezCurvePt.x, bezCurvePt.y); // Dibuja el punto en la coordenada establecida
   glEnd ( );
}


void Dibuja_Puntos_Control(wcPt3D ctrlPts [3])
{
   glColor3f (0.0, 0.0, 1.0);   // Establece el color de los puntos en azul
   glPointSize (5); // Establece el tamaño de los puntos de control
   glBegin (GL_POINTS); // Comienza a dibujar puntos
      for(int i=0; i<3;i++)
         glVertex2f (ctrlPts .x, ctrlPts .y); // Dibuja el punto en la coordenada establecida
   glEnd ( );

   glBegin (GL_LINE_STRIP); // Comienza a dibujar una polilinea
      for( i=0; i<3;i++)
         glVertex2f (ctrlPts .x, ctrlPts .y); // Dibuja el punto en la coordenada establecida de la polilinea
   glEnd ( );
      glFlush();
}

// Calcula los coeficientes binomiales C para un valor dado de n.

void binomialCoeffs (GLint n, GLint * C)
{
   GLint k, j;

   // Compute n!/(k!(n   k)!)
   for (k = 0; k <= n; k++)
   {
      C [k] = 1;
      for (j = n; j >= k + 1; j--)
         C [k] *= j ;
      for (j = n - k;   j >= 2;   j--)
         C [k] /= j ;
   }
}

void computeBezPt (GLfloat u, wcPt3D * bezPt, GLint nCtrlPts, wcPt3D *
ctrlPts, GLint * C)

{
   GLint k, n = nCtrlPts - 1;
   GLfloat bezBlendFcn;

   bezPt->x = bezPt->y = 0.0;

// Calcula las funciones de combinación y los puntos de control de combinación.
   for (k = 0; k < nCtrlPts; k++)
   {
      bezBlendFcn = C [k] * pow (u, k) * pow (1- u, n - k) ;
      bezPt->x += ctrlPts [k].x * bezBlendFcn;
      bezPt->y += ctrlPts [k].y * bezBlendFcn;
   }
}

void bezier (wcPt3D * ctrlPts, GLint nCtrlPts, GLint nBezCurvePts)
{
   wcPt3D bezCurvePt;
   GLfloat u;
   GLint *C, k;


   // Reserva espacio para los coeficientes binomiales
   C = new GLint [nCtrlPts];
   binomialCoeffs (nCtrlPts - 1, C);

   for (k = 0; k<= nBezCurvePts; k++)
   {
      u = GLfloat (k) / GLfloat (nBezCurvePts);
      computeBezPt (u, &bezCurvePt, nCtrlPts, ctrlPts, C);
      Dibuja_Puntos (bezCurvePt); //Dibuja Puntos
   }
   delete [ ] C;
}

void dibujo (void)
{

   glClear (GL_COLOR_BUFFER_BIT);   // Borra la ventana de visualización.
   // Establece un número de puntos de cor,troi de ejemplo y un número de
   // puntos de curva que se deben dibujar a lo largo de la curva de Bezier.
   GLint numero_Pts_Control = 3, numero_Pts_Curva = 1000;

// COMIENZA G EN       TRAZOS

   wcPt3D ctrlPts [3] = {  {10.0, 10.0},
                     {0.0, 10.0},
                     {0.0, 5.0}
                  };

   Dibuja_Puntos_Control (ctrlPts); //Dibuja Puntos de control

   bezier (ctrlPts, numero_Pts_Control, numero_Pts_Curva);

   wcPt3D ctrlPts2 [3] = { { 0.0, 5.0},
                     { 0.0, 0.0},
                     { 5.0, 0.0}
                  };

   Dibuja_Puntos_Control (ctrlPts2); //Dibuja Puntos de control

    bezier (ctrlPts2, numero_Pts_Control, numero_Pts_Curva);


   wcPt3D ctrlPts3 [3] = { { 5.0, 0.0},
                     { 10.0, 0.0},
                     { 10.0, 7.0}
                  };

   Dibuja_Puntos_Control (ctrlPts3); //Dibuja Puntos de control

   bezier (ctrlPts3, numero_Pts_Control, numero_Pts_Curva);

   wcPt3D ctrlPts4 [3] = { {10.0, 7.0},
                     {10.0, 5.0},
                     {5.0, 5.0}
                  };

   Dibuja_Puntos_Control (ctrlPts4); //Dibuja Puntos de control

    bezier (ctrlPts4, numero_Pts_Control, numero_Pts_Curva);
    //FIN DE G

   //PRINCIPIO E EN 6 TRAMOS

   wcPt3D ctrlPts5 [3] = {  { 30.0, 8.0},
                     { 30.0, 10.0},
                     { 25.0, 10.0}
                  };

   Dibuja_Puntos_Control (ctrlPts5); //Dibuja Puntos de control

   bezier (ctrlPts5, numero_Pts_Control, numero_Pts_Curva);

   wcPt3D ctrlPts6 [3] = {    { 25.0, 10.0},
                        {20.0, 10.0},
                        {20.0, 5.0}
                  };

   Dibuja_Puntos_Control (ctrlPts6); //Dibuja Puntos de control

    bezier (ctrlPts6, numero_Pts_Control, numero_Pts_Curva);


   wcPt3D ctrlPts7 [3] = {  {20.0, 5.0},
                     {20.0, 0.0},
                     {25.0, 0.0}
                  };

   Dibuja_Puntos_Control (ctrlPts7); //Dibuja Puntos de control

   bezier (ctrlPts7, numero_Pts_Control, numero_Pts_Curva);

   wcPt3D ctrlPts8 [3] = {  {25.0, 0.0},
                     {30.0, 0.0},
                     {30.0, 1.5}
                  };

   Dibuja_Puntos_Control (ctrlPts8); //Dibuja Puntos de control

    bezier (ctrlPts8, numero_Pts_Control, numero_Pts_Curva);


   wcPt3D ctrlPts9 [3] = {  { 30.0, 8.0},
                     { 30.0, 5.0},
                     { 25.0, 5.0}
                  };

   Dibuja_Puntos_Control (ctrlPts9); //Dibuja Puntos de control

   bezier (ctrlPts9, numero_Pts_Control, numero_Pts_Curva);



   wcPt3D ctrlPts10 [3] = {  { 25.0, 5.0},
                     { 20.0, 3.0},
                     { 20.0, 5.0}
                  };

   Dibuja_Puntos_Control (ctrlPts10); //Dibuja Puntos de control

   bezier (ctrlPts10, numero_Pts_Control, numero_Pts_Curva);

// FIN DE E
glFlush ( );
}

void winReshapeFcn (GLint nuevo_An, GLint nuevo_Al)
{
   // Mantiene una relación de aspeto de valor 1.0.
   glViewport (0, 0, nuevo_An, nuevo_Al);

   glMatrixMode (GL_PROJECTION); glLoadIdentity ( );

   gluOrtho2D (xuMin, xuMax, yuMin, yuMax);
   glClear (GL_COLOR_BUFFER_BIT);
}

int main (int argc, char** argv)
{
   glutInit (&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowPosition (150,150);
   glutInitWindowSize (An, Al);
   glutCreateWindow ("Curva de Bezier codigo según Hearn & Baker");

   inicio();
   glutDisplayFunc (dibujo);
   glutReshapeFunc (winReshapeFcn);

   glutMainLoop();
   return 0;
}




Gracias.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Teclado
« Respuesta #1 en: Jueves 18 de Enero de 2007, 08:49 »
0
si lo unico que necesitas es recibir los eventos de las pulsaciones en las librerias de utilidades de OpenGl tienes una funcion que se llama GlutKeyboardFunc a la que le pasas una función que se ejecuta al pulsarse una tecla. En esa funcion puedes leer el tipo de tecla pulsada y hacer los eventos que quieras.

He supuesto que esta te interesaria mas.

kingston

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Teclado
« Respuesta #2 en: Viernes 19 de Enero de 2007, 23:01 »
0
Pero... como tendría k hacerlo??  Tendría que dividir en dos funciones, una para la letra G y otra para la E?? Como lo haria??

Gracias

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Teclado
« Respuesta #3 en: Sábado 20 de Enero de 2007, 11:52 »
0
a ver...

en glutKeyboardFunc le pasas el nombre de una funcion que reciba un char que es la tecla pulsada y 2 int que son las coords del raton (que aunque no te interesen las recibe igual).

Cuando se pulsa una tecla, se llama a esa funcion

ejemplo :

void MyFuncion(char key,int x,int y)
{
           switch(key)
          {
          case 'A':case 'a': do something;break;
          case 'B':case 'b': do another something;break;
           }
}

kingston

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Teclado
« Respuesta #4 en: Sábado 20 de Enero de 2007, 14:15 »
0
:huh: .... Sorry!!... soy duro de mollera... pero no lo acabo de entender...

void MyFuncion(char key, int x, int y)
{
switch(key)
case A: do something; break;
case B: do another something; break;
}
}


A ver... el ejemplo lo entiendo y ya lo he usado para otro programa, pero no se como ponerlo para ese caso en particular, ya que en el ejemplo que he puesto arriba está todo dentro de la función void dibujo( )... En el case A, ¿cómo lo pudo poner para que solamente me haga la letra G?? Es que por más vueltas que le doy y por mas pruebas que hago no me sale...   :(


Gracias

kingston

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Teclado
« Respuesta #5 en: Viernes 26 de Enero de 2007, 00:37 »
0
Ya lo hice. Muchas gracias por la explicación   ;)

 :lightsabre:  xDD