"insel"-generator

Für allgemeine Fragen zur Programmierung mit PureBasic.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

"insel"-generator

Beitrag von teamO »

Hey,

ich versuche grad ein Programm zu schreiben, dass in ein array eine zufällige durch eine kurve umschlossene fläche (aka Insel) "zeichnet" (dh. die das die werte des arrays sind außerhalb zb "0" und innerhalb "1"). Das ganz soll einigermaßen natürliche Formen haben, also nicht zu stark "ausgefranst" oder kantig sein.
soll also vom Prinzip her so aussehen:

Bild

ich habe mir überlegt man könnte zufällige punkte über das Bild verteilen, dann irgendwie bestimmen welche punkte die außenlinien definieren sollen und diese dann über ausgleichskurven verbinden (vielleicht so wie bei einer regression?). Allerdings erscheint mir das sehr umständlich und ich habe auch bis jetzt weder eine idee, wie man bestimmen kann, welche Punkte außen liegen sollen noch wie ich die regressionskurven finden könnte.
hat jemand eine idee, wie das gehn könnte?
oder kennt jemand vielleicht ein besseres prinzip, wie man an solche "inseln" kommt?

das ganze ist nicht besonders zeitkritisch.

Danke fürs lesen,
TeamO
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: "insel"-generator

Beitrag von STARGÅTE »

Also eine Insel sollte schon "ausgefranzt" sein, denn dein Objekt sieht ja nicht wie n Insel aus ^^

Hier mal ein Vorschlag von mir:

Code: Alles auswählen

Enumeration
	#Window : #Gadget : #Image
EndEnumeration

#Height = 512
#Width = 512

Global Dim Field(#Width-1, #Height-1)

Procedure Fill(x, y, Level)
	If x < 0 Or x >= #Width Or y < 0 Or y >= #Height Or Level <= 0
	 ProcedureReturn #False
	EndIf
	If Field(x,y) = 0
		Field(x,y) = 255
		For n = 1 To 16
			Fill(x+Random(2)-1, y+Random(2)-1, Level-1)
		Next
	EndIf
EndProcedure

Fill(#Width/2, #Height/2, 2000)

CreateImage(#Image, #Width, #Height, 24)
StartDrawing(ImageOutput(#Image))
 For y = 0 To #Height-1
  For x = 0 To #Width-1
   Plot(x, y, RGB(255-Field(x,y),255-Field(x,y),255-Field(x,y)))
  Next
 Next
StopDrawing()

OpenWindow(#Window, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 ImageGadget(#Gadget, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Bild

Das wäre zumindest ein Anfang, das ganze kann man noch Glätten.
Die Freiflächen innerhalb der Insel wären dann gleich Seen oder so.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Re: "insel"-generator

Beitrag von Batze »

Du könntest auch mit einer Form anfangen und die dann zufällig mutieren. Also dass du z.B. ein Quadrat nimmst und dann in mehreren Schritten die Rändern anpasst. Dann bleibt das im Mittel in Richtung quadratisch.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: "insel"-generator

Beitrag von DarkDragon »

Ich würd' mal nach Voronoi suchen. Damit würde das glaube ich recht gut gehen. Dann entfernst du alle Flächen am Bildrand und ersetzt die restlichen Flächen durch Spolygone (Worterfindung zu Spline-Polygone). Mit Scanline gehst du dann da durch und rasterisierst die Spolygone in dein Array.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Re: "insel"-generator

Beitrag von Spirit »

Viele Terrain-Generatoren verwenden unter anderem den Midpoint-Displacement-Algorithmus:

http://en.wikipedia.org/wiki/Midpoint_d ... _algorithm
Antworten