Ist es möglich, zufällige Formen (siehe unten zum Beispiel) eines bestimmten Bereichs in NetLogo zu erstellen?Erstellen einer zufälligen Form (Blob) eines bestimmten Bereichs in NetLogo
Antwort
Ein erster Stich auf Seths Vorschlag # 1. Es schafft auch eine saubere Sicht!
patches-own [ height ]
to blobbify
clear-all
repeat (ceiling 2 * (ln (world-height * world-width))) [
ask patch (round (random (world-width/2)) - world-width/4)
(round (random (world-height/2)) - world-height/4)
[ set height world-width * world-height ] ]
while [ count patches with [ height > 1 ] < (world-width * world-height/4)]
[ diffuse height 1
ask patches with [ height > 0 ] [ set pcolor height ]
]
ask patches with [ height > 1 ] [ set pcolor white ]
end
zufällige Kleckse zu erzeugen ist ein schwieriges Problem ohne offensichtliche Lösung. Das Fixieren der Fläche des Blobs macht es noch schwieriger.
Sie müssen einen Ansatz auswählen und dann versuchen herauszufinden, wie dieser Ansatz in NetLogo-Code ausgedrückt werden kann.
Als für welche Ansatz wählen, stelle ich mir vor, dass es Literatur gibt, wenn Sie suchen. Aber nur aus der Spitze von meinem Kopf, ich habe drei Ideen:
Scatter zufällige Punkte auf der ganzen Welt,
diffuse
verwenden, um eine glatte Landschaft um diesen Gipfel zu machen. (Siehe hierzu das Diffusionsgrafik-Modell im Abschnitt "Kunst" in der NetLogo-Modellbibliothek, für Code hierfür; Sie möchten jedoch World-Wrapping deaktivieren.) Wählen Sie dann nur die Patches aus, bei denen die "Höhe" einen bestimmten Schwellenwert überschreitet. Um den gewünschten Bereich zu erhalten, variieren Sie den Schwellenwert, bis das Ziel erreicht ist.Zeichnen Sie eine Kurve um den Mittelpunkt mit Polarkoordinaten, wobei Theta von 0 bis 360 und 4 zufällig variiert. Sie müssen einen Weg finden, um eine zufällige zufällige Variation im Radius zu erhalten, vielleicht indem Sie Zufallszahlen generieren und dann eine Glättungsfunktion auf sie anwenden. Um zu erzwingen, dass der Blob den gewünschten Bereich aufweist, erstellen Sie zunächst die gesamte Kurve und skalieren Sie sie dann nach Bedarf. Sie benötigen einen Trick, um eine Diskontinuität zu vermeiden, bei der Theta = 0 ist, vielleicht durch Verwendung einer Glättungsfunktion, die umschließt.
Generieren Sie ein zufälliges Polygon, indem Sie Punkte auf der ganzen Welt streuen und dann einige oder alle Punkte in der Mitte verwerfen. (Du könntest die konvexe Hülle nehmen, aber dann bekommst du immer eine konvexe Form, die für dich vielleicht nicht "blobbig" genug ist. Du möchtest vielleicht so etwas wie das Erzeugen von n zufälligen Punkten und dann das Beibehalten der m Punkte am weitesten von der Mitte entfernt, ohne Rücksicht auf die Konvexität.) Sobald Sie das zufällige Polygon haben, wenden Sie einige glättende Funktion an, um es zu einem kurvigen Fleck zu machen. Dann skalieren Sie das Ganze nach Bedarf, um den gewünschten Bereich zu erhalten.
Ich fand einen wirklich einfachen Ansatz, der ziemlich schöne Ergebnisse produziert.
Erstellen Sie eine Schildkröte. Die Schildkröte führt einen zufälligen Spaziergang durch. Nach jedem Schritt setzen sie den ungefärbten Flecken, der ihnen am nächsten ist, auf die gewünschte Farbe. Die Schildkröte macht dies mehrere Male gleich dem gewünschten Bereich.
Hier ist der Code:
to make-blob [ area ]
let blob-maker nobody
crt 1 [ set blob-maker self ]
repeat area [
ask blob-maker [
ask min-one-of patches with [ pcolor = black ] [ distance myself ] [ set pcolor blue ]
rt random 360
fd 1
]
]
ask blob-maker [ die ]
end
Dies natürlich produziert schön geschwungenen Blobs.
Wenn Sie die Größe der Schildkröte verkleinern, wird der Blob kreisförmiger. Wenn Sie es größer machen, erhalten Sie dünnere, sporadischere Blobs (obwohl Sie das Risiko eingehen, dass die Patches nicht verbunden sind).
Edit:
Ich bemerkte, dass meine Antwort ganz langsam ausgeführt, wenn Sie eine riesige Anzahl von Patches.Hier ist eine viel schnellere Version:
to make-blob [ area x y ]
let blob-maker nobody
crt 1 [ set blob-maker self setxy x y ]
let border patch-set [ patch-here ] of blob-maker
repeat area [
ask blob-maker [
ask min-one-of border [ distance myself ] [
set pcolor green
set border (patch-set border neighbors4) with [ pcolor = black ]
]
rt random 360
fd .8
]
]
ask blob-maker [ die ]
end