sdl: objekt rotieren?



  • TGGC schrieb:

    Dein Fehler, wenn du nciht studierst

    Bye, TGGC

    Oo ich hab grad mein abi fertig...erhm ich kann noch garnicht studieren



  • dreaddy schrieb:

    Alternativ könntest du dir auch einfach sdl_rotozoom von der sdl page saugen, das ist vermutlich wesentlich schneller als alles was du dir hinbastelst.
    Ausser du willst das drehen nur just4fun machen natürlich 😉

    danke..werde ich vielleicht machen!
    aber einmal noch...hab das jetzt so eingebaut, es rotiert das objekt zwar, aber um ganz seltsame werte! (also wenn rot= 90 dann nicht um 90 grad usw)

    void drawPixels(int *array, int showblack = 1, int w = SWIDTH, int h = SHEIGHT, int x = 0, int y = 0, int rot = 0)
    {
    	float rM[2][2] ={{cos(rot),-sin(rot)},{sin(rot),cos(rot)}};
    	int ergebnis[2];
    	for(int j = 0; j<w; j++)
    	{
    		for(int i = 0; i<h; i++)
    		{
    			if(array[i+(j*h)] != 0 || showblack == 1)
    			{
    				int pixel[2] = {j-12,i-12};
    				for (int k = 0; k < 2; k++) 
    				{ 
    					ergebnis[k] = 0; 
    					for (int l = 0; l < 2; l++) 
    						ergebnis[k] += rM[k][l] * pixel[l]; 
    				}
    				PUTPIXEL(ergebnis[0]+x+12,ergebnis[1]+y+12,array[i+(j*h)]);
    			}
    		}
    	}
    }
    


  • Stichwort grad -> rad

    180° entspricht PI
    0° entspricht PI/2

    Rad = Grad * PI/180



  • YASC schrieb:

    Stichwort grad -> rad

    ????????



  • Habs grad nochmal editiert



  • YASC schrieb:

    Habs grad nochmal editiert

    danke...gibbet ne funktion in c mit der ich PI sehr genau zurück bekomme oder muss ichs von hand einfügen??

    danke!



  • in cmath

    einfach PI eingeben

    #include <cmath>
    
    //und jetz einfach PI verwenden
    
    rad = grad * (PI/180);
    


  • achso, hatte math.h inkludiert...das is dann ja unnötig...danke jetzt klappts alles!
    achne...PI erkennt es nicht, trotz cmath
    float rot = rot2 * PI/180;
    ->error C2065: 'PI' : nichtdeklarierter Bezeichner



  • Huch?

    Naja, dann schreib einfach am Anfang

    const double PI = 3.141592654
    


  • YASC schrieb:

    Huch?

    Naja, dann schreib einfach am Anfang

    const double PI = 3.141592654
    

    ok noch ein problem...scheint mi dem runden zu tun zu haben...
    so sieht die funktion jetzt aus:

    void drawPixels(int *array, int showblack = 1, int w = SWIDTH, int h = SHEIGHT, int x = 0, int y = 0, int rot2 = 0)
    {
    	if(rot2)
    	{
    		float rot = rot2 * 3.141592654/180;
    		float rM[2][2] ={{cos(rot),sin(rot)},{-sin(rot),cos(rot)}};
    		float ergebnis[2];
    		for(int j = 0; j<w; j++)
    		{
    			for(int i = 0; i<h; i++)
    			{
    				if(array[i+(j*h)] != 0 || showblack == 1)
    				{
    					int pixel[2] = {j-d2i(w/2),d2i(i-12)};
    					for (int k = 0; k < 2; k++) 
    					{ 
    						ergebnis[k] = 0; 
    						for (int l = 0; l < 2; l++) 
    							ergebnis[k] += rM[k][l] * pixel[l]; 
    					}
    					PUTPIXEL(d2i(ergebnis[0])+x+d2i(w/2),d2i(ergebnis[1])+y+d2i(w/2),array[i+(j*h)]);
    				}
    			}
    		}
    	}
    	else
    	{
    		for(int j = 0; j<w; j++)
    		{
    			for(int i = 0; i<h; i++)
    			{
    				if(array[i+(j*h)] != 0 || showblack == 1)
    				{
    					PUTPIXEL(j+x,i+y,array[i+(j*h)]);
    				}
    			}
    		}
    	}
    
    }
    

    allerdings gibts bei der rotation oft pixelfehler, dh kleine "lücken" und löcher

    hat jemand ne idee wie ich das verhindern kann? danke!



  • TGGC schrieb:

    Ich habe doch auch was ganz anderes gesagt! Du sollst für jeden Pixel im Zielbild eine Pixel aus dem Originalbild holen und nicht für jeden Pixel im Originalbild einem im Zielbild schreiben!

    Zu Matrix*Vektor siehe beliebiges Mathebuch.

    Bye, TGGC



  • life schrieb:

    TGGC schrieb:

    Ich habe doch auch was ganz anderes gesagt! Du sollst für jeden Pixel im Zielbild eine Pixel aus dem Originalbild holen und nicht für jeden Pixel im Originalbild einem im Zielbild schreiben!

    Zu Matrix*Vektor siehe beliebiges Mathebuch.

    Bye, TGGC

    achso jetzt versteh ich auch warum 😃

    boa kacke ich hab ka wie ich das denn machen soll 😞



  • *aggressiv werd* 😎

    Bye, TGGC



  • TGGC schrieb:

    *aggressiv werd* 😎

    Bye, TGGC

    häää?
    wenn ich ein quadratisches objekt rotiere werden doch seine dimensionen in x und y richtung grösser, wie soll ich denn die richtigen pixel abtasten? HILLLFEEE!!



  • Versuch doch mal für jeden Pixel aus dem Zielbild die Koordinaten zurückzudrehen und den Pixelwert mit den gedrehten Koordinaten aus dem Ursprungsbild zu nehmen

    hmmm.. 😕



  • YASC schrieb:

    Versuch doch mal für jeden Pixel aus dem Zielbild die Koordinaten zurückzudrehen und den Pixelwert mit den gedrehten Koordinaten aus dem Ursprungsbild zu nehmen

    hmmm.. 😕

    ja aber meine for schleife ist doch nur 25*25 und das bild selbst auch 25*25 wenn ich nun im zielbild 25*25 pixel abtaste und für jeden die koordinate abfrage, dann schneide ich doch die ecken ab?!



  • Wie wäre es wenn du nach den fast vergessenen Theorien eines Herren Pythagoras den Bereich einfach entsprechend erweiterst?

    Bye, TGGC



  • update2:

    if(rot2)
    	{
    		float rot = rot2 * -3.141592654/180;
    		float rM[2][2] ={{cos(rot),sin(rot)},{-sin(rot),cos(rot)}};
    		float ergebnis[2];
    		int nw = sqrt(w*w+h*h);
    		int nh = nw;
    		for(int j = 0; j<nw; j++)
    		{
    			for(int i = 0; i<nh; i++)
    			{
    					int pixel[2] = {j-d2i(nw/2),i-d2i(nh/2)};
    					for (int k = 0; k < 2; k++) 
    					{ 
    						ergebnis[k] = 0; 
    						for (int l = 0; l < 2; l++) 
    							ergebnis[k] += rM[k][l] * pixel[l]; 
    					}
    					int dx = d2i(ergebnis[0])+x+d2i(w/2);
    					int dy = d2i(ergebnis[1])+y+d2i(h/2);
    					PUTPIXEL(j+x,i+y,array[dy+(dx*h)]);
    			}
    		}
    	}
    

    bild nicht zentriert 😞

    maaan das ist ist 1. nicht zentriert und 2. gekachelt 😞



  • ok zentriert ist es jetzt
    ich weis ja woran die kachelung liegt, habe aber keine lösung ausser die maße des bildes zu vergrössern 😞



  • Die Zugriffe ausserhalb des Arrays solltest du besser lassen.

    Bye, TGGC


Anmelden zum Antworten