Saya ingin menggambar bentuk yang tidak beraturan pada kotak x, y, dan saya ingin membuat metode sederhana dan cepat jika memungkinkan. Satu-satunya ide saya sejauh ini adalah untuk menggambar sekelompok lingkaran ukuran acak sangat dekat satu sama lain, tetapi pada jarak acak terpisah dari koordinat pusat yang kurang lebih, kemudian isi setiap ruang kosong. Saya menyadari bahwa ini adalah metode yang kikuk dan tidak berlaku, semoga ini akan memberi Anda gambaran kasar tentang bentuk-bentuk bulat, bintik-bintik acak yang saya tuju. Tolong sarankan metode untuk mencapai ini, saya tidak begitu tertarik pada kode. Saya bisa mie bagian itu sendiri. Terima kasih!
2d
algorithm
random
procedural
Yttermayn
sumber
sumber
Jawaban:
Anda mungkin ingin memilih beberapa titik, memilih vektor di setiap titik dan menggambar spline melalui mereka. Lihat halaman wikipedia ini untuk deskripsi sederhana tentang spline kubik (alias Irwin-Hall spline). Sudah lama sejak saya menggunakannya, tetapi jika saya ingat dengan benar, ini adalah yang saya temukan paling mudah untuk dipahami dan digunakan. Jika Anda tahu alat pena dari photoshop, ini bekerja sangat mirip (saya yakin photoshop juga menggunakan splines, tapi saya tidak yakin apakah itu spline kubik).
Jika Anda tertarik, ada lebih banyak splines: misalnya, spline Bezier dan B-splines menarik.
Hal lain yang terlintas dalam pikiran adalah set level, meskipun itu mungkin akan memerlukan sedikit riset lebih lanjut dari pihak Anda (untuk menemukan fungsi yang memenuhi kebutuhan Anda).
Set level adalah ketidaksetaraan dalam bentuk
f (x, y) = c di
mana f adalah beberapa fungsi dan c adalah beberapa konstanta.
Ini adalah deskripsi yang sangat umum. Anda mungkin ingin mengisi beberapa bentuk, dan menggambar semua piksel di mana
f (x, y) <= c
dengan beberapa warna. Misalnya, untuk bentuk 2d bulat sempurna, Anda memiliki persamaan yang terkenal:
x ^ 2 + y ^ 2 <= r ^ 2
Anda dapat skala komponen x dan y untuk mendapatkan ellipsoid Dengan sedikit eksperimen dan penelitian, itu akan mungkin untuk menemukan beberapa bentuk yang lebih lucu (saya kira).
Sunting: eksperimen kecil di wolframalpha.com memberi saya ini . (dibuat dengan perintah 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Saya tidak tahu apakah ini seperti yang Anda inginkan, tetapi itu hanya untuk memberi Anda ide.
sumber
Pendekatan langsung lainnya adalah dengan menggunakan noise frekuensi rendah Anda sendiri untuk menggambar (atau mendefinisikan) gambar dalam koordinat kutub.
Misalkan Anda menginginkan gumpalan yang berpusat di titik asal, dengan radius rata-rata 1; ini dapat dengan mudah ditingkatkan dan diterjemahkan ke posisi dan ukuran lain. Bayangkan dengan persamaan sederhana r = 1 - ini akan menentukan lingkaran jari-jari satu di titik asal. Untuk menambahkan sedikit variasi, Anda dapat mengubah jari-jari secara sinusoidal - tambahkan istilah bentuk w 1 * sin (θ + θ 1 ), di mana w 1 dan θ 1 adalah konstanta yang akan saya bahas kembali. Satu istilah dosa tidak akan membuat seluruh banyak perbedaan, tetapi memiliki beberapa berbeda sinus frekuensi yang berbeda akan mulai menambahkan persis seperti variasi 'lunak' Saya menduga Anda setelah. Bentuk keseluruhan akan sepanjang garis r = 1 + w 1 * sin (θ + θ 1 ) + w2 * dosa (2θ + θ 2 ) + w 3 * dosa (3θ + θ 3 ) + w 4 * dosa (4θ + θ 4 ) + w 5 * dosa (5θ + θ 5 ) - atau lebih banyak istilah jika Anda mau, tentu saja.
Jadi bagaimana kita memilih nilai untuk w i dan θ i ? Nah, shoulds seharusnya diambil secara acak dari (0,2π) - dengan kata lain, setiap 'gelombang' pada bentuk permukaan harus dimulai pada titik yang berbeda di sekitar bentuk. Adapun w's, ada beberapa pilihan berbeda. Memilih w i secara acak dari (0, w) (untuk beberapa w tetap yang mewakili 'variasi keseluruhan' untuk memberikan bentuk; Saya mungkin mulai dengan w = 0,25 tetapi bereksperimen dengan w = 0,1) untuk setiap saya akan mengarah ke jadi- disebut white noise , di mana semua frekuensi memiliki bobot yang sama - ini akan sejauh ini menjadi 'blobbiest', dengan variasi luas di semua frekuensi. Memilih w i secara acak dari (0, w * (1 / i)) - dengan kata lain,kebisingan, di mana beratnya turun, tapi perlahan. Ini juga dikenal sebagai noise 1 / f , dan ini adalah noise 'fraktal' yang paling terkenal. Akhirnya, memilih bobot secara acak dari (0, w * (1 / i ^ 2)) (dengan kata lain, membagi masing-masing bobot acak dengan i ^ 2) menghasilkan noise berwarna coklat - ini adalah 'paling lembut' dari ketiganya, dengan variasi terkecil dari lingkaran - umumnya akan berbentuk oval-ish.
Berikut adalah contoh dari ketiganya, menggunakan 'total berat' dari w = 0,25, dan menggunakan set nilai acak yang sama untuk w i dan θ yang saya tarik dari random.org :
Gumpalan "Kebisingan Putih":
Gumpalan "Pink Noise":
Gumpalan "Brownian Noise":
Perhatikan bahwa gumpalan ini tidak akan sempurna; khususnya, tidak mungkin bagi mereka untuk meringkuk pada diri mereka sendiri (karena untuk setiap θ - dengan kata lain, untuk setiap sudut dari asal - ada nilai r tunggal), dan jika Anda tidak memilih bobot Anda dengan benar mereka mungkin akan mandiri berpotongan (jika r dibiarkan negatif). Tapi mereka melakukan pekerjaan yang layak menjadi goblok secara meyakinkan, dan untuk sebagian besar aplikasi game pengguna tidak akan melihat masalah apa pun.
sumber
Selain jawaban lain, Anda bisa menggunakan suara Perlin dengan falloff bulat, jika Anda sedikit mengubah pengaturan, Anda dapat dengan mudah membuat beberapa bentuk yang bervariasi.
Jika Anda ingin kode Anda menjadi cepat, Anda bisa menggunakan pustaka penghasil derau seperti libnoise ( Anggap Anda menggunakan c ++), yang merupakan pustaka penghasil derau, yang membuat tugas serupa menjadi sangat sederhana, karena memberi Anda sebuah simpul pendekatan berbasis pada generasi prosedural berbasis kebisingan. Ini memiliki binding ke bahasa lain juga.
sumber