Menu Close

Programmieren, Algorithmen und Datenstrukturen 2 (Vorlesung 7)

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:
    1. Wir zeichnen immer von Links nach Rechts. Einschränkung der möglichen nächsten Punkte ( – 3 Punkte )
    2. 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 )
    3. 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

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.

Index