Como eu provavelmente faria isso para manter um pouco de controle de arte e não gastar muito tempo tentando ajustar um método processual para fazê-lo da maneira certa ...
Primeiro, crie manualmente vários sprites de folhas de chá como sua "piscina" de arte - não cada uma como uma xícara inteira de folhas de chá, mas mais como um grupo menor. Digamos, 20 deles mais ou menos?
Em seguida, coloque um número aleatório deles em coordenadas aleatórias na base "xícara". Faça uma rotação e escala aleatórias e espelhamento horizontal e / ou vertical aleatório. Isso deve criar um bom resultado.
Essa abordagem lhe dará a liberdade artística na criação de grupos individuais para ter a aparência desejada, enquanto permite uma enorme variedade de resultados (assumindo sprites suficientes para você escolher).
Além disso, com isso (e com qualquer método aleatório, incluindo o ruído Perlin), você pode realmente propagar o gerador de números aleatórios no início do processo com uma semente conhecida para obter resultados reproduzíveis. Se você salvar a semente, poderá recriar exatamente o mesmo padrão novamente, propagando novamente antes do início da sequência. Você pode até fazer coisas divertidas, como alguém digitar seu nome, transformar as letras em um número (soma ASCII, etc.) e usá-las como semente como uma espécie de "esse padrão de folha de chá personalizado para VOCÊ!" coisa.
Aqui estão alguns pseudocódigo do que quero dizer, se isso ajudar ...
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);
}
Confira http://mathworld.wolfram.com/DiskPointPicking.html para uma ótima discussão sobre como escolher um ponto aleatório em um disco e por que estou usando toda essa coisa sqrt / sin / cos.