[Perkenalan]
Saya telah membaca "The Secret Ringkas". Ada bab di dalamnya yang memperkenalkan beberapa metode menggunakan noise untuk menghasilkan grafik fraktal. Rasanya sangat menarik, jadi saya mencoba menggunakan komputer untuk mensimulasikannya, dan efeknya tidak buruk (metode kebisingan lebih mudah diimplementasikan dalam pemrograman daripada metode iteratif tradisional. Kemudian saya menemukan bahwa masih ada banyak algoritma seperti itu, jadi saya dapat menemukan lebih banyak pencarian chaosgame).
[Metode Pembuatan Kebisingan Segitiga Sierpinski]
Dalam permainan kebisingan ini, aturan untuk menghasilkan segitiga Sierpinski adalah yang termudah:
1. Pilih tiga titik di pesawat, ditandai sebagai 1, 2, dan 3, sebagai simpul segitiga besar.
2. Pilih salah satu dari mereka sebagai "titik saat ini" (seperti memilih No. 1).
3. Hasilkan jumlah acak 1 hingga 3, gambar titik baru di titik tengah simpul dan "titik saat ini" yang diekspresikan oleh angka, dan gunakan titik baru sebagai "titik saat ini".
4. Ulangi Langkah 3 untuk lebih dekat dengan pola.
*. Perhatikan angka acak, sebaiknya tidak menggunakan waktu sebagai cara pembuatan benih.
[Program Simulasi]
Paket com.geiv.chaos; impor java.awt.event.keyevent; import com.thrblock.util.randomset; impor geivcore.defaultfactor; impor geivcore.keyfactor; impor geivcore.keylistener; impor geivcore.r; impor geivcore.uesion; impor geivcore.r; impor geivcore.uesion; impor geivcore.r; impor geivcore. extends DefaultFactor implements KeyListener{UESI UES;Obj[] basePoint;Obj crtPoint;public Sierpinski(UESI UES,int times){this.UES = UES;basePoint = new Obj[3];//Create three benchmark points for (int i = 0;i < 3;i++){basePoint[i] = Ues.creatobj (Uesi.Bgindex); Basepoint [i] .addglpoint ("70dbdb", 0,0); Basepoint [i] .show ();} Basepoint [0] .setCentralx (400); // Tetapkan posisi tiga titik poin Basepoint [0] .setCentralyy (60); Basepoint [1] .setCentralx (60); Basepoint [1] .setCentraly (550); Basepoint [2] .setCentralx (740); Basepoint [2] .SetCentraly (550); Crtpoint = Basepoint [0];/Take Point 0 saat ini (550); crtpoint = Basepoint [0];//Take Point 0 The Point (550); crtpoint = Basepoint [0];/Take Point 0 The Stoint 0 The Current (The Current = Basepoint [0];/Take Point 0 The Stoint 0 The Current = The Curru this.setKeyListener (this); ues.pushkeyboardio (this); for (int i = 0; i <Times; i ++) {generAteNew ();}@override public void dokeybord (keyfactor) {ifEcpressy (ooleven {{oolEv) {oolEved {{{oolEv) {{{{{{{{{{{{{{Ifcressed) {{{Ifspressed) {{{{{Ifspressed) {{{{{{{{{{{{{terisrips) Titik baru yang sesuai dengan generAtEnew ();} lain jika (keycode == keyevent.vk_a) {// a sesuai dengan 100 poin baru untuk (int i = 0; i <100; i ++) {generAteNeW ();}} lain jika (keycode == keyevent.vk_b) {// B berkorespondensi ke (keycode == keyevent.vk_b) {// B berkorespondensi dengan KEYCODE == KEYEVENT.VK_B) {// B berkorespondensi dengan KEYCODE == KEYEVENT.VK_B) {// B berkoreseksi 1000; i ++) {generAteNew ();}}}}} public void generAteNew () {obj flagpoint = Basepoint [randomEset.getRandomnum (0, 2)]; // Pilih secara acak salah satu titik referensi float nx = (flagpoint.getCentRx ()+crtpoint.getConstral = midpoint (flagpoint/get/getconstralx ()+crtcoint.getConstral = Gety = midpoint/2 float () ()+crtcoint. (flagPoint.getCentralY() + crtPoint.getCentralY())/2f;Obj newPoint = UES.creatObj(UESI.BGIndex);//Create a new point newPoint.addGLPoint("70DBDB",0,0);newPoint.setColor(RandomSet.getRandomColdColor());newPoint.setCentralX(nx);//Set the Mengkoordinasikan newpoint.setCentraly (NY); newpoint.show (); crtpoint = newPoint; // Set sebagai titik saat ini} public static void main (string [] args) {uesi ues = new r (); new Sierpinski (ues, 0); // Paramet konstruksi selanjutnya dapat mengatur angka awal poin. }}[Hasil Simulasi]
Saat tombol B ditekan
[Metode pembuatan kebisingan Barnsleyfern]
Dibandingkan dengan keteraturan sederhana dari Segitiga Sierpinski, Barnsleyfern (rumput gigi fraktal) memberi orang kesan yang lebih kompleks. Karena kompleksitasnya, disiplin kekacauan sering muncul untuk membuktikan kesimpulan bahwa "aturan sederhana juga dapat menghasilkan objek yang kompleks."
Aturan generasinya juga tidak rumit:
1. Pertama, mengingat "titik saat ini" (0,0), kami menggunakan OX dan OY untuk mewakili koordinat horizontal dan vertikal.
2. Untuk menghitung titik berikutnya (NX, NY), Anda harus memilih salah satu dari empat formula iterasi berikut dengan aturan acak tertentu:
1) Pilih formula iterasi ini dengan probabilitas %1:
nx = 0;
NY = 0,16f*oy;
2) Pilih formula iterasi ini dengan probabilitas %85:
nx = 0,85*ox+0,04*oy;
NY = -0.04*OX+0.85*OY+1.6;
3) Pilih formula iterasi ini dengan probabilitas %7:
nx = 0,2*OX-0.26*oy;
NY = 0,23*OX+0,22*OY+1.6;
4) Pilih formula iterasi ini dengan probabilitas %7:
nx = -0.15*ox+0.28*oy;
NY = 0,26*OX+0,24*OY+0,44;
3. Draw (NX, NY), atur ke titik saat ini, ulangi 2, dan Anda dapat memperkirakan hasilnya tanpa batas.
↑ Formula di atas dikutip dari wiki: http://en.wikipedia.org/wiki/barnsley_fern. Saat pemrograman, saya menemukan masalah. Wiki tidak menentukan hubungan antara nilai relatif dari koordinat ini dan ukuran layar, juga tidak menentukan arah sumbu x dan y. Gambar selalu tidak berhasil di bawah sistem koordinat yang saya tentukan. Kemudian, saya mencari menurut formula dan menemukan permukaan ini: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp. Ini adalah program OpenGL di C ++, dan formula yang sama seperti wiki digunakan. Dengan kata lain, rangkaian formula ini didasarkan pada sistem koordinat OpenGL. Setelah melakukan transformasi yang sesuai, akhirnya berhasil ditarik.
[Program Simulasi]
Paket com.geiv.chaos; impor geivcore.defaultfactor; impor geivcore.keyfactor; impor geivcore.keylistener; impor geivcore.r; impor geivcore.uesion; impor geivcore.enginedata.obj.obj; impor java.awt.color; impor java.awkey; impor java.Awt.color; impor java.awkey; impor Java.Awt.color; impor JAVA. com.thrblock.util.randomset; kelas publik Barnsleyfern memperluas defaultFactor Default mengimplementasikan KeyListener {Uesi Ues; obj crtpoint; public barnsleyfern (Uesi Ues, int Times) {this.ues = ues; crtpoint = Ues.creatobj (uesi.bgindex); crtpoint.addglpoint ("70dbdb", 0,0); crtpoint.show (); crtpoint.setCentralx (0); crtpoint.setCentraly (0); ues.setViewofscetx (90); this.setCentraly (0); ues.setViewOffsxx (90); this.setCentraly (0); ues.setViewOffsx (90); this.setCentraly (0); 0;i < times;i++){generateNew();}}@Override public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {//The keyboard IO method is the same as above if(ispressed){if(keyCode == KeyEvent.VK_SPACE){generateNew();} else if(keyCode == Keyevent.vk_a) {for (int i = 0; i <100; i ++) {generAteNew ();}} lain jika (keycode == keyevent.vk_b) {for (int i = 0; i <100; i ++) {generAteW (); {}} lain if (keycode ==) {GenerAteW (); {}} lain if (keycode ==) {GenerAteNew (); {}} lain if (keycode ==) {GenerAteNew (); {}} lain (KEYCODE ==) {GenerAteNEW (); {}} {iF (KEYCODE ==) 1000; i ++) {GenerAteNew ();}}}} public void generAteNew () {float nx, ny; float ox = crtpoint.getCentralx ()/150f, oy = (600 - crtpoint.getCentraly ()/60f; // Opengl Conversion conversion conversion di sini, dan pointing. Kode ganda = 100.0 * randomeSet.getRandomFloatin_1 (); // Nomor titik mengambang acak 0 ~ 100 if (kode> = 0 && Kode <= 1) {nx = 0; NY = 0.00F * OX + 0.16F * oy;} lain jika (kode> 1 && kode <= 86) {nx = 0.85f * Ox + 0.0.0.0.04f; 0.85f*oy + 1.6f;} lain jika (kode> 86 && kode <= 93) {nx = 0.2f*ox - 0.26f*oy; ny = 0.23f*ox + 0.22f*oy + 1.6f;} else {nx = -0.15f*ox + 0.28f*oy; 0.44f;} obj newPoint = ues.createBj (Uesi.Bgindex); newpoint.addglpoint ("70dbdb", 0,0); newpoint.setColor (color.green); newpoint.setCentralx (nx*150f);//Batalkan koordinat sebelumnya. NY*60F); newpoint.show (); crtpoint = newPoint; // atur titik baru ke titik saat ini. } public static void main (string [] args) {uesi ues = new r (); baru barnsleyfern (ues, 0);}}[Hasil Simulasi]
Meringkaskan
Di atas adalah semua konten dari artikel ini tentang kode game Java Chaos Game Noise Game, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!