Cómo probablemente lo haría para poder mantener un poco de control del arte y no potencialmente pasar mucho tiempo tratando de ajustar un método de procedimiento para hacerlo bien ...
Primero, cree manualmente una cantidad de sprites de grupos de hojas de té como su "piscina" de arte, no cada una como una taza entera de hojas de té, sino más bien como un grupo más pequeño. Digamos, 20 de ellos más o menos?
Luego coloque un número aleatorio de ellos en coordenadas aleatorias en la base de la "taza". Dé a cada uno una rotación y escala aleatorias más un reflejo horizontal y / o vertical aleatorio. Esto debería crear un buen resultado.
Este enfoque le dará la libertad artística para crear los grupos individuales para tener el aspecto que desea, al tiempo que permite una gran variedad de resultados (suponiendo que haya suficientes sprites para elegir).
Además, con esto (y cualquier método aleatorio, incluido el ruido basado en Perlin), en realidad podría sembrar el generador de números aleatorios al comienzo del proceso con una semilla conocida para obtener resultados reproducibles. Si guarda la semilla, puede recrear exactamente el mismo patrón nuevamente al reiniciar justo antes de que comience la secuencia. Incluso podría hacer cosas divertidas como hacer que alguien escriba su nombre, convertir las letras en un número (suma ASCII, etc.), y luego usarlo como semilla como una especie de "este patrón de hojas de té personalizado para USTED". cosa.
Aquí hay un pseudocódigo para lo que quiero decir, si eso ayuda ...
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);
}
Visite http://mathworld.wolfram.com/DiskPointPicking.html para una gran discusión sobre cómo elegir un punto aleatorio en un disco y por qué estoy usando todo eso de sqrt / sin / cos.