Jeffrey Cross
Jeffrey Cross

Codebox: Buat menagerie fraktal

Fraktal, menurut Wikipedia, adalah "bentuk geometri yang kasar atau berpecah-belah yang boleh dibahagikan kepada bahagian-bahagian, masing-masing (sekurang-kurangnya kira-kira) satu salinan saiz keseluruhan yang dikurangkan." Salah satu perkara yang sejuk tentang fraktal ialah mereka menggunakan proses yang benar-benar mudah untuk membuat benda-benda yang kelihatan kompleks dan semulajadi, seperti tumbuhan, awan, api, dan sebagainya. Kod Codebox ini akan menunjukkan kepada anda cara membuat fractal menagerie untuk melihat beberapa gaya fraktal yang berbeza, seperti ini:

Di sepanjang jalan, kami akan terus memperluaskan konsep pemrograman berorientasikan objek (OOP) yang diperkenalkan dalam Bab 9 Bermula dengan Pemprosesan, serta menunjukkan bagaimana menggunakan perpustakaan kawalan yang hebat untuk membuat kawalan GUI biasa yang digunakan dalam bahasa lain .

Fraktal IFS

Sistem Fungsi Iterated, atau IFS, adalah salah satu teknik yang paling mudah untuk menghasilkan fraktal yang kelihatan alami. IFS terdiri daripada segelintir transformasi (lebih banyak perkara ini dalam detik) yang menggambarkan bagaimana mengubah satu titik ke titik lain. Fern Barnsley, yang kelihatan seperti Black Spleenwort (sejenis pakis), adalah contoh klasik fraktal IFS, tetapi terdapat banyak jenis. Larry Riddle mempunyai pecahan yang baik dari orang lain di halaman sistem IFSnya.

Teknik ini berfungsi seperti ini. Bermula dari satu titik, biasanya (0,0), anda secara rawak memohon salah satu daripada transformasi yang membentuk sistem IFS. Kemudian, sebaik sahaja anda mempunyai titik yang baru berubah, anda plot pada skrin, yang dalam Pemprosesan, kami lakukan dengan tetapkan () perintah. Kemudian, anda mengulangi proses sekali lagi bermula dari titik yang anda hanya dikira.

Selepas beberapa ratus lelaran, anda akan mula melihat garis besar paku paku. Selepas 100,000 lelaran, anda akan melihat imej terperinci yang kelihatan hampir sama seperti objek semulajadi. Imej berikut menunjukkan sistem IFS untuk pakis Barnsley, serta imej yang menghasilkan apabila anda menerapkan proses berulang kali.

Mari buangkan butiran lebih lanjut. Transformasi adalah formula yang ... baik, mengubah satu titik ke titik lain. Seperti transformasi diterjemahkan, berputar, dan skala yang diterangkan pada halaman 104 Memulakan Pemprosesan, transformasi dalam peta sistem IFS satu titik ke lokasi baru dengan menggunakan matriks transformasi, yang merupakan cara tersendiri mewakili satu set formula .

Jadual yang menentukan sistem IFS memberikan nilai yang digunakan dalam matriks. Lajur a, b, d, d, e, dan f mewakili pelbagai elemen dalam matriks. (Saya akan bercakap mengenai lajur p dalam detik.) Angka seterusnya menunjukkan cara untuk menerjemahkan baris dalam sistem IFS ke dalam matriks:

Sebagai contoh, inilah matriks transformasi ke-3 untuk Fern Barnsley yang ditunjukkan sebelum ini:

Lajur terakhir dalam matriks IFS, p, mewakili kekerapan yang mana transformasi dipilih. Oleh itu, untuk pakis Barnsley, transformasi f1 dipilih 1% dari masa, f2 dipilih 85% dari masa, dan f3 dan f4 masing-masing dipilih 7% dari masa itu. Jika ini sedikit mengelirukan, fikirkan seolah-olah anda mengisi sebuah beg dengan 100 kelereng, masing-masing berlabel setiap satu dengan salah satu fungsi ini. Anda akan mempunyai 1 marmar untuk f4, 85 untuk f2, 7 untuk f3, dan 7 untuk f4. Pada setiap lelaran, anda akan merangkul marmar secara rawak dari beg itu, melihat labelnya, menggunakan transformasi yang sepadan, dan kemudian jatuhkan marmar ke dalam beg itu.

controlP5

Sekarang anda memahami idea asas frasa IFS, mari kita lihat dengan cepat controlP5, pustaka kod oleh Andreas Schlegel untuk membuat kawalan input pengguna yang biasa, seperti ini:

Kami akan menggunakan kawalan "tombol" untuk membolehkan pengguna menetapkan bilangan lelaran yang digunakan untuk membuat lukisan, dan kawalan "radio" untuk memilih sistem IFS untuk dipaparkan.

Sebelum kita boleh menggunakan perpustakaan dalam lakaran kita, kita perlu memasangnya. Langkah pertama ialah memastikan anda mempunyai direktori yang dipanggil "pustaka" dalam direktori Buku Sketchbook anda. Anda boleh mencari direktori Sketchbook dengan membuka tetingkap Keupayaan Pemprosesan. Anda akan melihat nama direktori di bahagian atas:

Setelah anda berada di direktori utama, gunakan alat seperti Explorer Window, pencari Mac, atau terminal yang dipercayai oleh UNIX, untuk melihat apakah ada subdirektori yang disebut "perpustakaan." Jika demikian, anda sudah siap. Jika tidak, kemudian buat subdirektori (pastikan untuk menamakannya "perpustakaan").

Seterusnya, anda sudah bersedia untuk memasang controlP5. Pergi ke halaman utama controlP5 dan klik pautan untuk memuat turun versi terkini perpustakaan. (Anda akan menemui pautan di dalam kotak hijau di bahagian atas, pusat skrin.) Setelah anda memuat turun fail, nyahpasangnya, dan salin fail ke dalam subdirektori "pustaka" anda. Mula semula Pemprosesan, dan anda harus melihat pustaka muncul di bawah butang menu "Lakaran -> Import Perpustakaan".

Selepas pustaka dipasang, mulakan Pemprosesan. Kini kami bersedia untuk bercakap sedikit tentang apa yang fraktal sampingan projek.

Sediakan lakaran

Whew! Itu adalah banyak bahan tinjauan, tetapi sekarang controlP5 dipasang, kami bersedia menggunakan Pemprosesan untuk melaksanakan sistem IFS yang diterangkan sebelum ini. Mula Pemprosesan, dan kemudian paste kod berikut ke dalam editor teks. (Seperti biasa, anda boleh menyerlahkan semua kod dalam kotak berikut dan kemudian tekan ctrl_c, atau anda boleh mengklik pautan ini ke controlp5_fractals.pde dan kemudian gunakan ctrl + a, ctrl + c kombinasi.) Berikut adalah kododok:

Ada satu perkara yang mungkin anda perhatikan semasa anda meneruskan contohnya: ia mengandungi beberapa definisi kelas di akhir fail. Dalam Codebox terakhir, Swat dan (arraylist) sasaran, kami meletakkan semua kelas menjadi tab berasingan. Tetapi, ini tidak diperlukan - ia benar-benar baik untuk mengikat mereka semua ke dalam satu fail, seperti yang saya lakukan di sini. Sekiranya anda ingin membahagikannya ke dalam tab berasingan, pastikan anda menamakan fail yang sama seperti kelas.

Nyalakan kod dan anda akan melihat sesuatu yang sangat mirip dengan video pada permulaan post ini. Anda boleh mengklik butang radio untuk memilih salah satu daripada pelbagai frasa IFS yang berbeza, dan juga boleh menggunakan pengawal tombol untuk menetapkan bilangan lelaran.

Perbincangan

Kod mentakrif tiga kelas yang berfungsi sebagai blok bangunan untuk projek:

  • Kelas Transform. Kelas ini melakukan semua matematik yang terlibat dalam matriks transformasi. Kebanyakan kod dikhaskan untuk menyimpan semua pembolehubah. The evalX () dan evalY () kembalikan koordinat X dan Y baru untuk titik yang anda lalui.
  • Kelas IFS. Kelas ini melaksanakan struktur data IFS. Ia terdiri daripada kelas ArrayList of Transform yang dipanggil tranforms, ArrayList untuk mewakili pengagihan kekerapan transform yang dipanggil histogram (memperluaskan analogi terdahulu kita, ini adalah beg kelereng yang akan kita gunakan untuk memilih perubahan rawak daripada), dan keterangan. Kaedah utama adalah: adalah addTransform (), yang menambah Transform baru kepada ubah senarai; addHistogram (), yang menambah "marmar" baru kepada histogram pengedaran frekuensi berdasarkan Transformasi p nilai; dan selectRandomTransform (), yang digunakan untuk memilih salah satu daripada mengubah secara rawak berdasarkan pengedaran frekuensi yang dinyatakan dalam histogram ArrayList.
  • Kelas Point. Memegang koordinat x dan y untuk mata dalam fraktal.

Kami menggunakan kelas ini dalam pelbagai cara dalam program utama. Pertama, dalam bahagian yang paling jelas kod, kita menggunakan IFS dan Transform untuk menentukan pelbagai fraktal yang ingin kita paparkan. Sebagai contoh, inilah kod untuk mencipta Barnsley Fern:

c = IFS baru ("Barnsley Fern Klasik"); c.addTransform (Transform baru (0.0, 0.0, 0.0, 0.16, 0.0, 0.0, 0.01)); c.addTransform (Transform baru (0.85, 0.04, -0.04, 0.85, 0.0, 1.6, 0.85)); c.addTransform (Transform baru (0.2, -0.26, 0.23, 0.22, 0.0, 1.6, 0.07)); c.addTransform (Transform baru (-0.15, 0.28, 0.26, 0.24, 0.0, 0.44, 0.07)); patterns.add (c);

Dan, berikut kod untuk menentukan lengkung Naga:

c = new IFS ("Dragon"); c.addTransform (Transformasi baru (0.5, -0.5, 0.5, 0.5, 0.0.0.0, .50)); c.addTransform (Transform baru (-0.5, -0.5,0.5, -0.5,1.0,0.0, 0.50)); patterns.add (c);

Seterusnya, kami menyediakan kawalan tombol knob dan radioP5. Ini memerlukan 2 bahagian langkah. Yang pertama berlaku di persediaan () kaedah, di mana kedua-dua kawalan ditambah ke lakaran. Menambah tombol cukup mudah, dan hanya memerlukan satu baris:

iterationKnob = controlP5.addKnob ("iterationKnob", N_MIN, N_MAX, N, 10,10,50);

Butang radio memerlukan sedikit kod tambahan kerana sebagai tambahan untuk menambahkan kawalan itu sendiri, kami juga perlu menambah item yang boleh dipilih. Ini dilakukan dengan melingkari ArrayList corak IFS dan kemudian menggunakan keterangan bidang sebagai item pemilihan dalam butang radio. Inilah kodanya:

ifsRadio = controlP5.addRadio ("ifsSelect", 70,10); untuk (int i = 0; i <patterns.size (); i ++) {IFS p = (IFS) patterns.get (i); ifsRadio.add (p.description, i); }

Bahagian kedua menggunakan pustaka controlP5 adalah untuk menubuhkan kaedah tindakan yang dicetuskan apabila pengguna berinteraksi dengan kawalan. Kuncinya adalah untuk memberikan kaedah nama yang sama seperti * deskripsi * yang anda gunakan apabila anda menambah kawalan, bukan nama pemboleh ubah contoh kawalan. Sebagai contoh, apabila kami menambah ifsRadio mengawal, kita gunakan ifsSelect sebagai perihalan. Ini bermakna kita akan memerlukan kaedah yang sepatutnya dipanggil ifsSelect () untuk menerima apa-apa klik pengguna membuat kawalan. Kaedah ini juga mesti mempunyai parameter yang akan memegang nilai semasa kawalan.

Jadi, untuk ifsSelect () kaedah, kami mempunyai parameter yang akan memberitahu kami indeks senarai item yang baru dipilih. Kami kemudian akan menggunakan indeks itu untuk mendapatkan pola IFS yang betul dan menjadikannya saat ini dipaparkan. Rajah berikut merangkumi semua elemen dalam permainan. (ControlP5 mengendalikan semua kerja sedikit berbeza, tetapi laman web ini mempunyai contoh hebat tentang cara menggunakannya semua.):

Sekeping akhir teka-teki adalah makeIFS () kaedah, yang menjadikan pengiraan sebenar diperlukan untuk mencipta fraktal. Kerana sistem IFS sangat elegan, tidak ada yang mengatakannya. Kami hanya mengulangi melalui bilangan lelaran yang dinyatakan dalam pembolehubah N (nilai yang ditetapkan oleh lelaranKnob () kaedah), tarik keluar dari sistem IFS semasa (nilai yang telah ditetapkan di dalam ifsSelect () kaedah), dan kemudian tambah setiap titik ke dalam pelbagai objek Point. Kami juga menjejaki julat nilai X dan Y supaya kita dapat skala imej untuk mengisi kawasan lukisan.

Lebih banyak: Lihat semua lajur Codebox

Dalam Maker Shed:


Bermula dengan Memproses Belajar pengaturcaraan komputer cara mudah dengan Pemprosesan, bahasa mudah yang membolehkan anda menggunakan kod untuk membuat lukisan, animasi, dan grafik interaktif. Kursus pengaturcaraan biasanya bermula dengan teori, tetapi buku ini membolehkan anda melompat ke dalam projek yang kreatif dan menyeronokkan. Ia sesuai untuk sesiapa sahaja yang ingin belajar pengaturcaraan asas, dan berfungsi sebagai pengenalan mudah kepada grafik untuk orang yang mempunyai kemahiran pengaturcaraan.

Kongsi

Meninggalkan Komen