sdl: objekt rotieren?
-
also ich habe einen array der genauso viele punkte hat wie das bild
array[800][600]
in diesem array befindet sich ein bild(25x25pixel),alle restlichen punkte sind schwarz...
nun habe ich eine funktion, die diesen array auf den bildschirm malt, und dabei alle schwarzen punkte auslässt. nun will ich das bild rotieren, wie mache ich das? rotationsachse soll genau in der mitte des geladenen bildes sein.
wäre es besser einen 25x25 grossen array zu nehmen und den dann an ne bestimmte position zu zeichnen wegen der rotationsachse und performance?
danke
-
Für jeden Pixel im Zielbild Koordinate rotieren. Farbe im Originalbild an rotierter Koordinate lesen. Farbe ins Zielbild schreiben.
Nur den geschwünschten Bereich zu rotieren hört sich sinnvoll an.
Bye, TGGC
-
TGGC schrieb:
Für jeden Pixel im Zielbild Koordinate rotieren. Farbe im Originalbild an rotierter Koordinate lesen. Farbe ins Zielbild schreiben.
Nur den geschwünschten Bereich zu rotieren hört sich sinnvoll an.
Bye, TGGC
ja, aber wie ist die formel um einen pixelarray um seinen mittelpunkt zu rotieren? danke!
-
es geht nicht um eine 90° rotation, sondern um einzelne gradzahlen!
-
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/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!