Come probabilmente lo farei in modo da poter mantenere un po 'di controllo artistico e potenzialmente non passare molto tempo a provare a modificare un metodo procedurale per farlo nel modo giusto ...
Per prima cosa, crea manualmente una serie di sprite di ciuffi di foglie di tè come "pool" artistico - non ognuno come foglie di tè di un'intera tazza, ma più come un raggruppamento più piccolo. Diciamo, 20 di loro o giù di lì?
Quindi posizionane un numero casuale a coordinate casuali sulla base della "coppa". Dai a ciascuno una rotazione e una scala casuali più il mirroring orizzontale e / o verticale casuale. Questo dovrebbe creare un buon risultato.
Questo approccio ti darà la libertà artistica nel creare i singoli gruppi per avere l'aspetto che desideri, consentendo nel contempo una grande varietà di risultati (presupponendo che gli sprite siano sufficienti per scegliere).
Inoltre, con questo (e qualsiasi metodo casuale incluso il rumore di Perlin), è possibile eseguire il seeding del generatore di numeri casuali all'inizio del processo con un seed noto per ottenere risultati riproducibili. Se si salva il seme, è possibile ricreare esattamente lo stesso modello eseguendo nuovamente il rendering appena prima dell'inizio della sequenza. Potresti anche fare cose divertenti come avere qualcuno che digita il suo nome, trasformare le lettere in un numero (somma ASCII, ecc.), Quindi usarlo come seme come una sorta di "questo modello di foglia di tè personalizzato per TE!" cosa.
Ecco alcuni pseudocodici per cosa intendo, se questo aiuta ...
var sprites = [...]; // Array of tea leaf sprites
var n_leaves = rand(5)+5; // Random number of leaves from 5-9
for (i=0; i<n_leaves; i++) {
var sprite_index = rand(sprites.length); // Random sprite index
var r = rand(CUP_DIAMETER); // Random radius for point on disk calc
var theta = rand(2*PI); // Random theta (rotation) for point on disk
var sprite_x = sqrt(r) * cos(theta); // Sprite X
var sprite_y = sqrt(r) * sin(theta); // Sprite Y
var sprite_rotation = rand(2*PI); // Sprite rotation
var sprite_scale = rand(1) + 0.5; // Sprite scale from 0.5 to 1.5
var sprite_h_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror horizontally
var sprite_v_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror vertically
draw_sprite(sprite_index, sprite_x, sprite_y, sprite_rotation, sprite_h_mirror, sprite_v_mirror);
}
Dai un'occhiata a http://mathworld.wolfram.com/DiskPointPicking.html per una grande discussione su come scegliere un punto casuale in un disco e perché sto usando l'intera cosa sqrt / sin / cos.