Jak zapewne bym to zrobił, abym mógł zachować kontrolę nad sztuką i nie spędzać dużo czasu próbując ulepszyć metodę proceduralną, aby uzyskać właściwy efekt ...
Po pierwsze, ręcznie utwórz kilka sprajtów kępek liści herbaty jako „pulę” sztuki - nie każda jako wartość liści herbaty, ale bardziej jako mniejsza grupa. Powiedz, około 20 z nich?
Następnie umieść ich losową liczbę na losowych współrzędnych na podstawie „kubka”. Daj każdemu losowy obrót i skalę oraz losowe odbicie lustrzane w poziomie i / lub w pionie. To powinno stworzyć dobry wynik.
Takie podejście zapewni artystyczną swobodę w tworzeniu pojedynczych grup, aby wyglądały tak, jak chcesz, jednocześnie pozwalając na ogromną różnorodność wyników (przy założeniu wystarczającej liczby duszków do wyboru).
Dodatkowo, dzięki tej (i dowolnej losowej metodzie, w tym opartej na szumie Perlina), można faktycznie zaszczepić generator liczb losowych na początku procesu znanym ziarnem, aby uzyskać powtarzalne wyniki. Jeśli zapiszesz ziarno, będziesz w stanie dokładnie odtworzyć ten sam wzór, ponownie sadząc tuż przed rozpoczęciem sekwencji. Możesz nawet robić fajne rzeczy, np. Wpisać imię i nazwisko, zamienić litery na cyfry (suma ASCII itp.), A następnie użyć tego jako ziarna jako pewnego rodzaju „tego wzoru liści herbaty dostosowanego do CIEBIE!” rzecz.
Oto pseudokod tego, co mam na myśli, jeśli to pomaga ...
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);
}
Sprawdź http://mathworld.wolfram.com/DiskPointPicking.html, aby uzyskać świetną dyskusję o tym, jak wybrać losowy punkt na dysku i dlaczego używam tego całego sqrt / sin / cos.