Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Spie­geln und Dre­hen

Erste Dop­pel­stun­de

Ziele

  • Java: De­kla­ra­ti­on und Ver­wen­dung von zwei­di­men­sio­na­len Ar­rays
  • Bild­be­ar­bei­tung: geo­me­tri­sche Bild­ope­ra­tio­nen

Di­dak­ti­sche Über­le­gun­gen

Ver­wen­dung von Ar­rays

Ein­di­men­sio­na­le Ar­rays wur­den schon in Klas­se 9 be­han­delt. Die SuS müss­ten den Um­gang be­herr­schen. Um an die In­hal­te aus Klas­se 9 an­zu­knüp­fen, wer­den die grund­le­gen­den Ope­ra­tio­nen im ein­di­men­sio­na­len Array wie­der­holt und auf ein zwei­di­men­sio­na­les Color-Array über­tra­gen. Dabei wer­den zu­nächst nur vor­de­fi­nier­te Far­ben (z.B. Color.​BLACK) ge­nutzt, um das Farb­mo­dell noch nicht the­ma­ti­sie­ren zu müs­sen. Es wird auch nicht er­wähnt, dass BLACK eine sta­ti­sche Kon­stan­te der Klas­se Color ist. Ohne auf die De­tails ein­zu­ge­hen, wer­den aber von An­fang an die Be­griff Klas­se und Ob­jekt kor­rekt be­nutzt.

Ent­schei­dend für die Ver­ar­bei­tung von zwei­di­men­sio­na­len Ar­rays sind ver­schach­tel­te For-Schlei­fen, die den SuSn auch schon aus Klas­se 9 be­kannt sein soll­ten. Zum Zeich­nen der op­ti­schen Täu­schun­gen wur­den sie oft­mals ein­ge­setzt. Trotz­dem soll­te noch­mals be­spro­chen wer­den, wie diese Schlei­fen ar­bei­ten. Durch die Auf­ga­be, x und y bei den Schlei­fen­durch­gän­gen an­zu­ge­ben, wird der Ab­lauf noch­mals ver­deut­licht.

Geo­me­tri­sche Bild­ope­ra­tio­nen

Der Ein­stieg mit einem Bei­spiel­pro­gramm ver­mei­det das auf­wän­di­ge Er­klä­ren der zur Ver­fü­gung ste­hen­den Me­tho­den der Klas­se Pic­tu­re. Aus dem Pro­gramm­schnip­sel wird die Be­nut­zung so­fort klar. Die Struk­tur die­ser Me­tho­de wird für alle wei­te­ren Bild­be­ar­bei­tungs­ope­ra­tio­nen über­nom­men. Au­ßer­dem för­dert die Ana­ly­se von frem­dem Code das Ver­ständ­nis für Al­go­rith­men, ohne auf Syn­tax­pro­ble­me zu sto­ßen.

Bei den geo­me­tri­schen Bild­ope­ra­tio­nen (hier ho­ri­zon­ta­le Spie­ge­lung) wären zwei Vor­ge­hens­wei­sen denk­bar:

  1. x und y geben die Po­si­ti­on des neuen Pi­xels an:

    pixelNeu[x][y] = pixel[(breite-1)-x][y];
  2. x und y geben die Po­si­ti­on des Pi­xels im Ori­gi­nal­bild an.

    pixelNeu[(breite-1)-x][y] = pixel[x][y];

Va­ri­an­te 2 passt bes­ser zu der Vor­stel­lung, dass die alten Pixel auf eine neue Po­si­tio­nen ver­scho­ben wer­den. Dies setzt aber vor­aus, dass jedes Pixel auf genau eine neue Po­si­ti­on ab­ge­bil­det wird. Das ist bei der oben zu se­hen­den Spie­ge­lung der Fall, aber im All­ge­mei­nen nicht. Bei einer Ver­grö­ße­rung oder Ver­klei­ne­rung des Bil­des oder auch beim Dre­hen eines Bil­des gilt dies nicht. Dort muss für jedes Pixel ent­schie­den wer­den, wie die Farbe er­mit­telt wird. Das kann z.B. mit nea­rest Neigh­bor-Ver­fah­ren oder mit bi­li­nea­rer In­ter­po­la­ti­on ge­sche­hen. Daher wird hier von An­fang an die Va­ri­an­te 1 be­vor­zugt. Durch ge­eig­ne­te Auf­ga­ben sol­len die SuS sich diese Zu­sam­men­hän­ge selbst er­schlie­ßen. Ins­be­son­de­re bei den Dre­hun­gen ist dies nicht ganz so ein­fach. Daher wird zu­nächst die Spie­ge­lung be­han­delt. Hier wird die Idee "(brei­te-1)-x" schon an­ge­legt.

Im­ple­men­ta­ti­on in BlueJ

In BlueJ ar­bei­ten die SuS mit einem vor­ge­ge­be­nen Pro­jekt. Die­ses Pro­jekt stellt die Klas­sen Bei­spiel­bild und Geo­me­tri­sche­Bild­ope­ra­tio­nen be­reit. Bei­spiel­bild ist eine Un­ter­klas­se von Pic­tu­re. Die Klas­sen Pic­tu­re, Pic­tu­re­View­er, HSB und ei­ni­ge wei­te­re hier nicht be­nö­tig­te Klas­sen sind ein Paket von Klas­sen die von der ZPG IMP be­reit ge­stellt wer­den (Un­ter­ord­ner IMP).

Die Klas­se Pic­tu­re wurde schon in Klas­se 9 für das Zeich­nen von op­ti­schen Täu­schun­gen ein­ge­setzt und stellt die meis­ten Zei­chen­be­feh­le zur Ver­fü­gung, die es auch in Pro­ces­sing gibt. Zu­sätz­lich gibt es die Me­tho­den get­Pi­xelAr­ray und set­Pi­xelAr­ray, die das Bild als zwei­di­men­so­na­les Array zu­rück­ge­ben bzw. das Bild gemäß dem Pi­xelar­ray set­zen. In Pro­ces­sing lie­fern die ent­spre­chen­den Me­tho­den ein ein­di­men­sio­na­les Pi­xelar­ray. Soll­te wei­ter­hin Pro­ces­sing ein­ge­setzt wer­den, müss­te den SuSn eine Me­tho­de zum Um­wan­deln in ein zwei­di­men­sio­na­les Array zur Ver­fü­gung ge­stellt wer­den.

Zu­sätz­lich gibt es eine Klas­se Pic­tu­re­View­er, die ein Ob­jekt der Klas­se Pic­tu­re in einem Frame dar­stel­len kann. Bei Er­stel­len eines neuen Bil­des wird au­to­ma­tisch ein Pic­tu­re­View­er-Ob­jekt er­zeugt und das Bild an­ge­zeigt. Durch das Scroll­rad kann das Bild ver­grö­ßert oder ver­klei­nert dar­ge­stellt wer­den. Spä­ter wird bei der Er­stel­lung eines gra­phi­schen User-In­ter­faces (GUI) eine ver­än­der­te Pic­tu­re­View­er-Klas­se ver­wen­det, die ein Bild in einer GUI an­zei­gen kann, an­sons­ten aber die glei­chen Me­tho­den be­reit­stellt.

Die Klas­se HSB ver­ein­facht die Um­rech­nung von Color-Ob­jek­ten in HSB-Werte (vgl. Farb­mo­dell).

Die SuS ar­bei­ten mit BlueJ nach fol­gen­dem Sche­ma:

Sie er­zeu­gen ein Ob­jekt der Klas­se Bei­spiel­bild (Rechtsklick auf den Klas­sen­na­men). Da­durch ent­steht ein Ob­jekt der Klas­se Bei­spiel­bild.

Beispielbild

Bild­quel­le: Bei­spiel­bild von ZPG IMP [CC BY-SA 4.0 DE], aus 01_al­g_­un­ter­richts­ver­lauf.pdf, be­ar­bei­tet

Bei die­sem Ob­jekt kann man mit der rech­ten Maus­tas­te wei­te­re Me­tho­den auf­ru­fen. Zum Bei­spiel kann man mit load(String da­tei­na­me) ein an­de­res Bild laden (Ach­tung: Strings mit An­füh­rungs­zei­chen ein­ge­ben: z.B. "bei­spiel2.png", alle Bil­der müs­sen im Un­ter­ord­ner images lie­gen). Unter "in­heri­ted from Pic­tu­re" fin­den sich wei­te­re Me­tho­den der Klas­se Pic­tu­re, mit denen man z.B. auf dem Bild malen oder seine Größe her­aus­fin­den kann. Au­ßer­dem ist dort auch die Me­tho­de get­Pi­xelAr­ray().

Mit "Get" kann man die­ses zwei­di­men­sio­na­le Array als Ob­jekt be­kom­men. In­spi­ziert man die­ses Ob­jekt kann man gut den Auf­bau eines zwei­di­men­sio­na­len Ar­rays als Array von Ar­rays er­ken­nen.

Array als Objekt

Bild­quel­le: Array als Ob­jekt von ZPG IMP [CC BY-SA 4.0 DE], aus 01_al­g_­un­ter­richts­ver­lauf.pdf, be­ar­bei­tet

Man kann auch mit dem Code­pad von BlueJ (Menü View -> Show Code Pad) ge­zielt ein­zel­ne Pixel ver­än­dern, wenn man zu­nächst mit dem Be­fehl im­port java.​awt.​Color; die Color-Klas­se im­por­tiert hat:

import java.awt.Color;
pixel[2][3] = new Color(231, 23,123);

Setzt man im Bei­spiel­bild die Pixel mit set­Pi­xelAr­ray neu, dann sieht man die vor­ge­nom­me­nen Än­de­run­gen. Even­tu­ell kann man dies nach den ers­ten Auf­ga­ben zu den Ar­rays ma­chen.

Beispiel 1

Bild­quel­le: Bei­spiel 1 von ZPG IMP [CC BY-SA 4.0 DE], aus 01_al­g_­un­ter­richts­ver­lauf.pdf, be­ar­bei­tet

Nor­ma­ler­wei­se wer­den aber keine ein­zel­nen Pixel ver­än­dert, son­dern Al­go­rith­men zur Bild­be­ar­bei­tung im­ple­men­tiert, die sich auf das ganze Bild aus­wir­ken.

In der Klas­se "geometrischeBild­opera­tionen" ist ein ers­tes Bei­spiel (Spie­ge­lung) im­ple­men­tiert. Er­zeugt man ein Ob­jekt der Klas­se Bei­spiel­bild und ein Ob­jekt der Klas­se geo­me­tri­sche Bildopera­tionen, kann man die im­ple­men­tier­te Ope­ra­ti­on auf das Bild an­wen­den (Rechtsklick auf geo­me­tri1).

Beispiel 1

Bild­quel­le: Bei­spiel 2 von ZPG IMP [CC BY-SA 4.0 DE], aus 01_al­g_­un­ter­richts­ver­lauf.pdf, be­ar­bei­tet

Als Pa­ra­me­ter gibt man den Namen des Bild-Ob­jek­tes (bei­spiel1) an. Das Er­geb­nis wird so­fort an­ge­zeigt. Möch­te man mit die­sem Bild wei­te­re Ope­ra­tio­nen durch­füh­ren, gibt man ihm mit "Get" einem Namen (z.B. bei­spiel2). Das neue Ob­jekt taucht in der Ob­jekt­leis­te auf.

Nach­dem die SuS ei­ni­ge Über­le­gun­gen zu den Pi­xel­po­si­tio­nen an­ge­stellt haben, im­ple­men­tie­ren sie wei­te­re geo­me­tri­sche Bild­ope­ra­tio­nen.

Am Ende schließt sich die Im­ple­men­ta­ti­on einer Me­tho­de an, die die neuen Me­tho­den nutzt, um eine wei­te­re Fä­hig­keit (Dre­hen um 180°) zu rea­li­sie­ren. Hier­zu müs­sen die in BlueJ von Hand durch­ge­führ­ten Ope­ra­tio­nen in Quell­text um­ge­setzt wer­den.

 

Un­ter­richts­ver­lauf: Her­un­ter­la­den [odt][154 KB]

Un­ter­richts­ver­lauf: Her­un­ter­la­den [pdf][233 KB]

 

Wei­ter zu RGB-Farb­mo­dell und Fal­tun­gen