Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8

    [C++] Controllo tempo e ordine di esecuzione (openGL)

    Ciao a tutti,
    sto cercando di eseguire un codice usando c++ e le lib openGl che esegua i seguenti comandi: mostrare una croce per 3 secondi e poi una colonna che va riempita fino ad un certo limite, ora io sono riuscito a creare la barra (che si riempie tramite un ciclo for) e so anche come creare la croce, il mio problema è come regolare il tempo, cioè fare in modo che uno appaia prima dell'altro e che ci resti per una durata da me decisa. Sapete darmi qualche consiglio? Di seguito posto il codice che sto usando, spero di non aver scritto cose troppo stupide e vi ringrazio in anticipo.

    codice:
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <GL/glut.h>
    /* GLUT callback Handlers */
    
    static void resize(int width, int height)
    {
        const float ar = (float) width / (float) height;
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity() ;
    }
    static void display(void)
    {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        unsigned int rgba = 0xFFFFFFFF; // white
        unsigned int rgba1 = 0x00000000; // black
        unsigned int rgba2 = 0x00EA00FF; //green
        unsigned int rgba3 = 0xFF0000FF; //red
        double i;
    
    
        for ( i = -2.7;i < 3.8;i+= 0.001)
    {
        //rectangle
        glBegin(GL_QUADS);
    
    
        //rectangle white
        glColor4f(((rgba>>24)&0xff)/255.0f,
                 ((rgba>>16)&0xff)/255.0f, 
                 ((rgba>>8)&0xff)/255.0f,
                 (rgba&0xff)/255.0f);
    
    
                 glVertex3f(-3,-3,-10);
                 glVertex3f(3,-3,-10);
                 glVertex3f(3,4,-10); 
                 glVertex3f(-3,4,-10);
        
        //rectangle black
        glColor4f(((rgba1>>24)&0xff)/255.0f,
                 ((rgba1>>16)&0xff)/255.0f, 
                 ((rgba1>>8)&0xff)/255.0f,
                 (rgba1&0xff)/255.0f);
    
    
                 glVertex3f(-2.9,-2.9,-10);
                 glVertex3f(2.9,-2.9,-10);
                 glVertex3f(2.9,3.9,-10); 
                 glVertex3f(-2.9,3.9,-10);
        
        //rectangle feedback(green/red)
                if (i<=1.5)
                    {
        glColor4f(((rgba2>>24)&0xff)/255.0f,
                 ((rgba2>>16)&0xff)/255.0f, 
                 ((rgba2>>8)&0xff)/255.0f,
                 (rgba1&0xff)/255.0f);
    
    
                 glVertex3f(-2.7,-2.7,-10);
                 glVertex3f(2.7,-2.7,-10);
                 glVertex3f(2.7,(i),-10); 
                 glVertex3f(-2.7,(i),-10);
                 }
                else
                    {
                 glColor4f(((rgba2>>24)&0xff)/255.0f,
                 ((rgba2>>16)&0xff)/255.0f, 
                 ((rgba2>>8)&0xff)/255.0f,
                 (rgba2&0xff)/255.0f);
    
    
                 glVertex3f(-2.7,-2.7,-10);
                 glVertex3f(2.7,-2.7,-10);
                 glVertex3f(2.7,1.5,-10); 
                 glVertex3f(-2.7,1.5,-10);
    
    
                 glColor4f(((rgba3>>24)&0xff)/255.0f,
                 ((rgba3>>16)&0xff)/255.0f, 
                 ((rgba3>>8)&0xff)/255.0f,
                 (rgba2&0xff)/255.0f);
    
    
                 glVertex3f(-2.7,2,-10);
                 glVertex3f(2.7,2,-10);
                 glVertex3f(2.7,(i),-10); 
                 glVertex3f(-2.7,(i),-10);
                  }
    
    
        //horizontal black bar
        glColor4f(((rgba>>24)&0xff)/255.0f,
                 ((rgba>>16)&0xff)/255.0f, 
                 ((rgba>>8)&0xff)/255.0f,
                 (rgba&0xff)/255.0f);
    
    
                 glVertex3f(-3,1.5,-10);
                 glVertex3f(3,1.5,-10);
                 glVertex3f(3,2,-10); 
                 glVertex3f(-3,2,-10);     
             
                 glEnd();
                 glColor4f(1, 1, 1, 1);
                 glutSwapBuffers();
                 glFlush();
    
    
    }
    }
    static void key(unsigned char key, int x, int y)
    {
        switch (key)
        {
            case 27 :
            case 'q':
                exit(0);
                break;
        }
        //glutPostRedisplay();
    }
     
    static void idle(void)
    {
        glutPostRedisplay();
    }
     
    /* Program entry point */
    int main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitWindowSize(500,500);
        glutInitWindowPosition(10,10);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
     
        glutCreateWindow("task");
     
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(key);
        glutIdleFunc(idle);
     
        glClearColor(0,0,0,0);
     
        glutMainLoop();
     
        return EXIT_SUCCESS;
    }

  2. #2
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    dentro la funzione display:

    codice:
    display(void){
    
       if(tempo esecuzione programma > 3 secondi){
            //disegna barra
       }else{
           //disegna croce
       }
    
    }
    Piu semplicemente di cosi non si puo fare

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8
    Quote Originariamente inviata da mamo139 Visualizza il messaggio
    dentro la funzione display:

    codice:
    display(void){
    
       if(tempo esecuzione programma > 3 secondi){
            //disegna barra
       }else{
           //disegna croce
       }
    
    }
    Piu semplicemente di cosi non si puo fare
    Ciao! Intanto grazie mille per avermi risposto, ho capito la logica nelle tue righe di comando, ma perdona la domanda, come faccio a fargli calcolare il tempo di esecuzione? Ho cercato abbastanza in rete e non ci sono riuscito (forse è perché sono ore che sto lottando con questo codice e sono abbastanza fuso). Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di mamo139
    Registrato dal
    May 2005
    residenza
    Londra
    Messaggi
    841
    Ci sono diversi modi, ma rimanendo nelle librerie standard, puoi usare questa funzione ad esempio per sapere da quanto tempo il tuo programma e' in esecuzione:

    http://www.cplusplus.com/reference/ctime/clock/

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8
    Grazie mille per il consiglio!!!

    Volendo alternare la croce e la colonna ho modificato la funzione display e la main in questo modo ed ha funzionato:

    codice:
    if (clock()/(double) CLOCKS_PER_SEC < 3)
    
    {
        //cross
    	glBegin(GL_QUADS);
    }
    			else
    				{........}
    .
    .
    .
    int main(int argc, char *argv[])
    {
    	clock_t startTime = clock();
    Dato però che tra la croce e la colonna deve esserci un altro intervallo ho pensato di inserire, tra l' ''if ''e l' ''else'' di prima, un ulteriore condizione in questo modo:
    codice:
     else if ((clock()/(double) CLOCKS_PER_SEC >=3) && (clock()/(double) CLOCKS_PER_SEC<=5))
    A questo punto il tutto parte senza dare errori solo che la croce resta per un tempo lunghissimo e subito passa alla condizione finale senza passare per quella intermedia da me definita. Non so se è un problema di codice o di prestazioni del mio pc.
    Spero di essere stato chiaro e di aver usato convenzioni comprensibili nel riassumere le modifiche al codice. Grazie ancora per la disponibilità.

  6. #6
    Ocio che clock misura il tempo di processore, non il tempo reale trascorso, per cui probabilmente per i tuoi scopi non sarà adatto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Ocio che clock misura il tempo di processore, non il tempo reale trascorso, per cui probabilmente per i tuoi scopi non sarà adatto.
    Dividendo per CLOCKS_PER_SEC non ottengo l'equivalente in secondi?
    Grazie per la risposta.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8
    Ho cambiato il comando clock con questa struttura
    codice:
     int time,timebase=0;	
    	time=glutGet(GLUT_ELAPSED_TIME);
    Inserendo come discriminanti
    codice:
    if (time - timebase < 3000)
    {....}
    else if ((time - timebase >= 5000) && (time - timebase <= 10000))
    	{.....}
    else
    				{...}
    Però mandando in esecuzione ritrovo sempre un blocco del pc

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2014
    Messaggi
    8
    Grazie a tutti per l'iauto.
    Credo di aver risolto il problema utilizzando la funzione Sleep() e sembra funzionare.
    Ora però ho un altro problema sto cercando di organizzare le liste ma non mi mostra la lista posto di seguito le righe di comando che uso sapete darmi una spiegazione?Grazie in anticipo!!!
    codice:
    static void resize(int width, int height)
    {
        const float ar = (float) width / (float) height;
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
        glMatrixMode(GL_MODELVIEW);
          glLoadIdentity() ;
     glNewList(cross,GL_COMPILE);//-----------------CROSS LIST!!!!----------------------------
                glBegin(GL_QUADS);//oriz
                         glColor4f(((rgba>>24)&0xff)/255.0f,
                             ((rgba>>16)&0xff)/255.0f, 
                             ((rgba>>8)&0xff)/255.0f,
                             (rgba&0xff)/255.0f);
                             glVertex3f(-0.2,-1,-10);
                             glVertex3f(0.2,-1,-10);
                             glVertex3f(0.2,1,-10); 
                             glVertex3f(-0.2,1,-10);
                              glEnd();
                              glBegin(GL_QUADS);//verticale
                       glColor4f(((rgba>>24)&0xff)/255.0f,
                 ((rgba>>16)&0xff)/255.0f, 
                 ((rgba>>8)&0xff)/255.0f,
                 (rgba&0xff)/255.0f);
                 glVertex3f(-1,-0.2,-10);
                 glVertex3f(1,-0.2,-10);
                 glVertex3f(1,0.2,-10); 
                 glVertex3f(-1,0.2,-10);
                             glEnd();
    }
    void display(void)
    {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
       glCallList(cross);    
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.