Hai bisogno di idee per un algoritmo per disegnare forme irregolari macchiate


8

Sto cercando di disegnare forme irregolari su una griglia x, y, e mi piacerebbe trovare un metodo semplice e veloce, se possibile. La mia unica idea finora è quella di disegnare un mucchio di cerchi di dimensioni casuali molto vicini tra loro, ma a una distanza casuale a parte una coordinata più o meno centrale, quindi riempire eventuali spazi vuoti. Mi rendo conto che questo è un metodo goffo e inelegante, spero che ti dia un'idea approssimativa dei tipi di forme arrotondate e casuali macchiate per le quali sto girando. Si prega di suggerire metodi per raggiungere questo obiettivo, non sono molto interessato al codice. Posso tagliarlo da solo. Grazie!


2
Ti aiuterei se allegassi alcuni esempi di tali forme, ma da quello che ho capito, l' algoritmo Marching Squares potrebbe essere quello che stai cercando.
Alexander Konstantinov,

Ad esempio, in tutta serietà, pensa alle macchie del fegato: arrotondate, casuali, ma generalmente ovoidali.
Yttermayn,

6
Questo post di mathematica.SE contiene alcuni esempi che potresti trovare interessanti: mathematica.stackexchange.com/questions/3345/… La risposta principale in pratica fa quello che stai facendo. un altro trova lo scafo convesso di punti casuali e poi interpola una spline attraverso di esso, ma questo sembra un po 'complicato ...
Jemmy,

Grazie per le tue risposte! Purtroppo penso che potrei essere un po 'fuori di testa. Potrei dover capire qualcos'altro.
Yttermayn,

4
Che ne dici di iniziare con un cerchio vicino alla dimensione desiderata e poi permutarlo usando il rumore perlin. Spostando il pixel selezionato o dissolvendo / estendendo il cerchio.
floAr

Risposte:


1

Potresti voler scegliere alcuni punti, scegliere un vettore in ciascun punto e tracciare una spline attraverso di essi. Vedi questa pagina di Wikipedia per una semplice descrizione di una spline cubica (aka spline di Irwin-Hall). È passato un po 'di tempo da quando li ho usati, ma se ricordo bene, questo è quello che ho scoperto essere il più facile da capire e usare. Se conosci lo strumento penna di Photoshop, funziona in modo molto simile (sono convinto che Photoshop usi anche le spline, ma non sono sicuro che si tratti di una spline cubica).

Se sei interessato, ci sono molte altre spline: ad esempio, le spline Bezier e le spline B sono interessanti.

Un'altra cosa che viene in mente sono i livelli, sebbene ciò richiederebbe probabilmente un po 'più di ricerca da parte vostra (per trovare funzioni che soddisfino le vostre esigenze).

Gli insiemi di livelli sono disuguaglianze nella forma
f (x, y) = c
dove f è una funzione e c è una costante.
Questa è una descrizione molto generale. Potresti voler compilare una forma e disegnare tutti i pixel in cui
f (x, y) <= c
con un po 'di colore. Ad esempio, per una forma 2d perfettamente rotonda, hai l'equazione ben nota:
x ^ 2 + y ^ 2 <= r ^ 2
Puoi ridimensionare i componenti xey per ottenere un ellissoide Con un po 'di sperimentazione e ricerca, sarà possibile trovare alcune forme più funky (suppongo).

Modifica: una piccola sperimentazione su wolframalpha.com mi ha dato questo . (creato con il comando 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Non ho idea se questo è qualcosa di simile a quello che vuoi, ma è solo per darti un'idea.


1

Un altro approccio semplice consiste nell'utilizzare il proprio rumore a bassa frequenza per disegnare (o definire) una figura in coordinate polari.

Supponiamo di voler un blob centrato sull'origine, di raggio medio 1; questo può essere facilmente ridimensionato e tradotto in altre posizioni e dimensioni. Immagina con la semplice equazione r = 1 - questo definirebbe un cerchio di raggio uno all'origine. Per aggiungere una piccola variazione ad esso, puoi cambiare il raggio sinusoidalmente - aggiungi un termine della forma w 1 * sin (θ + θ 1 ), dove w 1 e θ 1 sono costanti a cui tornerò tra poco. Un termine il peccato non farà un sacco di differenza, ma avendo diversi diversi seni di diverse frequenze inizierà aggiungere esattamente il tipo di variazione 'soft' Ho il sospetto che stai cercando. La forma complessiva sarebbe lungo le linee di r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + θ 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5 * sin (5θ + θ 5 ) - o più termini se vuoi, ovviamente.

Quindi, come possiamo scegliere i valori di w i e θ io ? Bene, gli θ dovrebbero essere scelti casualmente da (0,2π) - in altre parole, ogni "onda" sulla forma della superficie dovrebbe iniziare in un punto diverso attorno alla forma. Per quanto riguarda le w, ci sono diverse scelte. Scegliere w i in modo casuale da (0, w) (per alcuni w fissi che rappresentano la 'variazione complessiva' per dare la forma; potrei iniziare con w = 0,25 ma sperimentare con w = 0,1) per ogni i porterò a chiamato rumore bianco , in cui tutte le frequenze hanno lo stesso peso - questo sarà di gran lunga il più "blobbiest", con ampie variazioni a tutte le frequenze. Scegliendo i casualmente da (0, w * (1 / i)) - in altre parole,rumore, dove il peso si allontana, ma lentamente. Questo è anche noto come rumore 1 / f ed è il rumore "frattale" più famoso. Infine, scegliendo i pesi in modo casuale da (0, w * (1 / i ^ 2)) (in altre parole, dividendo ogni peso casuale per i ^ 2) si ottiene un rumore browniano - questo è il 'più morbido' dei tre, con il minima variazione da un cerchio - sarà generalmente una forma ovale.

Ecco alcuni esempi dei tre, usando un "peso totale" di w = 0,25 e usando lo stesso insieme di valori casuali per i e i che ho estratto da random.org :

Chiazza "rumore bianco": Una chiazza fatta con rumore bianco

Chiazza "Pink Noise": Una chiazza fatta con rumore rosa

BLOB "Rumore browniano": Una chiazza fatta con rumore browniano

Nota che questi BLOB non saranno perfetti; in particolare, è impossibile per loro arricciarsi su se stessi (poiché per ogni θ - in altre parole, per ogni angolo rispetto all'origine - c'è un singolo valore r), e se non scegli i tuoi pesi nel modo giusto potrebbero auto- intersecare (se r può diventare negativo). Ma fanno un lavoro decente di essere convincentemente insipido e per la maggior parte delle applicazioni di gioco gli utenti non noteranno alcun problema.


(Nota anche: il fatto che queste forme siano così vicine alla simmetria è un artefatto di (a) i coefficienti della seconda e della quarta armonica essendo così piccoli, e (b) le fasi della prima, terza e quinta armonica - quanto spostiamo i valori theta - essendo così vicini, a .468, .464 e .443; la maggior parte dei 'blob' non avrà quasi tanta simmetria su di loro.)
Steven Stadnicki,

0

A parte le altre risposte, potresti usare un rumore Perlin con un decadimento tondo, se modifichi un po 'le impostazioni, potresti facilmente creare delle belle forme variabili.

Se vuoi che il tuo codice sia veloce, potresti semplicemente usare una libreria di generazione del rumore come libnoise (Supponendo che tu stia usando c ++), che è una libreria di generazione del rumore, che rende compiti simili molto semplici, in quanto ti fornisce un nodo approccio basato sulla generazione procedurale basata sul rumore. Ha legami anche con altre lingue.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.