Apfelmänchen Problem?



  • Habe ein Problem mit dem Algorithmus, könntet ihr mal kontrollieren was daran falsch ist.

    void CChildView::OnPaint() 
    {
    	CPaintDC dc(this); // Gerätekontext zum Zeichnen
    	double x1,y1,x2,y2;
    	double px,py;
    	double abs2;
        int i,j,iter;
    	iter = 0;
    
    	int length_x,length_y;
    
    	CRect MyRect;
    
    	GetClientRect(MyRect);
        length_x = MyRect.right;
    	length_y = MyRect.bottom;
    
    	for (i = 0; i < length_x; i++)
    	{
    		for(j = 0; j < length_y; j++)
    		{
             px = (i-length_x/2)*100.0;
    		 py = (j-length_x/2)*100.0;
    
    		 x2   = 0.0;
    		 y2   = 0.0;
    		 abs2 = 0.0;
    		 while(abs2 <=4.0 && iter < 50)
    		 {
               x1 = x2;
    		   y1 = y2;
    		   x2 = x1  * x1 - y1 * y1 + px;
    		   y2 = 2.0 * x1 * y1 + py;
    
    		   abs2 = x2 * x2 + y2 * y2;
    		   iter++;
    		 }
    
    			if(abs2 <= 4.0)
    			{
    			 dc.MoveTo(i,j);
    			 dc.LineTo(i+1,j);
    			}
    		}
    	}
    
    	// TODO: Fügen Sie hier Ihren Nachrichtenbehandlungscode ein.
    
    	// Rufen Sie nicht CWnd::OnPaint() für Nachrichten zum Zeichnen auf
    }
    


  • Gegenfrage: Worüber beschwert sich denn dein Compiler?

    Ein Fehler ist mir schon aufgefallen: Du solltest vor der while()-Schleife ein "iter=0" einsetzen, sonst rechnet er die Schleife nur für die obere linke Ecke durch (je nach benötigter Schrittzahl auch für die nächsten Punkte).



  • CStoll schrieb:

    Gegenfrage: Worüber beschwert sich denn dein Compiler?

    Ein Fehler ist mir schon aufgefallen: Du solltest vor der while()-Schleife ein "iter=0" einsetzen, sonst rechnet er die Schleife nur für die obere linke Ecke durch (je nach benötigter Schrittzahl auch für die nächsten Punkte).

    Sein iter ist doch null. Hat er gleich nach der Deklaration null gesetzt und bis dahin wirds nicht anders verwendet.
    Aber was sagt der Compiler?



  • Ja, am Anfang des ersten Schleifendurchlaufs (i=0,j=0) steht iter auf 0. Aber im Inneren der while()-Schleife wird es ständig weiter hochgezählt, also steht es spätestens nach 50 Läufen auf 50 - und ab da wird die while()-Schleife nicht mehr gestartet.



  • CStoll schrieb:

    Ja, am Anfang des ersten Schleifendurchlaufs (i=0,j=0) steht iter auf 0. Aber im Inneren der while()-Schleife wird es ständig weiter hochgezählt, also steht es spätestens nach 50 Läufen auf 50 - und ab da wird die while()-Schleife nicht mehr gestartet.

    😃
    stimmt, hatte ich übersehen


Anmelden zum Antworten