Benötigen Sie Ideen für einen Algorithmus zum Zeichnen unregelmäßiger fleckiger Formen


8

Ich möchte unregelmäßige Formen auf einem x, y-Raster zeichnen und möchte, wenn möglich, eine einfache, schnelle Methode entwickeln. Meine einzige Idee bisher ist es, ein paar Kreise zufälliger Größe sehr nahe beieinander zu zeichnen, aber in einem zufälligen Abstand von einer mehr oder weniger zentralen Koordinate, und dann alle Leerzeichen auszufüllen. Mir ist klar, dass dies eine klobige, unelegante Methode ist. Hoffentlich gibt sie Ihnen eine ungefähre Vorstellung von den Arten von abgerundeten, zufälligen fleckigen Formen, nach denen ich fotografiere. Bitte schlagen Sie Methoden vor, um dies zu erreichen. Ich interessiere mich nicht so sehr für Code. Ich kann diesen Teil selbst herausnudeln. Vielen Dank!


2
Ich würde helfen, wenn Sie einige Beispiele für solche Formen anhängen, aber nach meinem Verständnis könnte der Marching Squares- Algorithmus genau das sein, wonach Sie suchen.
Alexander Konstantinov

Denken Sie zum Beispiel in aller Ernsthaftigkeit an Leberflecken: gerundet, zufällig, aber im Allgemeinen eiförmig.
Yttermayn

6
Dieser mathematica.SE-Beitrag enthält einige Beispiele, die Sie vielleicht interessant finden: mathematica.stackexchange.com/questions/3345/… Die Top-Antwort macht im Grunde das, was Sie tun. Ein anderer findet die konvexe Hülle aus zufälligen Punkten und interpoliert dann einen Spline durch sie, aber das scheint ein wenig kompliziert zu sein ...
Jemmy

Vielen Dank für Ihre Antworten! Leider denke ich, dass ich ein bisschen über meinem Kopf sein könnte. Ich muss vielleicht noch etwas herausfinden.
Yttermayn

4
Beginnen Sie mit einem Kreis in der Nähe der gewünschten Größe und permutieren Sie ihn dann mit Perlin-Rauschen. Entweder durch Verschieben ausgewählter Pixel oder durch Ausblenden / Erweitern des Kreises.
FloAr

Antworten:


1

Möglicherweise möchten Sie einige Punkte auswählen, an jedem Punkt einen Vektor auswählen und einen Spline durch sie ziehen. Auf dieser Wikipedia-Seite finden Sie eine einfache Beschreibung eines kubischen Splines (auch bekannt als Irwin-Hall-Spline). Es ist schon eine Weile her, seit ich sie benutzt habe, aber wenn ich mich richtig erinnere, war dies diejenige, die ich am einfachsten zu verstehen und zu verwenden fand. Wenn Sie das Stiftwerkzeug aus Photoshop kennen, funktioniert dies sehr ähnlich (ich bin überzeugt, dass Photoshop auch Splines verwendet, bin mir aber nicht sicher, ob es sich um einen kubischen Spline handelt).

Wenn Sie interessiert sind, gibt es viel mehr Splines: Zum Beispiel sind Bezier-Splines und B-Splines interessant.

Eine andere Sache, die mir in den Sinn kommt, sind Level-Sets, obwohl dies wahrscheinlich etwas mehr Forschung von Ihrer Seite erfordern würde (um Funktionen zu finden, die Ihren Anforderungen entsprechen).

Pegelsätze sind Ungleichungen in der Form
f (x, y) = c,
wobei f eine Funktion und c eine Konstante ist.
Dies ist eine sehr allgemeine Beschreibung. Möglicherweise möchten Sie eine Form ausfüllen und alle Pixel mit
f (x, y) <= c
mit einer bestimmten Farbe zeichnen . Für eine perfekt runde 2d-Form haben Sie beispielsweise die bekannte Gleichung:
x ^ 2 + y ^ 2 <= r ^ 2
Sie können die x- und y-Komponenten skalieren, um ein Ellipsoid zu erhalten. Mit ein wenig Experimentieren und Nachforschungen können Sie es wird möglich sein, einige funkigere Formen zu finden (nehme ich an).

Bearbeiten: Ein kleines Experiment auf wolframalpha.com gab mir dies . (erstellt mit dem Befehl 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Ich habe keine Ahnung, ob dies so etwas wie das ist, was Sie wollen, aber es ist nur, um Ihnen eine Idee zu geben.


1

Ein weiterer einfacher Ansatz besteht darin, mit Ihrem eigenen niederfrequenten Rauschen eine Zahl in Polarkoordinaten zu zeichnen (oder zu definieren).

Angenommen, Sie möchten einen am Ursprung zentrierten Blob mit einem durchschnittlichen Radius von 1. Dies kann leicht skaliert und in andere Positionen und Größen übersetzt werden. Stellen Sie sich mit der einfachen Gleichung r = 1 vor - dies würde einen Kreis mit dem Radius eins am Ursprung definieren. Um eine kleine Variation hinzuzufügen, können Sie den Radius sinusförmig ändern - fügen Sie einen Term der Form w 1 * sin (θ + θ 1 ) hinzu, wobei w 1 und θ 1 Konstanten sind, auf die ich gleich zurückkommen werde. Ein Sündenbegriff macht keinen großen Unterschied, aber wenn Sie mehrere verschiedene Sinusse mit unterschiedlichen Frequenzen haben, wird genau die Art von "weicher" Variation hinzugefügt, nach der Sie vermutlich suchen. Die Gesamtform wäre entlang der Linien von r = 1 + w 1 · sin (& thgr ; + & thgr; 1 ) + w2 * sin (2θ + θ 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5 * sin (5θ + θ 5 ) - oder mehr Begriffe, wenn Sie möchten, Na sicher.

Wie wählen wir also die Werte für w i und θ i aus ? Nun, die θs sollten nur zufällig aus (0,2π) ausgewählt werden - mit anderen Worten, jede 'Welle' auf der Form der Oberfläche sollte an einem anderen Punkt um die Form beginnen. Was die Ws betrifft, gibt es verschiedene Möglichkeiten. Die zufällige Auswahl von w i aus (0, w) (für ein festes w, das die 'Gesamtvariation' darstellt, um die Form zu erhalten; ich könnte mit w = 0,25 beginnen, aber mit w = 0,1 experimentieren) für jedes i führt zu so- genanntes weißes Rauschen , bei dem alle Frequenzen das gleiche Gewicht haben - dies wird bei weitem das "blobbiest" sein, mit großen Variationen bei allen Frequenzen. W i zufällig aus (0, w * (1 / i)) auswählen - mit anderen Worten:Lärm, wo das Gewicht nachlässt, aber langsam. Dies wird auch als 1 / f- Rauschen bezeichnet und ist das bekannteste "fraktale" Rauschen. Schließlich ergibt die zufällige Auswahl der Gewichte aus (0, w * (1 / i ^ 2)) (mit anderen Worten, durch Teilen jedes zufälligen Gewichts durch i ^ 2) braunes Rauschen - dies ist das "weichste" der drei mit dem geringste Abweichung von einem Kreis - es wird im Allgemeinen eine ovale Form sein.

Hier sind Beispiele für die drei, bei denen ein 'Gesamtgewicht' von w = 0,25 verwendet wird und derselbe Satz von Zufallswerten für w i und θ i verwendet wird, die von random.org abgerufen wurden :

Blob "White Noise": Ein Klecks mit weißem Rauschen

"Pink Noise" Blob: Ein Klecks mit rosa Rauschen

Blob "Brownian Noise": Ein Klecks mit braunem Rauschen

Beachten Sie, dass diese Blobs nicht perfekt sind. Insbesondere ist es für sie unmöglich, sich zurückzurollen (da es für jedes θ - mit anderen Worten für jeden Winkel vom Ursprung - einen einzelnen r-Wert gibt), und wenn Sie Ihre Gewichte nicht richtig wählen, können sie sich selbstständig machen. schneiden (wenn r negativ werden darf). Aber sie leisten gute Arbeit, um überzeugend blöd zu sein, und für die meisten Spieleanwendungen werden Benutzer keine Probleme bemerken.


(Beachten Sie auch: Die Tatsache, dass diese Formen so nahe an der Symmetrie liegen, ist ein Artefakt von (a) den Koeffizienten der zweiten und vierten Harmonischen, die so klein sind, und (b) den Phasen der ersten, dritten und fünften Harmonischen - wie viel Wir verschieben die Theta-Werte - sie liegen so nahe bei .468, .464 und .443; die meisten 'Blobs' haben nicht annähernd so viel Symmetrie.)
Steven Stadnicki,

0

Abgesehen von den anderen Antworten könnten Sie ein Perlin-Rauschen mit einem runden Abfall verwenden. Wenn Sie die Einstellungen ein wenig anpassen, können Sie leicht einige schöne, unterschiedliche Formen erstellen.

Wenn Sie möchten, dass Ihr Code schnell ist, können Sie einfach eine Rauschgenerierungsbibliothek wie libnoise (vorausgesetzt, Sie verwenden c ++) verwenden, eine Rauschgenerierungsbibliothek, die ähnliche Aufgaben sehr einfach macht, da sie Ihnen einen Knoten bietet -basierter Ansatz zur rauschbasierten prozeduralen Generierung. Es hat auch Bindungen zu anderen Sprachen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.