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/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!
-
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