[การแนะนำ]
ฉันได้อ่าน "The Secret Concise" มีบทหนึ่งที่แนะนำวิธีการหลายวิธีในการใช้เสียงรบกวนเพื่อสร้างแผนภูมิเศษส่วน มันให้ความรู้สึกที่น่าสนใจมากดังนั้นฉันจึงพยายามใช้คอมพิวเตอร์เพื่อจำลองมันและเอฟเฟกต์นั้นไม่เลว (วิธีการรบกวนง่ายต่อการใช้งานในการเขียนโปรแกรมมากกว่าวิธีการวนซ้ำแบบดั้งเดิมหลังจากนั้นฉันก็พบว่ายังมีอัลกอริทึมดังกล่าวอีกมากมายดังนั้นฉันจึงสามารถค้นหา Chaosgame ได้มากขึ้น)
[วิธีการสร้างเสียงสามเหลี่ยม Sierpinski]
ในเกมเสียงรบกวนเหล่านี้กฎสำหรับการสร้างรูปสามเหลี่ยม Sierpinski นั้นง่ายที่สุด:
1. เลือกสามจุดบนเครื่องบินที่ทำเครื่องหมายเป็น 1, 2 และ 3 เป็นจุดยอดของสามเหลี่ยมขนาดใหญ่
2. เลือกหนึ่งในนั้นเป็น "จุดปัจจุบัน" (เช่นการเลือกหมายเลข 1)
3. สร้างจำนวนสุ่ม 1 ถึง 3 วาดจุดใหม่ที่จุดกึ่งกลางของจุดสุดยอดและ "จุดปัจจุบัน" ที่แสดงโดยจำนวนและใช้จุดใหม่เป็น "จุดปัจจุบัน"
4. ทำซ้ำขั้นตอนที่ 3 เพื่อเข้าใกล้รูปแบบมากขึ้น
- ให้ความสนใจกับตัวเลขแบบสุ่มเป็นการดีที่สุดที่จะไม่ใช้เวลาเป็นวิธีการสร้างเมล็ดพันธุ์
[โปรแกรมจำลอง]
แพ็คเกจ com.geiv.chaos; นำเข้า java.awt.event.keyevent; นำเข้า com.thlblock.util.randomset; นำเข้า geivcore.defaultfactor; นำเข้า geivcore.keyfactor; นำเข้า geivcore.keylistener; นำเข้า geivcore.r; ขยาย defaultFactor ใช้ keyListener {uesi ues; obj [] basepoint; obj crtpoint; sierpinski สาธารณะ (uesi ues, ครั้ง int) {this.ues = ues; basepoint = ใหม่ obj [3]; // ues.creatobj (uesi.bgindex); basepoint [i] .addglpoint ("70dbdb", 0,0); basepoint [i]. show ();} basepoint [0] .setcentralx (400); // ตั้งตำแหน่งสามจุดสามจุด basepoint [0] .setCentraly (60); basepoint [1] .setCentralx (60); basepoint [1] .setCentraly (550); basepoint [2] .setCentralx (740); basepoint [2] this.setKeyListener (นี่); ues.pushkeyboardio (นี่); สำหรับ (int i = 0; i <times; i ++) {generatenew ();}}@entride โมฆะสาธารณะ dokeybord (keyfactor ใคร จุดใหม่ที่สอดคล้องกับ generatenew ();} else ถ้า (keycode == keyevent.vk_a) {// a สอดคล้องกับ 100 จุดใหม่สำหรับ (int i = 0; i <100; i ++) {generatenew (); 1000; i ++) {generatenew ();}}}}} โมฆะสาธารณะ generatenew () {obj flagpoint = basepoint [randomset.getRandomNum (0, 2)]; // สุ่มเลือกจุดอ้างอิงหนึ่ง nx = (flagpoint.getCentraly () + crtpoint.getCentraly ())/2f; obj newpoint = ues.creatobj (uesi.bgindex); // สร้างจุดใหม่ newpoint.addglpoint ("70dbdb", 0,0); newpoint.set.setcolor ประสานงาน newpoint.setCentraly (NY); newPoint.show (); crtpoint = newpoint; // ตั้งเป็นจุดปัจจุบัน} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {uesi ues = new r (); Sierpinski ใหม่ (Ues, 0); // พารามิเตอร์การก่อสร้างที่ตามมา -[ผลการจำลอง]
เมื่อกดปุ่ม B
[วิธีการสร้างเสียงรบกวนของ Barnsleyfern]
เมื่อเปรียบเทียบกับความสม่ำเสมอของสามเหลี่ยม Sierpinski, Barnsleyfern (หญ้าฟันเศษส่วน) ทำให้ผู้คนมีความประทับใจมากขึ้น เนื่องจากความซับซ้อนของความสับสนวุ่นวายมักเกิดขึ้นเพื่อพิสูจน์ข้อสรุปว่า "กฎง่าย ๆ สามารถสร้างวัตถุที่ซับซ้อนได้"
กฎการสร้างของมันไม่ซับซ้อนเช่นกัน:
1. ก่อนอื่นให้ "จุดปัจจุบัน" (0,0) เราใช้ OX และ OY เพื่อเป็นตัวแทนของพิกัดแนวนอนและแนวตั้ง
2. ในการคำนวณจุดถัดไป (NX, NY) คุณต้องเลือกหนึ่งในสี่สูตรการวนซ้ำต่อไปนี้ด้วยกฎสุ่มบางอย่าง:
1) เลือกสูตรการวนซ้ำนี้ด้วยความน่าจะเป็น %1:
nx = 0;
ny = 0.16f*oy;
2) เลือกสูตรการวนซ้ำนี้ด้วยความน่าจะเป็นของ %85:
nx = 0.85*ox+0.04*oy;
ny = -0.04*ox+0.85*oy+1.6;
3) เลือกสูตรการวนซ้ำนี้ด้วยความน่าจะเป็นของ %7:
nx = 0.2*ox-0.26*oy;
ny = 0.23*ox+0.22*oy+1.6;
4) เลือกสูตรการวนซ้ำนี้ด้วยความน่าจะเป็นของ %7:
nx = -0.15*ox+0.28*oy;
ny = 0.26*ox+0.24*oy+0.44;
3. วาด (NX, NY) ตั้งค่าเป็นจุดปัจจุบันทำซ้ำ 2 และคุณสามารถประมาณผลลัพธ์ได้อย่างไม่มีที่สิ้นสุด
↑สูตรข้างต้นถูกตัดตอนมาจาก wiki: http://en.wikipedia.org/wiki/barnsley_fern เมื่อเขียนโปรแกรมฉันพบปัญหา วิกิไม่ได้ระบุความสัมพันธ์ระหว่างค่าสัมพัทธ์ของพิกัดนี้และขนาดหน้าจอและไม่ได้ระบุทิศทางของแกน x และ y ภาพวาดนั้นไม่ประสบความสำเร็จภายใต้ระบบพิกัดที่ฉันกำหนดไว้เสมอ ต่อมาฉันค้นหาตามสูตรและพบพื้นผิวนี้: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp นี่คือโปรแกรม OpenGL ใน C ++ และใช้สูตรเดียวกับ Wiki กล่าวคือสูตรชุดนี้ขึ้นอยู่กับระบบพิกัดของ OpenGL หลังจากทำการเปลี่ยนแปลงที่สอดคล้องกันในที่สุดก็ประสบความสำเร็จ
[โปรแกรมจำลอง]
แพ็คเกจ com.geiv.chaos; นำเข้า geivcore.defaultfactor; นำเข้า geivcore.keyfactor; นำเข้า geivcore.keylistener; นำเข้า geivcore.r; นำเข้า geivcore.uesi; นำเข้า geivcore.enginedata.obj.obj; com.thlblock.util.randomset; คลาสสาธารณะ Barnsleyfern ขยาย defaultFactor ใช้ keyListener {uesi ues; obj crtpoint; Public Barnsleyfern (Uesi ues, int) {this.ues = ues; crtpoint = ues.creatobj (uesi.bgindex); crtpoint.addglpoint ("70dbdb", 0,0); crtpoint.show (); crtpoint.setcentralx (0); crtpoint.setcentraly (0); 0; i <times; i ++) {generatenew ();}}@การแทนที่โมฆะสาธารณะ dokeybord (keyfactor ผู้ที่, int keycode, boolean ispressed) {// วิธีการคีย์บอร์ด io นั้นเหมือนกับด้านบนถ้า keyeVent.vk_a) {สำหรับ (int i = 0; i <100; i ++) {generatenew ();}} อื่นถ้า (keycode == keyevent.vk_b) {สำหรับ (int i = 0; i <100; i ++) {generatenew ();}}}} 1000; i ++) {generatenew ();}}}} โมฆะสาธารณะ generatenew () {float nx, ny; float ox = crtpoint.getcentralx ()/150f, oy = (600 - crtpoint รหัสสองครั้ง = 100.0 * randomset.getRandomfloatin_1 (); // หมายเลขจุดลอยตัวแบบสุ่ม 0 ~ 100 ถ้า (รหัส> = 0 && รหัส <= 1) {nx = 0; ny = 0.00f * ox + 0.16f * oy;} ถ้า (รหัส> 1 && รหัส <= 86) 0.85f*oy + 1.6f;} อื่นถ้า (รหัส> 86 && รหัส <= 93) {nx = 0.2f*ox - 0.26f*oy; ny = 0.23f*ox + 0.22f*oy + 1.6f;} {nx = -0.15f*ox 0.44f;} obj newpoint = ues.creatoBj (uesi.bgindex); newpoint.addglpoint ("70dbdb", 0,0); newpoint.setcolor (color.green); newpoint.setcentralx (nx*150f); // ny*60f); newpoint.show (); crtpoint = newpoint; // ตั้งค่าจุดใหม่เป็นจุดปัจจุบัน } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {uesi ues = new r (); ใหม่ barnsleyfern (ues, 0);}}[ผลการจำลอง]
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับรหัสตัวอย่างเกม Java Chaos Game Game ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!