Freeglut Problem beim Überlappen des Fensters



  • Hallo,

    wenn ich bei meinem kleinen Programm hier das Fenster minimiere oder mit einem anderen Fenster kurz überlappe, dann wird scheinbar alles nochmal berechnet und ein anderes Ergebnis dargestellt. Was mache ich denn schon wieder falsch 😕

    #include <GL/glut.h> 
    #include <cmath> 
    #include <vector>
    #include <cstdlib>
    #include <ctime>
    
    const int width = 400, height = 400;
    const double alpha = 2, beta=3;
    const int N_max=100000;
    
    double distance(const int &x1, const int &y1, const int &x2, const int &y2){
    	return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    }
    
    void random_walk(std::vector<std::vector<bool> > &occupied, int &a, int &b, const int &origin_x, const int &origin_y, double &radius, double &d){
    
    	do{
    		int z = rand()%4;
    		if((z==0 && a==1)||(z==1 && a==width-2)||(z==2 && b==1)||(z==3 && a==height-2))
    			break;
    		else if(z==0)
    			--a;
    		else if(z==1)
    			++a;
    		else if(z==2)
    			--b;
    		else if(z==3)
    			++b;
    		d = distance(a,b,origin_x,origin_y);
    	}
    	while(occupied[a+1][b]!=true && occupied[a-1][b]!=true && occupied[a][b+1]!=true && occupied[a][b-1]!=true && d<beta*radius);
    
    	if(occupied[a+1][b]==true || occupied[a-1][b]==true || occupied[a][b+1]==true || occupied[a][b-1]==true){
    		occupied[a][b]=true;
    		if(d>radius)
    			radius = d;
    	}
    }
    
    void random_set(const int &origin_x, const int &origin_y){
    
    	std::vector<std::vector<bool> > occupied(width, std::vector<bool>(height));
    	occupied[origin_x][origin_y] = true;
    
    	glBegin(GL_POINTS);
    	glColor3f(0.0,0.0,0.0);
    	glVertex2f(origin_x,origin_y);	   
    	glEnd(); 
    
    	double radius = 0.5;
    	double min_set_radius = alpha * radius;
    	int N = 0;
    	while(N<N_max && min_set_radius<width/2){
    
    		int a, b;
    		double d;
    		do{
    				a = rand() % (width-2) +1;
    				b = rand() % (height-2)+1;
    				d=distance(a,b,origin_x,origin_y);
    		}
    		while(d <= min_set_radius || d > beta*radius);
    
    		random_walk(occupied,a,b,origin_x,origin_y,radius,d);
    
    		if(occupied[a][b]==true){
    
    				glBegin(GL_POINTS);
    				glColor3f(1.0,0.0,0.0);
    				glVertex2f(a,b);	   
    				glEnd(); 
    
    				++N;
    				min_set_radius = alpha * radius;
    		}
    	}
    }
    
    void draw(){
    
    	int origin_x = width/2, origin_y = height/2;
    	glClear(GL_COLOR_BUFFER_BIT); 
    
    	random_set(origin_x, origin_y);
    
    	glFlush(); 
    }
    
    int main(int argc, char **argv){
    
       srand(40);
       glutInit(&argc, argv); 
       glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); 
       glutInitWindowPosition(400,50); 
       glutInitWindowSize(width,height); 
       glutCreateWindow("diffusion limited aggregation simulation"); 
       glClearColor(1,1,1,1); 
    
       glMatrixMode(GL_PROJECTION); 
       glLoadIdentity(); 
       glOrtho(0,width,height,0,-1.0,1.0); 
    
       glutDisplayFunc(draw); 
       glutMainLoop(); 
    
       return 0; 
    }
    


  • Du benutzt uraltes OpenGL.
    Hier werden sie geholfen


  • Mod

    Namal schrieb:

    wenn ich bei meinem kleinen Programm hier das Fenster minimiere oder mit einem anderen Fenster kurz überlappe, dann wird scheinbar alles nochmal berechnet und ein anderes Ergebnis dargestellt. Was mache ich denn schon wieder falsch

    du machst nichts falsch, klingt fuer mich alles richtig.



  • rapso schrieb:

    Namal schrieb:

    wenn ich bei meinem kleinen Programm hier das Fenster minimiere oder mit einem anderen Fenster kurz überlappe, dann wird scheinbar alles nochmal berechnet und ein anderes Ergebnis dargestellt. Was mache ich denn schon wieder falsch

    du machst nichts falsch, klingt fuer mich alles richtig.

    Sorry wenn ich nochmal nachfrage, aber warum passiert es und wie kann man es beheben?

    Die guten 90er schrieb:

    Du benutzt uraltes OpenGL.
    Hier werden sie geholfen

    Dankeschön, ich werde es mir zuhause anschauen. Leider gibt es auf diesem Rechner kein cmake.



  • Ein Teil des Fensterinhaltes muss ja neu gezeichnet werden wenn er nicht mehr von irgendetwas anderem verdeckt ist. In dem Fall renderst Du aber eben nicht nur sondern erzeugst auch Deine (zufaellige) Punktemenge neu und bekommst ein anderes Bild.


  • Mod

    Namal schrieb:

    rapso schrieb:

    Namal schrieb:

    wenn ich bei meinem kleinen Programm hier das Fenster minimiere oder mit einem anderen Fenster kurz überlappe, dann wird scheinbar alles nochmal berechnet und ein anderes Ergebnis dargestellt. Was mache ich denn schon wieder falsch

    du machst nichts falsch, klingt fuer mich alles richtig.

    Sorry wenn ich nochmal nachfrage, aber warum passiert es und wie kann man es beheben?

    warum passiert was genau? dass dein fenster angezeigt wird? ist das nicht der ganze sinn von fenstern? wenn du dein fenster wieder sehen moechtest und es wuerde nicht gezeichnet werden, dann waere doch kein sinn mehr da fuer das fenster system, weil alles was mal verdeckt war dann weg waere, dann koennte man eigentlich gleich das program schliessen.

    wenn du nicht moechtest dass dein fenster mehr als einmal gezeichnet wird, bau einen zaehler in die zeichenfunktion ein und zaehl ++ am anfang der zeichenfunktion und falls der zaehler schon ==1 ist, return direkt.
    aber ich bezweifle ob das von vorteil ist.


Anmelden zum Antworten