Comment je le ferais probablement pour que je puisse garder un certain contrôle de l'art et ne pas passer potentiellement beaucoup de temps à essayer de modifier une méthode procédurale pour bien faire les choses ...
Tout d'abord, créez manuellement un certain nombre de sprites de touffes de feuilles de thé comme votre "pool" artistique - pas chacun comme une tasse entière de feuilles de thé, mais plutôt comme un plus petit groupe. Dites, 20 d'entre eux ou plus?
Ensuite, placez un nombre aléatoire d'entre eux à des coordonnées aléatoires sur la base "cup". Donnez à chacun une rotation et une échelle aléatoires ainsi qu'une mise en miroir horizontale et / ou verticale aléatoire. Cela devrait créer un bon résultat.
Cette approche vous donnera la liberté artistique de créer les blocs individuels pour avoir le look que vous voulez, tout en permettant une grande variété de résultats (en supposant que vous aurez le choix entre des sprites suffisants).
De plus, avec cela (et toute méthode aléatoire incluant le bruit Perlin), vous pouvez réellement amorcer le générateur de nombres aléatoires au début du processus avec une graine connue pour obtenir des résultats reproductibles. Si vous enregistrez la graine, vous pouvez recréer exactement le même motif à nouveau en réensemencant juste avant le début de la séquence. Vous pouvez même faire des choses amusantes comme demander à quelqu'un de taper son nom, transformer les lettres en un nombre (somme ASCII, etc.), puis l'utiliser comme graine comme une sorte de "ce motif de feuille de thé personnalisé pour VOUS!" chose.
Voici un pseudocode pour ce que je veux dire, si cela aide ...
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);
}
Consultez http://mathworld.wolfram.com/DiskPointPicking.html pour une excellente discussion sur la façon de choisir un point aléatoire sur un disque et pourquoi j'utilise tout cela sqrt / sin / cos.