sdl: objekt rotieren?
-
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/2Rad = 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.141592654ok 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!