Wasserlauf
-
Hi Leutz,
Also ich hab ne 2dimArray erstellt mit Höheninformationen. In jedem Feld ist die Höhe angegeben. Jetzt will ich von irgendeinem Punkt einen Fluss runterlaufen lassen.
Das ist eigentlich kein Problem. Man braucht nur ne rekursive Funktion zu erstellen die checkt welcher umliegende Punkt "tiefer" liegt als der Aktuelle.
Das kann aber zu einem Problem führen wenn man in einer Senke landet und es keinen "tieferen" Punkt gibt. Sprich das ein See entstehen muss.
Hmm. Mein Problem liegt jetzt daran das ich nicht weiß wie ich einen "See" programmieren soll....
Benutze C++.
Hat einer einen Tip für mich?
Kei
-
Speicher in deinem 2dimArray einfach noch die Wasserhöhe, die sich dann tropfenweise erhöht, wenn das wasser in nem Loch gelandet ist, so dass sich das Loch mit Wasser füllt und dann irgendwo am rand des Lochs(=See) irgendwann weiterfließen kann.
-
hmm du meinst ich soll noch ne Höheninformation speichern. Und wenn ich beide addiere dann kann ich sozusagen checken wo Wasser schon ist und dann eventuell an einer benachbarten Stelle noch ein Wassertropfen hinzufügen?
Hmm. So ein See kann recht groß sein wie kann ich sichergehen das alle bereiche des Sehes "ausgefüllt" sind? Es könnte ja sein das Fluss zufällig recht früh weiterfließen kann. Könnte dann nicht eine "Wasserwand" entstehen die einfach in der Luft hängt?
Ich hab mal ne Skitze gemacht. Die erste ist nur die Höheninformation. Die zweite Stellt den Flusslauf bevor er gestaut werden muss. Und das dritte ist dann das letztendliche Ergebnis das rauskommen müsste.
9 9 9 9 9
9 8 5 5 7
9 7 4 3 9
9 8 6 7 9
9 9 9 9 9Fluss durch "0" dargestellt:
9 9 9 9 9
0 0 0 5 7
9 7 0 0 9
9 8 6 7 9
9 9 9 9 9Wasser wieder durch "0" dargestellt:
9 9 9 9 9
0 0 0 0 0
9 0 0 0 9
9 8 0 0 9
9 9 9 9 9Kei
-
Hi Leutz,
ich hab mich mal dran gesetzt und 2 Methoden ausgearbeitet die aber leider nicht so toll funktionieren.
Beide kann man für verschiedene Zwecke einsetzen aber nicht für mein Problem (einen Fluss zu generieren - inklusive Seen).
Methode 1: Methode 1 tut den "Meeresspiegel erhöhen". Vom Programmablauf sollte es eigentlich weiterverwendbar sein. Das Problem liegt aber darin das ich nicht weiß wie Groß der "eventuelle" See wird...
Methode 2: Das ist eigentlich der Code der den Flusslauf berechnen soll. Problem ist das - wenn eine Senke kommt (also ein See entstehen soll) - nicht weiter berechnet werden kann... Im Beispiel hab ich 2 Flüsse machen lassen. Der erste fließt schön ins Meer der Zweite bricht ab wenn es nicht weitergeht...
Hab mir einer einen Vorschlag wie ich alles weitermachen kann?
Kei
______________________________________________________
Methode 1:
mail.cpp#include <iostream.h> #include <stdlib.h> #include "see.hpp" using namespace std; int main(int argc, char *argv[]) { see* wasser = new see(); delete wasser; system("PAUSE"); return 0; }
see.hpp
class see { private: //See Koordinaten int sK[10][15]; //Starte mit der Seeerstellung void createSee(void); //ausgabe des aktuellen Sees void showSee(void); public: see(void); ~see(void); };
see.cpp
#include <iostream.h> #include "see.hpp" void see::showSee(){ for(int k=0; k<10; k++){ for(int j=0; j<15; j++){ cout << sK[k][j] << " "; } cout << endl; } } void see::createSee(){ //höhe int h=0; //umgebungen int xPl; int xMi; int yPl; int yMi; while(h < 6){ for(int y=1; y<9; y++){ yPl = y+1; yMi = y-1; for(int x=1; x<14; x++){ xPl = x+1; xMi = x-1; if(sK[yMi][xMi] <= h){ sK[yMi][xMi]++; } if(sK[yMi][x] <= h){ sK[yMi][x]++; } if(sK[yMi][xPl] <= h){ sK[yMi][xPl]++; } if(sK[y][xMi] <= h){ sK[y][xMi]++; } if(sK[y][x] <= h){ sK[y][x]++; } if(sK[y][xPl] <= h){ sK[y][xPl]++; } if(sK[yPl][xMi] <= h){ sK[yPl][xMi]++; } if(sK[yPl][x] <= h){ sK[yPl][x]++; } if(sK[yPl][xPl] <= h){ sK[yPl][xPl]++; } } } h++; } } see::see(){ //see Ausgangsansicht int sA[10][15] = { {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, {8,1,1,1,1,1,1,1,1,1,1,1,1,1,9}, {9,1,1,1,1,1,1,1,1,1,1,1,1,1,9}, {9,1,1,1,1,1,1,1,6,6,6,1,1,1,7}, {9,1,1,1,1,1,1,7,7,7,6,1,1,1,9}, {9,1,1,1,1,1,1,7,8,7,1,1,1,1,9}, {9,1,1,1,1,1,1,7,7,1,1,1,1,1,9}, {9,1,1,1,1,1,1,1,1,1,1,1,1,1,9}, {9,1,1,1,1,1,1,1,1,1,1,1,1,1,9}, {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9} }; for(int k=0; k<10; k++){ for(int j=0; j<15; j++){ sK[k][j] = sA[k][j]; } } createSee(); showSee(); } see::~see(){ }
______________________________________________________
Methode 2:
main.cpp#include <iostream.h> #include <stdlib.h> #include "see.hpp" using namespace std; int main(int argc, char *argv[]) { see* wasser = new see(); delete wasser; system("PAUSE"); return 0; }
see.hpp
class see { private: //Map Koordinaten int map[9][9]; //Fluss int fluss[9][9]; //Starte mit der Flusserstellung int createFluss(int,int,int); //ausgabe der Karte void showMap(void); public: see(void); ~see(void); };
see.cpp
#include <iostream.h> #include "see.hpp" void see::showMap(){ cout << "Map" << endl; for(int k=0; k<9; k++){ for(int j=0; j<9; j++){ cout << map[k][j] << " "; } cout << endl; } cout << endl << "Map & Fluss" << endl; for(int k=0; k<9; k++){ for(int j=0; j<9; j++){ if(fluss[k][j] != 0){ cout << "~" << " "; }else{ cout << map[k][j] << " "; } } cout << endl; } } int see::createFluss(int x, int y, int flussNr){ /* Tut einen Flusslauf entstehen lassen */ //Wird das Meer erreicht ist der Flusslauf an sein Ende gelangt if(map[y][x] < 1){ return 1; } //Für das aktuelle Feld den Flusspunkt deffinieren fluss[y][x] = flussNr; //Berechnet den nächsten Punkt an dem der Fluss weiterfließt //Flusslauf nach Norden if( map[y][x] >= map[y-1][x] && fluss[y-1][x-1] == 0 && fluss[y-1][x] == 0 && fluss[y-1][x+1] == 0 ){ createFluss(x, y-1, flussNr); } //Flusslauf nach Osten if( map[y][x] >= map[y][x+1] && fluss[y-1][x+1] == 0 && fluss[y][x+1] == 0 && fluss[y+1][x+1] == 0 ){ createFluss(x+1, y, flussNr); } //Flusslauf nach Süden if( map[y][x] >= map[y+1][x] && fluss[y+1][x-1] == 0 && fluss[y+1][x] == 0 && fluss[y+1][x+1] == 0 ){ createFluss(x, y+1, flussNr); } //Flusslauf nach Westen if( map[y][x] >= map[y][x-1] && fluss[y-1][x-1] == 0 && fluss[y][x-1] == 0 && fluss[y+1][x-1] == 0 ){ createFluss(x-1, y, flussNr); } cout << "Senke - Hier müsste der Code für das entstehen eines Sees rein..." << endl; return 1; } see::see(){ //Map int sA[9][9] = { {9,9,9,9,9,9,9,9,9}, {9,7,8,7,9,9,8,7,9}, {9,6,4,6,9,9,7,7,9}, {9,5,3,3,9,9,7,6,9}, {9,4,6,2,9,9,4,5,9}, {9,3,1,1,9,9,3,7,9}, {9,7,1,7,9,9,2,2,9}, {9,7,1,7,9,9,9,9,9}, {0,0,0,0,0,0,0,0,0} }; for(int k=0; k<9; k++){ for(int j=0; j<9; j++){ map[k][j] = sA[k][j]; fluss[k][j] = 0; } } //Fluss bei x=1; y=1 starten mit der FlussNummer 1 createFluss(1,1,1); //Fluss bei x=6; y=1 starten mit der FlussNummer 2 createFluss(6,1,2); //Endergebnis ausgeben showMap(); } see::~see(){ }