Perlu gagasan untuk algoritme untuk menggambar bentuk bercak tidak beraturan


8

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!


2
Saya akan membantu jika Anda melampirkan beberapa contoh bentuk seperti itu, tetapi dari apa yang saya mengerti, algoritma Marching Squares mungkin yang Anda cari.
Alexander Konstantinov

Sebagai contoh, dalam semua keseriusan, pikirkan bintik-bintik hati: bulat, acak, tetapi umumnya berbentuk bulat telur.
Yttermayn

6
Posting Mathematica.SE ini memiliki beberapa contoh yang mungkin menarik bagi Anda: Mathematica.stackexchange.com/questions/3345/… Jawaban atas pada dasarnya melakukan apa yang Anda lakukan. yang lain menemukan lambung cembung dari titik-titik acak dan kemudian menginterpolasi spline melalui itu, tetapi itu tampaknya sedikit rumit ...
Jemmy

Terima kasih atas tanggapan Anda! Sayangnya saya pikir saya mungkin sedikit berlebihan. Saya mungkin harus memikirkan hal lain.
Yttermayn

4
Bagaimana dengan memulai dengan lingkaran dekat dengan ukuran yang diinginkan dan kemudian permutasi menggunakan perlin noise. Baik dengan menggerakkan piksel yang dipilih, atau dengan memudar / memperluas lingkaran.
floAr

Jawaban:


1

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.


1

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 yang dibuat dengan suara putih

Gumpalan "Pink Noise": Gumpalan yang dibuat dengan suara merah muda

Gumpalan "Brownian Noise": Gumpalan yang dibuat dengan suara brown

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.


(Perhatikan juga: fakta bahwa bentuk-bentuk ini sangat dekat dengan simetris adalah artefak dari (a) koefisien dari harmonik kedua dan keempat menjadi sangat kecil, dan (b) fase dari harmonik pertama, ketiga dan kelima - berapa banyak kita menggeser nilai theta - menjadi sangat dekat, pada .468, .464 dan .443; kebanyakan 'gumpalan' hampir tidak memiliki kesimetrisan tentang hal ini.)
Steven Stadnicki

0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.