Bitmap rotieren

Wie kann ich eine Bitmap um einen beliebigen Winkel rotieren lassen? Also wie berechne ich die neuen Punkte und die Groesse der neuen Matrix? Am besten waere ein einfaches Beispiel mit Sourcecode in C. Oder ein Algorithmus in verbaler Form.

Danke!

Ciao! Bjoern

Wie kann ich eine Bitmap um einen beliebigen Winkel rotieren
lassen? Also wie berechne ich die neuen Punkte und die Groesse
der neuen Matrix? Am besten waere ein einfaches Beispiel mit
Sourcecode in C. Oder ein Algorithmus in verbaler Form.
Danke!

die grösse der matrix bekommst du, dindem du die Eckpunkte rotieren lässt. Das Viereck muss dann so gross sein, dass diese 4 Koord gerade so reinpassen.

wenn du dann diese Matrix hast, gehst du alle Punkte in dieser Matrix durch.
Für jeden Punkt berechnest du die Entfernung zum Mittelpunkt:
dx=mittelx-xpos;
dy=mittely-ypos;
entfernung = sqrt(sqr(dx)+sqr(dx));

und den Winkel mit atan. mit dem atan is das sone Sache, da musst du zwischen den 4 Quadranten unterscheiden, aber vom Prinzip geht das über w=atan( dx/dy ) oder w=atan( dy/dx ), je nach Quadrant. Und je nach Quadrate musst du pi-w oder pi+w oder w machen. Musst du halt ausprobieren oder in eine Formelsammung kucken, ich weiss das auch nicht auf die Schnelle.
Also wenn du den Winkel w hast, addierst du deinen Rotationswinkel obenrauf:

w=w+rotwinkel

Jetzt muss nurnoch diese Polare Koordinate in eine Katesische umgerechnet werden:
ny=sin(w)*entfernung;
nx=cos(w)*entfernung;

jetzt guckst du auf dein Zielbild auf diesen Koordinaten nach und kopierst den Farbwert in deine Matrix.

neuesbild[ypos][xpos] = bild[ny][nx];

Dieser weg ist nicht der optimalste, aber er funktioniert. Besser wäre es mit Rotationsmatrizen. Wenns auf Geschwindigkeit ankommt, kann man da noch einiges optimieren.
Wenn es auf Qualität ankommt, würde ich noch einen linearen Filter raufsetzen, die Zielposition wird nicht auf einen ganzen Pixelwert gerundet, sondern entsprechned der Nachkommastelle einen Mittelwert aus den 4 Pixeln an der Zielposition ermittelt (je nach Nachkommastelle unterschiedlich gewichtet)

cu
Steffen

Die Antwort unten hat alle wesentlichen Punkte, nur nimm auf jeden Fall die Variante ohne Winkelberechnung (langsam und fehleranf"allig)

Du drehst um a (aufpassen mit Grad und Bogenmass, sagen wir Grad)

Berechne (1mal) Ca=cos(a/180*Pi), Sa=sin(a/180*Pi).

Eckpunkte (x,y) vorw"arts

xn = Ca*x-Sa*y
yn = Sa*x+Ca*y

jeweils Max und Min in beiden Richtungen. Entweder das Array von Min bis Max organisieren, oder die lineare Transformation f"ur Min=0 beachten.

Dann f"ur jeden Punkt (xn,yn) des neuen Bildes zur"uckrechnen

x = Ca*xn+Sa*yn
y =-Sa*xn+Ca*yn

Gucken, ob in Ursprungsbild, gewichtetes Mittel der Umliegenden Punkte,…

Ciao Lutz