Как я, вероятно, сделал бы это, чтобы я мог сохранять некоторый контроль над искусством и потенциально не тратить много времени, пытаясь настроить процедурный метод, чтобы сделать это правильно ...
Во-первых, вручную создайте несколько спрайтов сгустков чайного листа в качестве своего «пула» - не каждый как чайный лист на целую чашку, а скорее как небольшая группировка. Скажем, 20 из них или около того?
Затем поместите случайное количество из них в случайных координатах на базе «чашки». Дайте каждому случайное вращение и масштаб плюс случайное горизонтальное и / или вертикальное зеркальное отображение. Это должно создать хороший результат.
Этот подход даст вам артистическую свободу в создании отдельных сгустков, чтобы они выглядели так, как вам хочется, и в то же время позволит получить огромное разнообразие результатов (при условии выбора достаточного количества спрайтов).
Кроме того, с помощью этого (и любого случайного метода, в том числе на основе шума Перлина), вы можете фактически запустить генератор случайных чисел в начале процесса с известным начальным числом для получения воспроизводимых результатов. Если вы сохраните начальное значение, вы сможете заново воссоздать тот же самый образец, повторно заполнив его перед началом последовательности. Вы могли бы даже сделать забавные вещи, например, попросить кого-нибудь напечатать свое имя, превратить буквы в число (сумма ASCII и т. Д.), А затем использовать это в качестве начального числа как своего рода «этот образец чайного листа, настроенный для ВАС!» предмет.
Вот какой-то псевдокод для того, что я имею в виду, если это поможет ...
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);
}
Посетите http://mathworld.wolfram.com/DiskPointPicking.html, чтобы обсудить, как выбрать случайную точку на диске и почему я использую эту функцию sqrt / sin / cos.