Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws2425:landkarten [2025/03/11 19:07] sebastianstannat |
ws2425:landkarten [2025/03/12 19:12] (aktuell) magdalena_lamprecht |
||
---|---|---|---|
Zeile 21: | Zeile 21: | ||
==Links== | ==Links== | ||
- | [[https://git.tu-berlin.de/les-citoyens-de-la-lumi-re|GitLab]] | + | [[https://git.tu-berlin.de/les-citoyens-de-la-lumi-re|GitLab]] \\ |
+ | [[https://git.tu-berlin.de/les-citoyens-de-la-lumi-re/landkarte/-/tree/main/Landkarte/2.0?ref_type=heads|Endprodukt]] | ||
==Aufgabenverteilung== | ==Aufgabenverteilung== | ||
+ | Innerhalb unseres Projekts haben wir uns gerade zu Anfang viel gemeinsam an Probleme gesetzt, sodass es keine klare Aufgaben grenze sondern mehr einzelne Probleme gab die wir gegenseitig lösen konnten. \\ | ||
====Dokumentation==== | ====Dokumentation==== | ||
Zeile 47: | Zeile 47: | ||
Als Wasserelemente wollten wir einerseits einen Meeresspiegel, andererseits Flüsse und Seen kreiren. \\ | Als Wasserelemente wollten wir einerseits einen Meeresspiegel, andererseits Flüsse und Seen kreiren. \\ | ||
Als Meeresspiegel haben wir die Höhe 0.3 gewählt. Für die Konturlinien wird wieder measure.find_contours() verwendet. \\ | Als Meeresspiegel haben wir die Höhe 0.3 gewählt. Für die Konturlinien wird wieder measure.find_contours() verwendet. \\ | ||
+ | |||
+ | ==Flüsse== | ||
In der Visualisierungs-Funktion kann nun die Anzahl der Wasserquellen festgelegt werden. Nun werden für diese Anzahl an Punkten ein zufälliger Punkt auf dem Grid als Flussquelle festgelegt. Da Flüsse meist in Gebirgen entstehen, haben wir hier festgelegt, dass die Quellen je eine Höhe von über 0.5 besitzen muss. \\ | In der Visualisierungs-Funktion kann nun die Anzahl der Wasserquellen festgelegt werden. Nun werden für diese Anzahl an Punkten ein zufälliger Punkt auf dem Grid als Flussquelle festgelegt. Da Flüsse meist in Gebirgen entstehen, haben wir hier festgelegt, dass die Quellen je eine Höhe von über 0.5 besitzen muss. \\ | ||
Für jeden dieser Ursprungspunkte wird nun ein Fluss erstellt. In der Funktion | Für jeden dieser Ursprungspunkte wird nun ein Fluss erstellt. In der Funktion | ||
Water.flussverlauf_erstellen() | Water.flussverlauf_erstellen() | ||
wird immer der niedrigste Nachbar eines Punktes gewählt und zum nächsten Teil des Flußverlaufs gemacht. Dies wird so lange gemacht, bis kein Nachbar des momentanen Punktes höher als dieser ist. Dieser Punkt ist dann das Ende des Flusses und an diesem Punkt entsteht dann ein potenzieller See. \\ | wird immer der niedrigste Nachbar eines Punktes gewählt und zum nächsten Teil des Flußverlaufs gemacht. Dies wird so lange gemacht, bis kein Nachbar des momentanen Punktes höher als dieser ist. Dieser Punkt ist dann das Ende des Flusses und an diesem Punkt entsteht dann ein potenzieller See. \\ | ||
+ | |||
+ | ==Seen== | ||
Zur Visualisierung des Flusses wird dann das in Pyglet enthaltene BezierCurve shape verwendet, um der natürlichen Form eines Flusses näher zu kommen. \\ | Zur Visualisierung des Flusses wird dann das in Pyglet enthaltene BezierCurve shape verwendet, um der natürlichen Form eines Flusses näher zu kommen. \\ | ||
Um die Höhe des Sees zu bestimmen wird die Funktion | Um die Höhe des Sees zu bestimmen wird die Funktion | ||
Zeile 59: | Zeile 63: | ||
Falls ein See Umriss jetzt länger als 64 ist, wird solange von der Höhe des Sees 0.01 abgezogen, bis die Länge des Sees unter 64 ist. \\ | Falls ein See Umriss jetzt länger als 64 ist, wird solange von der Höhe des Sees 0.01 abgezogen, bis die Länge des Sees unter 64 ist. \\ | ||
Was wir leider nicht mehr in der Zeit fertigstellen konnten war, dass aus den Seen dann wieder Flüsse entstehen. Das Problem, welches wir am Ende hatten war, dass der neu entstehende Fluss in vielen Fällen einfach wieder zurpck in die Mitte des Sees floss, anstatt weiter zu fließen. \\ | Was wir leider nicht mehr in der Zeit fertigstellen konnten war, dass aus den Seen dann wieder Flüsse entstehen. Das Problem, welches wir am Ende hatten war, dass der neu entstehende Fluss in vielen Fällen einfach wieder zurpck in die Mitte des Sees floss, anstatt weiter zu fließen. \\ | ||
- | |||
==Visualisierung== | ==Visualisierung== | ||
+ | Die Visualisierung Klasse hat nur eine Funktion, doch diese Funktion steuert die gesamte Generation. Diese Funktion ruft die heightmap-Funktion, sowie die water-Funktion und die Funktion zur Erstellung der Biome. \\ | ||
+ | Mithilfe dieser Funktion kann man auch noch einige Variablen verändern. CELL_SIZE ändert die Größe einer einzigen Zelle auf der Karte, xpix und ypix verändern die Anzahl an 'Zellen' im Grid. Die anzahl_wasserquellen-Variable bestimmt wie viele Wasserquellen auf der Karte generiert werden. Die abstand_linien-Variable gibt an in welchem Abstand die Höhenlinien gezeichnet werden soll. \\ | ||
+ | Außerdem übernimmt die Funktion auch das Einfärben der Karte und das Zeichnen der Batches mithilfe der | ||
+ | on_draw() | ||
+ | Funktion von Pyglet. Zuletzt hat diese Funktion noch eine | ||
+ | on_mouse_press() | ||
+ | Funktion. Wenn man auf die Karte clickt, werden die Koordinaten des Punktes, sowie die Höhe des Punktes gedruckt. \\ | ||
+ | ==Biome== | ||
+ | Um unterschiedliche Vegitationszonen in der Karte zu ermöglichen, erzeugt die Klasse Biomclass mehrere zufällig positionierte Biome wie folgt. Die Biomclass erstellt ein grid (2d array) mit den maßen der Karte, welches zunächst als Standartwert 'empty' hat. Der Standart wert wird dann vereinzelt bei zufälligen Punkten mit den strings der Biomnamen aus bioms(dict) überschrieben. Darauf werden die Biomen eine vordefinierte Anzahl an malen verbreitet. \\ | ||
+ | Die Ausbreitung verläuft anhand einer zufälligen Auswahl von Ausbreitungsverhalten. Das grid und bioms(dict) werden der Visualisierung übergeben. | ||
+ | Die Biome werden dann in der Visualisierung mithilfe einer Farbzuordnung, welche in der Biomclass definiert ist, gezeichnet. | ||
+ | Um weitere Landschaftsarten darzustellen besitzt die Biomclass eine Funktion | ||
+ | welttypen() | ||
+ | die als argument einen welttyp bekommt. Sollte die Funktion kein welttypen bekommen oder einen den sie nicht kennt, wird einer der Optionen per zufall ausgewählt. Der Welttyp wirkt sich nur auf die Höhen werte der Karte aus und hat kein Einfluss auf die Biome. \\ | ||
===Fazit=== | ===Fazit=== | ||
+ | Wir haben im verlauf des Projekts erst gemerkt, wie kompliziert Probleme sein können, die sehr einfach wirken. Und wir haben gemerkt, wie wichtig es ist sich regelmäßig wieder zusammenzu finden und sich über Probleme und den Stand der eigenen Aufgaben auzutauschen. So wissen alle wer wo steht und welche Probleme man gemeinsam angehen sollte.\\ Gruppenmitglieder, die parallel noch andere Programiersprachen gelernt haben, waren sehr überzeugt von der Syntax in Python.\\ | ||
=== Quellen/Literatur === | === Quellen/Literatur === | ||
Erste [[https://watabou.github.io/|Inspiration]]\\ | Erste [[https://watabou.github.io/|Inspiration]]\\ | ||
+ | https://de.wikipedia.org/wiki/Perlin-Noise\\ | ||
Perlin-Noise-Paket [[https://pypi.org/project/perlin-noise/|hier]]\\ | Perlin-Noise-Paket [[https://pypi.org/project/perlin-noise/|hier]]\\ | ||
+ | https://de.wikipedia.org/wiki/B%C3%A9zierkurve\\ | ||