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!
2d
algorithm
random
procedural
Yttermayn
quelle
quelle
Antworten:
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.
quelle
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":
"Pink Noise" Blob:
Blob "Brownian Noise":
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.
quelle
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.
quelle