Bagaimana saya mungkin melakukannya sehingga saya bisa mempertahankan kontrol seni dan tidak berpotensi menghabiskan waktu lama mencoba untuk mengubah metode prosedural untuk mendapatkannya dengan benar ...
Pertama, secara manual buat sejumlah sprite rumpun daun teh sebagai "kolam" seni Anda - tidak masing-masing sebagai secangkir penuh daun teh, tetapi lebih seperti pengelompokan yang lebih kecil. Katakan, 20 atau lebih?
Kemudian tempatkan nomor acak dari mereka pada koordinat acak di pangkalan "cangkir". Berikan masing-masing rotasi dan skala acak ditambah cermin horizontal dan / atau vertikal acak. Ini seharusnya menciptakan hasil yang baik.
Pendekatan ini akan memberi Anda kebebasan artistik dalam menciptakan rumpun individu untuk memiliki tampilan yang Anda inginkan, sambil memungkinkan untuk berbagai hasil (dengan asumsi sprite yang cukup untuk dipilih).
Selain itu, dengan ini (dan metode acak apa pun termasuk Perlin noise based), Anda sebenarnya dapat menyemai generator nomor acak pada awal proses dengan benih yang dikenal untuk membuat hasil yang dapat direproduksi. Jika Anda menyimpan benih, Anda dapat membuat kembali pola yang sama persis dengan memasang kembali sesaat sebelum urutan dimulai. Anda bahkan dapat melakukan hal-hal menyenangkan seperti meminta seseorang mengetik nama mereka, mengubah huruf menjadi angka (jumlah ASCII, dll.), Kemudian menggunakannya sebagai benih sebagai semacam "pola daun teh ini disesuaikan untuk ANDA!" benda.
Inilah beberapa pseudocode untuk apa yang saya maksud, jika itu membantu ...
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);
}
Lihat http://mathworld.wolfram.com/DiskPointPicking.html untuk diskusi hebat tentang cara memilih titik acak dalam disk dan mengapa saya menggunakan seluruh hal sqrt / sin / cos.