Autor Beitrag
Alni
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 205

Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
BeitragVerfasst: Fr 09.05.03 13:34 
Hallo,

Ich schreibe gerade eine kleine WiSim und bräuchte dazu einen einfachen Zufallsgenerator für die Karten. Auf einer Karte gibt es Grünflächen, Berge und Wasser (Seen und Meer). Kann mir jemand einen Tipp geben wie ich es schaffe dabei zusammenhängende zufällige Flächen zu erstellen. Dabei sollte auch jede Bergfläche innerhalb einer Grünfläche liegen.

Beispiel:
Wasser hat die Kennzahl 1, Gras 2 und Berg die 3
So sollte dann ungefähr eine Karte aussehen.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|1|1|1|1|1|1|1|1|2|2|2|2|2|2|3|3|3|3|3|3|3|
|1|1|1|1|1|1|1|1|2|2|2|2|2|3|3|3|3|3|3|3|3|
|1|1|1|1|1|1|1|1|1|2|2|2|2|2|2|3|3|3|3|3|3|
|1|1|1|1|2|2|2|2|2|2|2|2|2|2|2|2|2|3|3|3|3|
|1|1|2|2|2|2|2|2|2|3|3|3|2|2|2|2|2|2|2|2|2|
|1|1|1|2|2|2|2|2|3|3|3|3|3|3|2|2|2|2|2|2|2|
|1|1|1|1|1|1|2|2|2|2|3|3|3|3|2|2|2|2|2|2|2|
|1|1|1|1|1|1|1|1|1|2|3|3|3|3|2|2|2|2|2|2|2|
|1|1|1|1|1|1|1|1|1|2|3|3|3|3|2|2|2|2|2|2|2|
|1|1|1|1|1|1|1|1|1|2|3|3|3|3|2|2|2|2|2|1|1|
|1|1|1|1|1|1|2|2|2|2|2|2|2|2|2|2|2|1|1|1|1|

Ich hoffe man kann erkennen wie die Verteilung ungefähr aussieht

Es soll also nicht einfach für jeden Kartenpunkt per simplen Zufallsgenerator der Typ bestimmt werden, das Ergebnis wäre bloß Chaos. Praktisch wäre auch wenn man dem Algorithmus grobe Richtwerte übergeben könnte welchen prozentualen Anteil ein Typ haben soll (z.B 28% Wasser, 50% Grass, 22% Berg).
Das Array das ich zur Speicherung verwende ist ungefähr 512x512 groß (word)

Danke für eure Gedanken

_________________
MfG Alex


Zuletzt bearbeitet von Alni am Sa 10.05.03 17:19, insgesamt 1-mal bearbeitet
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Fr 09.05.03 15:28 
Also, das ganze würde ich so machen:
1)In der Mitte Anfangen
2)Denn für jeden Punkt berechnen, wie viele gleiche bereits angrenzen
3)Über warscheinlichkeitsberechnung über Punkt 2) das nächste Feld errechnen

Wenn ich etwas mehr Zeit habe, versuche ich, das ganze in Code umzusetzen.
Hast du schon die Engine die das ganze dann in grafik umsetzt?
Alni Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 205

Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
BeitragVerfasst: Fr 09.05.03 17:52 
Ja Grafik funzt, nur net grad hübsch. Aber die Karte darstellen is kein Problem.
Danke für deinen Tipp, ein ähnlicher Gedanke ist mir vorhin beim Friseur :lol: auch gekommen. Ich schau mal ob die Umsetzung klappt. Wenn ich heut Nacht um 2Uhr aus der Kneipe heimkomm, hab ich grad den richtigen Pegel für sowas. :beer:

_________________
MfG Alex
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Fr 09.05.03 18:28 
Ok, kannst du mir die Vorarbeit dann mal schicken? Ich schau mal, vielleicht kann ich dir sowas einbauen.
Alni Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 205

Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
BeitragVerfasst: Fr 09.05.03 19:20 
Danke aber eigentlich möchte ich es lieber selber machen. Nicht das ich nicht glaube, dass du das kannst, sondern eher weil ich selber etwas dabei lernen möchte.
Übrigens habe jetzt doch gleich angefangen und einen groben Algorithmus implementiert. Den teste ich momentan in einem etxra Projekt und einfach mit einer Paintbox. Er scheint schon in die Richtung zu funktionieren, wie ich mir das vorgestellt habe, bis auf zwei Probleme:
Zum einen ist mein Algorithmus Baumrekursiv und führt daher bei großen Karten zu einem Stacküberlauf. Mal sehn ob ich den auch iterativ hinbekomme.
Und zum andern sind die erzeugten zusammenhängenden Flächen sehr klein und noch etwas zerfranst. Aber das liegt wahrscheinlich an meiner Wahrscheinlichkeitsfunktion.
Wenn du vielleicht eine Idee hast wie man den Algorithmus iterativ gestalten könnte wär ich dir dankbar

_________________
MfG Alex
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: Fr 09.05.03 20:59 
Kannst du mir das Prog trotzdem zum Rumprobieren schicken?
Alni Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 205

Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
BeitragVerfasst: Sa 10.05.03 03:24 
Ja und Nein. Das Programm wird mindestens Freeware, vielleicht sogar Opensource. Da aber die einzelnen Teile bisher nur jeweils in ihren Testumgebungen existieren, und ich nicht nicht annähernd ausgereiften Code aus der Hand gebe, musst du dich noch mindestens zwei bis drei Monate gedulden bis ich die erste Alphaversion in der Projektsparte veröffentliche. Sei mir bitte nicht böse, aber ich zeig' mein Quellcode grundsätzlich erst dann her wenn er mich selbst zu einem Mindestmaß überzeugt, und das ist bisher nicht der Fall.

Ein Post-it mit deinem Namen hängt schon an meinem Monitor, um mich daran zu erinnern, dir als bald möglich die ersten Ergebnisse zu zeigen.

_________________
MfG Alex
Alni Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 205

Win 2000, XP, SuSe, Debian
D5 Prof, D7 Prof, Kylix
BeitragVerfasst: Sa 10.05.03 17:18 
Ich habe meinen Ursprünglichen Algoritmus über den Haufen geworfen und einen anderen entwickelt der mich sehr zufrieden stellt.

1. Man beginnt mit einer leeren Karte die nur aus einem Flächentyp besteht (z.B. Gras)
2. Man wählt einen zufälligen Punkt auf der Karte, an dem eine zufällig geformte Fläche eines anderen Flächentyps (z.B. Wasser) entstehen soll
3. In einem array 'A' werden alle Punkte gespeichert die Teil des Randes der Fläche sind (an einen anderen Flächentyp grenzen)
4. Der erste Punkt wird gesetzt und in A gespeichert
5. Die Größe der Fläche wird festgelegt

Der obere Teil dient zur Initialisierung des Algorithmus
Nun kommt eine Schleife die abgebrochen wird wenn die Fläche ihre festgelegte Größe erreicht hat

1. Wähle zufälligen Punkt P aus A
2. Bestimme die Menge M der an P angrenzenden Punkte, die leer sind (bzw. Gras)
3. Wähle zufälligen Punkt P' aus M, setze den Flächenttyp und füge ihn in A ein
4. Prüfe welche an P' angrenzenden Randpunkte keine Randpunkte mehr sind und lösche diese
5. erhöhe den Zähler für die momentane Größe der Fläche

Damit erhält man zufällig geformte Flächen und somit einen Teil eines Zufallskartengenerator

Ich hab zwar noch einen kleinen Fehler drin und eher sinnlose Variablen und Funktionsnamen aber ich möchte den Quellcode hierzu dennoch zur Verfügung stellen, falls sich jemand näher dafür interessiert

Kartengenerator Source + Exe

_________________
MfG Alex