sdl: objekt rotieren?



  • pixartist schrieb:

    ja, aber wie ist die formel um einen pixelarray um seinen mittelpunkt zu rotieren? danke!

    LOL.

    Du musst schon jeden Pixel einzeln drehen. Also immer wieder Drehung eines einzelnen Punktes.

    Bye, TGGC



  • TGGC schrieb:

    pixartist schrieb:

    ja, aber wie ist die formel um einen pixelarray um seinen mittelpunkt zu rotieren? danke!

    LOL.

    Du musst schon jeden Pixel einzeln drehen. Also immer wieder Drehung eines einzelnen Punktes.

    Bye, TGGC

    hä? wenn man eine fläche rotiert, dann wird doch nicht jeder einzelne pixel rotiert(punkte kann man sowieso nicht rotieren weil sie eindimensional sind)
    sondern jeder punkt wird anhand einer rotationsaxe um den mittelpunkt bewegt



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



  • 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
    

Anmelden zum Antworten