Guten Abend Leute!
Bei meinem Problem handelt es sich um das drehen eines Bildes. Ich habe mehrere Stunden versucht dies selbst zu lösen und habe auch im Internet / YT-Videos zwar vieles zum Thema gefunden, konnte es aber einfach nicht auf mein Programm anwenden.
Im Grunde genommen soll ein Bild um einen gewissen Winkel um die Mitte des Bildes gedreht werden. Ein "Bild" beschreibt bei mir ein als 1-Dimensionales, in meiner Klasse PixelImage gespeichertes, Array. Dazu meine Klasse PixelImage:
Beim erzeugen eines neuen PixelImages wird ein Breite * Höhe-großes Array mit meiner "Undefinierten Farbe" (#010000) angelegt. Die Farben der einzelnen Pixel können dann per set Methoden einfach verändert werden.
In einer anderen Klasse innerhalb der render-Methode wird vor dem "kopieren" des Bildes auf den Bildschirm dann noch die Rotations-Methode rotateImage() aufgerufen. Das zurückgegebene, rotierte Bild soll dann auf dem Bildschirm bzw. in mein "Hauptbild" geschrieben werden. Die Methode, die dies übernimmt sieht so aus:
Zuerst wird das Bild rotiert. Dann werden alle Pixel von a nach b verfrachtet solange sie nicht der Undefinierten Farbe entsprechen. In dem Falle wird der einzelne Pixel ignoriert. Die Methode setPixelValueAt stammt in diesem Falle von meinem "Bildschirm" und dient daher nur dem Übertragen der Werte von meinem PixelImage auf den Bildschirm / Screen.
Zurück zur Rotation:
Mein Problem ist nun, dass ich einfach zu blöd dazu bin, diese rotation zu berechnen!
Ich möchte die Rotation NICHT mit Graphics2D ... rotate() machen, da ich dann mein ganzes System umstellen müsste. Ich möchte die Kontrolle über einzelne Pixel behalten. Dadurch gibt es ja eigentlich nur die Möglichkeit as Bild zu drehen, indem ich das ganze Mathematisch mit sin(a), cos(a) usw. angehe. Der Einfachkeit halber hat mein Bild ein quadratisches Format (erstmal). Außerdem möchte ich um den Mittelpunkt P meines Bildes drehen also P((w-1)/2 | (h-1)/2) wobei w der Breite und h der Höhe entspricht. Damit ich nicht mit halben Pixeln arbeite habe ich auch bisher nur ungerade Höhen und Breiten benutzt.
Ein großes Problem, dass ich nicht bewältigen kann ist für mich, dass beim Drehen eines Quadrats sich die Höhe und Länge der "Außenlinien" (sagt man das so?) ja logischerweise vergrößert. (Ich kann ja kein gedrehtes Quadrat abspeichern, also muss ich ein größeres erstellen, in welches das gedrehte "hineinpasst".) Nun habe nach zu vielen Versuchen leider keine Lösung um zu Berechnen, wie breit und hoch dieses neue Quadrat sein muss. Der Ansatz lag dabei beim drehen der Ecken meines Bildes, um dann zu schauen, was die Längen dann sind. Und dann habe ich es auch immernoch nicht geschafft, die neuen, gedrehten Positionen meiner Pixel zu berechnen.
Also als Zusammenfassung noch einmal:
Was ich gerne wissen würde wäre..
- eine Erklärung zum "Drehen" der Pixel um den Mittelpunkt
- eine Erklärung zum berechnen dieses "äußeren" Quadrates
- und zuguterletzt wäre eine funktionierende rotateImage() Methode die mir ein neues, um "angle" gedrehtes, Bild zurückgibt, sehr schön!
Ich hoffe ihr habt mein Code und mein Problem verstanden und könnt mir helfen, worüber ich mich schoneinmal im Voraus bedanken möchte.
Mit freundlich Grüßen,
DylanP
P.S.: Bitte um move in Java AWT, SWING etc. Forum, da ich dort aus unerklärlichen Gründen vorher nicht posten konnte.
Bei meinem Problem handelt es sich um das drehen eines Bildes. Ich habe mehrere Stunden versucht dies selbst zu lösen und habe auch im Internet / YT-Videos zwar vieles zum Thema gefunden, konnte es aber einfach nicht auf mein Programm anwenden.
Im Grunde genommen soll ein Bild um einen gewissen Winkel um die Mitte des Bildes gedreht werden. Ein "Bild" beschreibt bei mir ein als 1-Dimensionales, in meiner Klasse PixelImage gespeichertes, Array. Dazu meine Klasse PixelImage:
Java:
public class PixelImage
{
public static final int undefinedColorValue = 0x010000;
private final int width;
private final int height;
private int[] pixels;
public PixelImage(int width, int height)
{
this.width = width;
this.height = height;
pixels = new int[width * height];
for(int i = 0; i < pixels.length; i++)
{
pixels[i] = undefinedColorValue;
}
}
public PixelImage rotateImage(PixelImage pixIm, double angle)
{
// hier soll ein neues um "angle" rotiertes Bild zurückgegeben werden.
}
// ... es folgen einige get- und set-Methoden
}
In einer anderen Klasse innerhalb der render-Methode wird vor dem "kopieren" des Bildes auf den Bildschirm dann noch die Rotations-Methode rotateImage() aufgerufen. Das zurückgegebene, rotierte Bild soll dann auf dem Bildschirm bzw. in mein "Hauptbild" geschrieben werden. Die Methode, die dies übernimmt sieht so aus:
Java:
public boolean putPixelImageOnScreen(int x, int y, double angle, PixelImage pixIm)
{
pixIm = pixIm.rotateImage(pixIm, angle);
for(int i = 0; i < pixIm.getHeight(); i++)
{
for(int j = 0; j < pixIm.getWidth(); j++)
{
if(pixIm.getPixelValueAt(j, i) == PixelImage.undefinedColorValue) continue;
setPixelValueAt(x + j, y + i, pixIm.getPixelValueAt(j, i));
}
}
return true;
}
Zurück zur Rotation:
Mein Problem ist nun, dass ich einfach zu blöd dazu bin, diese rotation zu berechnen!
Ich möchte die Rotation NICHT mit Graphics2D ... rotate() machen, da ich dann mein ganzes System umstellen müsste. Ich möchte die Kontrolle über einzelne Pixel behalten. Dadurch gibt es ja eigentlich nur die Möglichkeit as Bild zu drehen, indem ich das ganze Mathematisch mit sin(a), cos(a) usw. angehe. Der Einfachkeit halber hat mein Bild ein quadratisches Format (erstmal). Außerdem möchte ich um den Mittelpunkt P meines Bildes drehen also P((w-1)/2 | (h-1)/2) wobei w der Breite und h der Höhe entspricht. Damit ich nicht mit halben Pixeln arbeite habe ich auch bisher nur ungerade Höhen und Breiten benutzt.
Ein großes Problem, dass ich nicht bewältigen kann ist für mich, dass beim Drehen eines Quadrats sich die Höhe und Länge der "Außenlinien" (sagt man das so?) ja logischerweise vergrößert. (Ich kann ja kein gedrehtes Quadrat abspeichern, also muss ich ein größeres erstellen, in welches das gedrehte "hineinpasst".) Nun habe nach zu vielen Versuchen leider keine Lösung um zu Berechnen, wie breit und hoch dieses neue Quadrat sein muss. Der Ansatz lag dabei beim drehen der Ecken meines Bildes, um dann zu schauen, was die Längen dann sind. Und dann habe ich es auch immernoch nicht geschafft, die neuen, gedrehten Positionen meiner Pixel zu berechnen.
Also als Zusammenfassung noch einmal:
Was ich gerne wissen würde wäre..
- eine Erklärung zum "Drehen" der Pixel um den Mittelpunkt
- eine Erklärung zum berechnen dieses "äußeren" Quadrates
- und zuguterletzt wäre eine funktionierende rotateImage() Methode die mir ein neues, um "angle" gedrehtes, Bild zurückgibt, sehr schön!
Ich hoffe ihr habt mein Code und mein Problem verstanden und könnt mir helfen, worüber ich mich schoneinmal im Voraus bedanken möchte.
Mit freundlich Grüßen,
DylanP
P.S.: Bitte um move in Java AWT, SWING etc. Forum, da ich dort aus unerklärlichen Gründen vorher nicht posten konnte.