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 9

    Fluss 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 9

    Wasser 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 9

    Kei



  • 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(){
    
    }
    

Anmelden zum Antworten