[مقدمة]
لقد قرأت "موجز سري". هناك فصل فيه يقدم عدة طرق لاستخدام الضوضاء لإنشاء مخططات كسورية. إنه شعور مثير للاهتمام للغاية ، لذلك حاولت استخدام جهاز كمبيوتر لمحاكاةه ، والتأثير ليس سيئًا (من الأسهل تنفيذ طريقة الضوضاء في البرمجة من الطريقة التكرارية التقليدية. وجدت لاحقًا أنه لا يزال هناك العديد من هذه الخوارزميات ، حتى أتمكن من العثور على المزيد بحثًا عن chaosgame).
[طريقة توليد الضوضاء Sierpinski مثلث]
في ألعاب الضوضاء هذه ، فإن قواعد توليد مثلثات Sierpinski هي الأسهل:
1. حدد ثلاث نقاط على متن الطائرة ، والتي تحمل علامة 1 و 2 و 3 ، كقراءات للمثلث الكبير.
2. حدد أحدهم كـ "النقطة الحالية" (مثل اختيار رقم 1).
3. قم بإنشاء عدد عشوائي من 1 إلى 3 ، ارسم نقطة جديدة عند نقطة منتصف الرأس و "النقطة الحالية" التي يعبر عنها الرقم ، واستخدم النقطة الجديدة كـ "النقطة الحالية".
4. كرر الخطوة 3 للاقتراب من النمط.
*. انتبه إلى أرقام عشوائية ، من الأفضل عدم استخدام الوقت كأسلوب توليد البذور.
[برنامج المحاكاة]
package com.geiv.chaos ؛ import java.awt.event.keyevent ؛ import com.throblock.util.randomset ؛ استيراد geivcore.defaultfactor ؛ استيراد geivcore.keyfactor DefaultFactor ينفذ keylistener {uesi ues ؛ obj [] basePoint ؛ obj crtpoint ؛ public sierpinski (uesi ues ، int times) {this.ues = ues ؛ basepoint = new 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] this.setKeyListener (this) ؛ ues.pushkeyboardio (this) ؛ for (int i = 0 ؛ i <times ؛ i ++) {generateNew () ؛ المقابلة لـ generatenew () ؛} آخر إذا (keycode == keyevent.vk_a) {// a يتوافق مع 100 نقطة جديدة لـ (int i = 0 ؛ i <100 ؛ i ++) {generatenew () ؛ 1000 ؛ i ++) {generateNew () ؛}}}}} public void generatenew () {obj flagpoint = basePoint [randomet.getRandomNum (0 ، 2)] (flagpoint.getCentraly () + crtpoint.getCentraly ())/2f ؛ obj newPoint = ues.creatobj (uesi.bgindex) ؛ // إنشاء نقطة جديدة newpoint.addgloint ("70dbdb" ، 0،0) ؛ تنسيق NewPoint.setCentraly (NY) ؛ newPoint.show () ؛ crtpoint = newPoint ؛ // تعيين كنقطة حالية} الفراغ الثابت العام (سلسلة [] args) {uesi ues = new r () ؛ new sierpinski (ues ، 0) ؛ }}[نتائج المحاكاة]
عندما يتم الضغط على مفتاح B
[طريقة توليد الضوضاء Barnsleyfern]
مقارنة بالانتظام البسيط لمثلث Sierpinski ، يمنح Barnsleyfern (عشب الأسنان الكسري) الناس انطباعًا أكثر تعقيدًا. بسبب تعقيدها ، غالبًا ما يأتي تخصص الفوضى لإثبات استنتاج مفاده أن "القواعد البسيطة يمكن أن تنتج أيضًا كائنات معقدة".
قواعد توليدها ليست معقدة أيضًا:
1. أولاً ، بالنظر إلى "النقطة الحالية" (0،0) ، نستخدم OX و OY لتمثيل الإحداثيات الأفقية والرأسية.
2. لحساب النقطة التالية (NX ، NY) ، تحتاج إلى تحديد واحدة من صيغ التكرار الأربعة التالية مع بعض القواعد العشوائية:
1) حدد صيغة التكرار هذه مع احتمال ٪ 1:
nx = 0 ؛
نيويورك = 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. بعد إجراء التحول المقابل ، تم رسمه أخيرًا بنجاح.
[برنامج المحاكاة]
package com.geiv.chaos ؛ import geivcore.defaultfactor ؛ import geivcore.keyfactor ؛ import geivcore.keylistener ؛ import geivcore com.throblock.util.randomset ؛ public class Barnsleyfern يمتد DefaultFactor الأدوات keylistener {uesi ues ؛ obj crtpoint ؛ public barnsleyfern (uesi ues ، int times) {this.ues = ues ؛ crtpoint = ues.creatobj (uesi.bgindex) ؛ crtpoint.addgloint ("70dbdb" ، 0،0) ؛ crtpoint.show () ؛ crtpoint.setCentralx (0) ؛ <times ؛ i ++) {generateNew () ؛}}@تجاوز public void dokeybord (keyfactor الذين ، int keycode ، boolean ispressed) {// طريقة لوحة المفاتيح IO هي نفسها كما هو الحال أعلاه (ispressed) {if (keycode == keyevent.vk_space) {generatenew () keyevent.vk_a) {for (int i = 0 ؛ i <100 ؛ i ++) {generateNew () ؛}} آخر إذا (keycode == keyevent.vk_b) {for (int i = 0 ؛ i <100 ؛ i ++) {generatenew () ؛ 1000 ؛ i ++) {generatenew () ؛}}}} public void generatenew () {float nx ، ny ؛ float ox = crtpoint.getCentralx ()/150f ، oy = (600 - crtpoint.getCenterraly ())/60f ؛ رمز مزدوج = 100.0 * randometset.getrandomfloatin_1 () + 0.85f*oy + 1.6f ؛} آخر إذا (الكود> 86 && الكود <= 93) {nx = 0.2f*ox - 0.26f*oy ؛ ny = 0.23f*ox + 0.22f*oy + 1.6f ؛ 0.44f ؛} obj newPoint = ues.creatobj (uesi.bgindex) ؛ newPoint.addgloint ("70DBDB" ، 0،0) ؛ newPoint.setColor (color.green) ؛ newPoint.setCentralx (nx*150f) ؛ // إلغاء تحويل التنسيق السابق NY*60F) ؛ newPoint.show () ؛ crtpoint = newPoint ؛ // اضبط النقطة الجديدة على النقطة الحالية. } الفراغ الثابت العام (سلسلة [] args) {uesi ues = new r () ؛ new Barnsleyfern (ues ، 0) ؛}}[نتائج المحاكاة]
لخص
ما سبق هو كل محتوى هذه المقالة حول رمز مثال لعبة Game Game Game Java Chaos ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!