sdl: objekt rotieren?



  • life schrieb:

    du sollst einfach die entsprende rotationsmatrix (http://de.wikipedia.org/wiki/Rotationsmatrix) mit jeden (translierten) punkt (pixel) des bildes multiplizieren ..

    oh...ich bin leider kann mathe student...und meine schulmathematik reicht nicht(mehr) aus um das in c umzusetzen...
    http://de.wikipedia.org/math/0ea482013494702fba0892804531be0f.png
    cos/sin alpha is klar, aber ich weiss nichtmehr genau inwiefern ich das ganze umsetze 😕
    vorallem, wo in der formel ist der mittelpunkt?
    kannste mit da nen tipp geben?

    danke



  • pixartist schrieb:

    punkte kann man sowieso nicht rotieren weil sie eindimensional sind

    Na gut, dann gehts wohl nicht.

    Bye, TGGC



  • ah ich glaub ich habs gecheckt
    edit: verdammt wie multipliziert man eine matrix mit einer integer?
    habs jetzt so probiert,

    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 xcenter = d2i(w/2);
    	int ycenter = d2i(h/2);
    	for(int j = 0; j<w; j++)
    	{
    		for(int i = 0; i<h; i++)
    		{
    			if(array[i+(j*h)] != 0 || showblack == 1)
    			{
    				PUTPIXEL(d2i((j-15)*rM+x+15),d2i((i-15)*rM+y+15),array[i+(j*h)]);
    			}
    		}
    	}
    }
    

    geht türlich nicht



  • 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



  • 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

    sei mal nicht so aggressiv...nicht jeder hat informatik studiert

    wow ich habe ZUFÄLLIG kein mathebuch zuhause, welches das erklährt und hätte ich eins wüsste ich wohlmöglich nicht wie ich das in c umsetze...
    des weiteren wir bei wikipedia nur gezeigt wie man 1x1 matrizen oder nxn matrizen multiplizieret...
    das sieht dann so aus:
    http://de.wikipedia.org/math/5cd9d140c0dbbbff3d517e2d32339c2d.png
    wow das kenn ich sogar noch aus der schule! soll ich dass dann etwa in c schreiben? kann man in c nicht einfach zwei arrays multiplizieren?

    meint ihr hiermit komme ich weiter?

    for (i = 0; i < groesse; i++) {
        ergebnis[i] = 0;
        for (j = 0; j < groesse; j++)
          ergebnis[i] += matrix[i][j] * vektor[j];
      }
    


  • pixartist schrieb:

    sei mal nicht so aggressiv...nicht jeder hat informatik studiert
    [...]
    soll ich dass dann etwa in c schreiben? kann man in c nicht einfach zwei arrays multiplizieren? meint ihr hiermit komme ich weiter?

    Ich bin nicht agressiv. Dein Fehler, wenn du nciht studierst. Ja. Nein. Ja.

    Bye, TGGC



  • pixartist schrieb:

    oh...ich bin leider kann mathe student...und meine schulmathematik reicht nicht(mehr) aus um das in c umzusetzen...

    lernt man eigentlich in der schule..

    http://de.wikipedia.org/math/0ea482013494702fba0892804531be0f.png
    cos/sin alpha is klar, aber ich weiss nichtmehr genau inwiefern ich das ganze umsetze 😕

    matrix*vektor --> http://www.mathematik.uni-kl.de/~mamaeusch/lexikon/matrixvektorprodukt.html

    vorallem, wo in der formel ist der mittelpunkt?

    ursprung (steht da auch)..



  • 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 😉



  • 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 😞


Anmelden zum Antworten