PVL 5 - Canvas

PVL 5 - Canvas (5+2 Punkte)
Abgabe bis 7.2.2016
Gegeben sei ein (zweidimensionales) kartesisches Koordinatensystem K, das die Position von Punkten
durch die Menge ganzzahliger Koordinaten im Intervall [–999,999] beschreibt.
Des Weiteren sei eine Zeichenfläche (Canvas) in K gegeben, die lediglich einen Ausschnitt von K im
ersten Quadranten umfasst. Für die x-Koordinaten im Canvas gelte der Wertebereich [0,WIDTH–1] und
für die y-Koordinaten [0,HEIGHT–1].
In diesen Canvas können Punkte an gültigen Koordinaten gezeichnet werden.
Der Canvas soll pseudografisch mit Hilfe eines zweidimensionalen Feldes von Zeichen visualisiert
werden. Hierzu werde die Existenz eines Punktes im Canvas durch ein '*'-Zeichen ausgedrückt. Die
Nichtexistenz eines Punktes werde mit Hilfe eines '.'-Zeichens symbolisiert.
Dr. Frank Seifert
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
22
PVL 5 - Teilaufgaben
a) Schreiben Sie eine Funktion clearCanvas(…), die einen Canvas so initialisiert, dass er
keine Punkte enthält.
b) Schreiben Sie eine Funktion drawCanvas(…), die einen Canvas auf dem Bildschirm
ausgibt. Hierbei sollen alle Punkte mit gleicher y-Koordinate in einer Textzeile ausgegeben
werden. Punkte mit verschiedenen y-Koordinaten müssen in verschiedenen Textzeilen
ausgegeben werden. Achten Sie hierbei auf eine grafische Entsprechung der
Punktpositionen der Textausgabe zu den Punktpositionen im Koordinatensystem.
c) Schreiben Sie eine Funktion drawline(…), die für eine via Start- und Endpunkt
gegebene Linie l das Zeichnen dieser Linie simuliert, indem sie die nächstliegenden
Punkte von l in K findet und diese zeichnet, falls sich die Koordinaten des jeweils zu
zeichnenden Punktes innerhalb des Canvas befinden.
Dr. Frank Seifert
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
23
PVL 5 - Programm
Schreiben Sie ein Programm, das eine Folge ganzer Zahlen von der Tastatur einliest und diese wie folgt
verarbeitet:
• jeweils zwei aufeinanderfolgende Zahlen stellen die (x,y)-Koordinaten eines Punktes dar.
• der jeweils erste gelesene Punkt definiert den Startpunkt einer Linie l
• der jeweils zweite gelesene Punkt definiert den Endpunkt der Linie l
• Sobald Start- und Endpunkt von l komplett eingelesen wurden, zeichnen Sie l unter Nutzung der
Funktion drawline() und fahren anschließend mit der weiteren Verarbeitung der eingegebenen
Zahlenfolge fort
• die Eingabefolge wird terminiert durch Eingabe eines Werts für die x-Koordinate des Startpunkts von l,
der außerhalb des zulässigen Wertebereichs liegt. Geben Sie in diesem Fall den Canvas mit Hilfe der
Funktion drawCanvas() komplett auf dem Bildschirm aus. Leeren Sie anschließend den Canvas
durch Aufruf der Funktion clearCanvas() und starten Sie den Programmdurchlauf erneut.
Dr. Frank Seifert
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
24
PVL 5 - Hinweise
• Der Euklidische Abstand zweier direkt benachbarter Punkte einer Linie darf nicht größer als √2 sein, d.h. dass
sich diese Punkte direkt neben- oder übereinander befinden bzw. diagonal aneinander grenzen müssen.
• Jeder Punkt einer Linie darf maximal zwei direkt horizontal, vertikal oder diagonal angrenzende Punkte auf
derselben Linie haben.
• Die Start- und / oder Endpunkte der Linien können auch außerhalb des Canvas liegen. Obwohl außerhalb
des Canvas liegende Punkte nicht dargestellt werden können, müssen Sie jedoch für die korrekte
Positionsberechnung der im Canvas liegenden Punkte einer Linie berücksichtigt werden.
• Sie dürfen keine Annahmen bzgl. der Lage von Start- und Endpunkt einer Linie zueinander treffen.
• Fehlerhafte Eingabedaten müssen Sie nicht abfangen. Sie können davon ausgehen, dass die Eingabe
ausschließlich aus einer Folge von durch Leerzeichen separierten Integerzahlen besteht.
• Zulässige Bibliotheksfunktionalität: scanf(), printf() / putchar() und der boolesche Datentyp
• Nutzen Sie als Grundgerüst Ihrer Implementierung das Programmfragment der Folgefolie, das Sie um Ihre
Lösungen der jeweiligen Funktionen ergänzen. Nutzen Sie bereits deklarierte Datentypen und Funktionen
unverändert. Bei Bedarf können Sie sich natürlich gern weitere Funktionen und Datentypen definieren.
• Für das Erkennen und Behandeln besonderer Situationen können Sie bis zu zwei Zusatzpunkte erhalten.
Dr. Frank Seifert
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
25
PVL 5 - Programmgerüst
#include <stdio.h>
#include <stdbool.h>
#define WIDTH 80
#define HEIGHT 40
// Breite des Canvas
// Höhe des Canvas
struct LINE {
int x1;
int y1;
int x2;
int y2;
};
typedef struct LINE LINE;
void drawLine(char canvas[WIDTH][HEIGHT], LINE l) { … }
void clearCanvas(char canvas[WIDTH][HEIGHT]) { … }
void drawCanvas(char canvas[WIDTH][HEIGHT]) { … }
int main() {
char canvas[WIDTH][HEIGHT];
…
clearCanvas(canvas);
… // Einlesen der Zahlenfolge und Zeichnen der Linien mittels drawline()
drawCanvas(canvas);
…
return 0;
}
Dr. Frank Seifert
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
26
PVL 5 - Beispiel
Dr. Frank Seifert
Linienkoordinaten: 10 10 35 35 35 35 45 5 45 5 10 10 100 -5 40 50 12345
....................................................*...........................
.....................................................*..........................
......................................................*.........................
Ungültige
.......................................................*........................
...................................*....................*.......................
Koordinate
..................................**.....................**.....................
bewirkt
.................................*..*......................*....................
Ausgabe
................................*...*.......................*...................
...............................*....*........................*..................
des
..............................*......*........................*.................
Canvas
.............................*.......*.........................*................
............................*........*..........................*...............
...........................*..........*..........................*..............
..........................*...........*...........................*.............
.........................*............*............................*............
........................*..............*............................*...........
.......................*...............*.............................**.........
......................*................*...............................*........
.....................*..................*...............................*.......
....................*...................*................................*......
Start- und Endpunkt
...................*....................*.................................*.....
..................*......................*.................................*....
dieser Linie liegen
.................*.......................*..................................*...
außerhalb des Canvas
................*........................*...................................*..
...............*..........................*...................................*.
..............*...........................*....................................*
.............*............................*.....................................
............*..............................*....................................
...........*...............................*....................................
..........****.............................*....................................
..............*******.......................*...................................
.....................*******................*...................................
............................*******.........*...................................
...................................*******...*..................................
..........................................****..................................
................................................................................
................................................................................
................................................................................
................................................................................
................................................................................
Hausaufgaben Algorithmen & Programmierung WS 2014/2015
27