2014-01-08 4 views

Antwort

4

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 
2

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.

4

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