16. Übung Erstellen einer prozeduralen Windows-Anwendung mit GDI Es soll eine prozedurale Windows-Anwendung mit graphischer Ausgabe entwickelt werden. Die graphischen Ausgaben erfolgen über das GDI. Auf einem leeren Fenster sollen drei Punkte durch den Mauscursor definiert werden. Danach wird das Sierpinski-Dreieck für das definierte Dreieck gezeichnet. Die folgenden Abbildungen zeigen das Endergebnis dieser Übung: 1. Das leere Ausgangsfenster: 2. Die Definition des ersten Punktes: Die Auswahl erfolgt über die Position des Mauscursor und dem Drücken der linken Maustaste. 3. Die Definition des zweiten Punktes: 4. Die Ausgabe des Sierpinski-Dreiecks nach der Definition des dritten Punktes: Nachdem der dritte Punkt definiert wurde, wird das Sierpinski-Dreieck gezeichnet. Das Konstruktionsverfahren für die Sierpinski-Kurve wird nachstehend erklärt. Das Konstruktionsverfahren des Sierpinski-Dreiecks Beim der Sierpinski-Kurve handelt es sich um ein Fraktal. Bekannte Fraktale sind unter anderem die Kochkurve (Schneeflocken-Kurve) oder die Mandelbrotmenge. Bei Fraktalen handelt es sich meist um rekursive Strukturen die Selbstähnlichkeit zeigen. Auch die Sierpinski-Kurve besitzt diese Eigenschaften. Das Konstruktionsverfahren 1. Ausgegangen wird von den Ausgangspunkten, die ein Dreieck bilden 2. Die drei Seiten des Dreiecks werden jeweils halbiert. Daraus entstehen drei neue Punkte an den Kanten des Dreiecks: A’, B’, C’ 3. Über Vektorrechnung können die Punkte auf den Kanten berechnet werden. Dazu ist nur eine einfache Vektorrechnung nötig. Gegeben sind die drei Ortsvektoren der Eckpunkte des Dreiecks: A, B, C Aus Vektorrechnung ergibt sich für die Ortsvektoren der neuen Punkte: BA AC CB A' A bzw. B' B bzw. C ' C 2 2 2 4. Die neu gewonnen Punkte an den Kanten werden zu jeweils drei inneren Dreiecken verbunden. 5. In der nächsten Iteration werden die Kanten an den neu gewonnen Dreiecke wieder nach gleichem Schema (wie unter Punkt 3) halbiert. 6. Diese neu entstandenen Punkte werden wieder miteinander verbunden. Dieses Schema lässt sich nun mehrmals vorsetzen. Für ein Rechnerprogramm terminiert dieser Algorithmus nach n Schritten (z.B. n=5). Für die Implementierung wird ein rekursiver Algorithmus vorgeschlagen, welcher nach n Rekursionsabstiegen terminiert. Bemerkung: Das Zeichnen der Kanten der Dreiecke sollte auf der untertesten Rekursionsebene erfolgen. Auf dieser Ebene sind die kleinsten Dreiecke zu zeichnen, welche sich dann im Gesamtbild zum Sierpinski-Dreieck zusammensetzen. Die Implementierung 1. Starte Microsoft Visual Studio .NET 2003 2. Erstellen einer prozeduralen Windows-Anwendung Unter VS ist ein neue Win32-Projekt zu erstellen: Datei Neu Projekt Win32Projekt Nach der Angabe des Projektnamens wird auf „OK“ gedrückt und der anschließende Dialog mit „Fertig stellen“ beendet. 3. Einfügen der Anwendungslogik Die Anwendungslogik ist nun in den Quellcode einzufügen. In der Routine WndProc kann auf Ereignisse reagiert werden (wie z.B. „linke Maustaste gedrückt“). So besteht in der WndProc die Möglichkeit, die gewünschten Aktionen auszuführen. Tipps zur Vorgehensweise Die Anwendung kann in zwei Schritten implementiert werden. 1. Zeichnen der Punkte Im ersten Schritte sollen die vom Benutzer durch die Maus definierten Punkte durch schwarz-gefüllte Kreise dargestellt werden. Zeichenroutinen und weitere Funktionen zur Windows-Programmierung finden sich im Skript unter 6.1.2. Sehr hilfreich ist das Beispiel unter 6.1.3 2. Zeichnen des Sierpinski-Dreiecks: Nachdem drei Punkte vom Benutzer definiert worden sind, kann das SierpinskiDreieck gezeichnet werden. Dies geschieht nach dem oben beschriebenen Schema. Im ersten Schritt muss das Dreieck dabei nicht die Farben des Beispiels annehmen, sondern sollte einfach mit schwarzer Farbe dargestellt werden. Die Farbgebung ist somit optional.