Як я, мабуть, зробив це, щоб я міг підтримувати деякий контроль над мистецтвом і не потенційно витрачати тривалий час, намагаючись налаштувати процедурний метод, щоб отримати це просто правильно ...
По-перше, створіть вручну ряд запахів із згустків чайного листя, як ваш художній "басейн" - не кожен, як ціла чашка чайних листків, а більше схожий на меншу групу. Скажіть, 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.