Spiegeln und Drehen
Alle Filter der letzten beiden Seiten haben die Werte verändert und jeden Bildpunkt an seinem Platz gelassen. Jetzt drehst du es um: Die Werte bleiben, was sie sind, nur ihr Platz ändert sich. Dafür musst du mit den Indizes rechnen – und das ist die eigentliche Kunst beim zweidimensionalen Feld.
Waagerecht spiegeln
Das Bild an einer senkrechten Achse zu spiegeln heißt: Die erste Spalte wird zur letzten, die zweite zur vorletzten, und so weiter.
breite - 1 - spalte ist der Spiegelindex. Er zählt rückwärts, während
spalte vorwärts zählt:
spalte |
0 | 1 | 2 | … | 93 | 94 | 95 |
|---|---|---|---|---|---|---|---|
breite - 1 - spalte |
95 | 94 | 93 | … | 2 | 1 | 0 |
Das - 1 ist kein Schönheitsfehler: Der größte gültige Index ist breite - 1,
nicht breite. Wer es vergisst, bekommt beim ersten Bildpunkt einen
Laufzeitfehler.
Aufgabe 1: Senkrecht spiegeln und auf den Kopf stellen
a) Schreibe gekippt – das Bild wird an einer waagerechten Achse
gespiegelt, oben und unten tauschen also die Plätze.
b) Schreibe umgedreht – das Bild steht auf dem Kopf, als hätte man es um 180
Grad gedreht.
c) Sage vorher: Was kommt heraus, wenn du gespiegelt(gekippt(grau))
rechnest? Probiere es danach aus.
Tipp 1: Welcher Index?
Beim waagerechten Spiegeln ändert sich die Spalte. Überlege dir, was sich beim senkrechten Spiegeln ändern muss – und lass das andere in Ruhe.
Tipp 2: Zwei Wege zu umgedreht
Entweder du rechnest beide Indizes auf einmal rückwärts, oder du wendest die beiden Spiegelungen nacheinander an. Beides ist richtig; das zweite ist kürzer und zeigt, dass Filter sich hintereinanderschalten lassen.
Aufgabe 2: Um 90 Grad drehen
Hier wird es interessant, denn aus einem Bild von 96 × 72 wird eines von 72 × 96. Das Ergebnisgitter hat also eine andere Form als das Original.
Schreibe gedrehtRechts – das Bild wird um 90 Grad im Uhrzeigersinn gedreht.
a) Wie viele Zeilen und wie viele Spalten hat das Ergebnis? Schreibe die
new-Zeile auf, bevor du an die Schleifen gehst.
b) Wohin wandert der Bildpunkt oben links? Und der oben rechts? Zeichne dazu ein kleines Gitter von 3 × 2 auf Papier und drehe es.
c) Setze es um.
Tipp 1: Die Form des Ergebnisses
int[][] neu = new int[pGrau[0].length][pGrau.length];
Die Zeilenzahl des Neuen ist die Spaltenzahl des Alten – und umgekehrt.
Tipp 2: Das 3 × 2 auf Papier
alt gedreht
A B C D A
D E F E B
F C
A steht bei alt[0][0] und landet bei neu[0][1]. D steht bei alt[1][0]
und landet bei neu[0][0]. Schreibe für beide die Indizes untereinander, dann
siehst du die Vorschrift.
Zum Weiterdenken
gespiegelt legt ein neues Gitter an. Das kostet Speicher – bei einem echten
Foto mit 12 Megapixeln immerhin einige Dutzend Megabyte.
a) Wie ließe sich waagerecht spiegeln, ohne ein zweites Gitter anzulegen?
b) Bis wohin darf die Schleife dann laufen? Was geht schief, wenn sie bis zum Ende läuft?
c) Warum funktioniert derselbe Trick beim Drehen um 90 Grad nicht, solange das Bild nicht quadratisch ist?