Organisatorisches:
- Die Vorlesungs-begleitenden Quellcodes und Skripte haben ein Update erhalten und stehen zum Download bereit
- Errata und Verbesserungsvorschläge können per E-Mail an Herrn Skroch gesandt werden („Wer Fehler findet und meldet wird belohnt.“)
Figuren
- Auch wenn die Darstellung, die wir in diesem Beispiel haben sehr einfach gehalten ist, zeigt sie das Grundprinzip der meisten komplexeren Graphischen Darstellungen
- Ein Bildschirmpunkt ist definiert durch zwei Koordinaten ↔ frame [x][y]
- Die Ausgabe von Figuren erfolgt durch die Konsole ( monochromes Resultat )
Shape:
- Struktur:
- Shape ist eine abstrakte Basisklasse
- Diese Basisklasse hat die abgeleitete Klassen:
- Linie ( Bresenham Algorithmus → Bestimmung mittels 2 Punkten )
- Rechteck
- Quadrat
- Standardkonstruktor:
- „next“ wird auf den Anfang der Liste (list) gesetzt, diese Liste wird mit „this“ initialisiert
- Attribute:
- list ist eine Liste für alle Shape-Objekte, die static gekennzeichnet ist und somit nur beim ersten mal initialisiert wird ( außerhalb der Klasse! )
Abstrakte und abgeleitete Klassen
- Abstrakte Klassen haben mindestens eine rein virtuelle Methode, die mit „0“ initialisiert wird
- Wir leiten abgeleitete Klassen für unserer Lehrveranstaltungen immer „public“ ab.
Namenskonventionen:
- Die Namen von Klassen beginnen mit großen Buchstaben ( „Shape“ )
- Die Namen von Methoden und Attributen beginnen mit kleinen Buchstaben ( „draw“ )
Figurentyp: Linie:
- Struktur:
- Es werden 2 Punkte ( Start und Ende ) auf unserem Raster angegeben (Jeder hat eine x- und eine y-Koordinate) ↔ 4 int Variablen
- Methoden:
- set-Methode zum ändern der Koordinaten
- Die rein virtuellen Methoden „draw“ und „move“ werden hier überschrieben
- „draw“ = Ausgeben der Linie
- „move“ = Verschieben der Linie
- + H = Linie →
- – H = Linie ←
- + V = ↑
- – V = ↓
- Konstruktoren:
- Standardkonstruktur setzt alle attribute auf 0 ( 0, 0, 0, 0)
- Anderer Konstruktor setzt alle Attribute entsprechend der übergebenen Werte
Bresenham-Algorithmus
- Eine Linie wird annähernd dargestellt, indem der kürzeste Weg über das Raster vom einen zum anderen Punkt.
- Es gibt 8 mögliche Startrichtungen zum Zeichnen. Diese werden durch die Vorbedingungen auf 2 reduziert.
- Die Performance-Anforderungen des Zeichnens sind von der Größe des Rasters und der erforderlichen Frames per Second abhängig
- Vorbedingungen:
- Wir zeichnen immer von Links nach Rechts. Einschränkung der möglichen nächsten Punkte ( – 3 Punkte )
- Wenn die y-Koordinate des Endpunktes kleiner ist, als die des Startpunktes, werden die Vorzeichen beider Werte umgedreht setzen dafür einen Merker ( – 2 Punkte )
- Falls die Linie steiler als 45 Grad verläuft, spiegeln wir alles an 45 Grad und merken uns dies auch ( – 1 Punkt )
- Entscheidungskriterium:
- Es soll nur das Kriterium der Vorlesung verwendet werden. Das Beispiel von Wikipedia ist bereits optimiert und „zu gut“ für die Vorlesung.
- true: gehe nach rechts, positives Inkrement 2dY
- false: gehe nach rechts-oben, negatives Inkrement 2(dY-dX)
( end_Ycoord - start_Ycoord ) * 2 < ( end_Xcoord - start_Xcoord)
Figurentyp: Rechteck
- Ein Rechteck besteht aus 4 geraden Linien
- Über Rechteck lassen sich keine Drachen, Trapeze, etc. darstellen
- Die Seiten werden beschrieben als: Nordkante, Südkante, Westkante und Ostkante
- sw-Kante
- ne-Kante
- Durch die Übergabe von 2 Ecken ist das Rechteck schon definiert
Figurentyp: Quadrat
- Quadrat bzw. Square erbt von Rechteck, aber man soll auch bedenken:
- Liskov-Prinzip: „Ein Quadrat ist kein Rechteck, da nicht alle Methoden eines Rechtecks auf ein Quadrat angewandt werden können.“ → Zu diesem Gebiet gibt es geteilte Meinungen
Konstruktoren
- Die Attribute werden nicht nach der Reihenfolge innerhalb der Memberinitialisiererliste initialisiert, sondern nach der Reihenfolge ihrer Deklarierung innerhalb der Klasse