Seite 1 von 1

"insel"-generator

Verfasst: 11.04.2011 22:32
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

Re: "insel"-generator

Verfasst: 11.04.2011 23:09
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.

Re: "insel"-generator

Verfasst: 12.04.2011 03:51
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.

Re: "insel"-generator

Verfasst: 12.04.2011 07:21
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.

Re: "insel"-generator

Verfasst: 12.04.2011 09:27
von Spirit
Viele Terrain-Generatoren verwenden unter anderem den Midpoint-Displacement-Algorithmus:

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