English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مثال على لعبة Chaos Game الصوتية باستخدام Java

[مقدمة]

في الآونة الأخيرة، كنت أقرأ كتاب "السimplicity profound"، حيث تم تقديم بعض الطرق لإنشاء صورة متفرعة باستخدام ضوضاء، وكان لدي شعور رائع، لذا حاولت استخدام الكمبيوتر لتقديم نموذج، وكانت النتائج جيدة (يمكن تنفيذ هذه الطريقة التقليدية بشكل أفضل في البرمجة، واكتشفت أن هناك العديد من هذه الألغام، يمكنك العثور على المزيد من خلال البحث عن "chaosgame").

[طريقة إنشاء ضوضاء مثلث سيربينيسكي]

في هذه الألعاب الضوضائية، يمكن القول أن قواعد إنشاء مثلث سيربينيسكي (Sierpinski) بسيطة جدًا:

1.اختر ثلاث نقاط على المستوى، و علامتها 1،2،3 كـ أركان مثلث كبير.

2.اختر نقطة واحدة منها كـ "النقطة الحالية" (مثل اختيار الرقم 1).

3.توليد عدد عشوائي بين 1 و3، في نقطة الركن المعبّر عنها في منتصف نقطة "النقطة الحالية"، و رسم نقطة جديدة، و تسمية النقطة الجديدة كـ "النقطة الحالية".

4.تكرار الخطوة 3، للحصول على الشكل.

*.لا تستخدم أفضل الكواشف العشوائية التي تستخدم الوقت كنوعية البذور.

[برنامج محاكاة]

package com.geiv.chaos;
import java.awt.event.KeyEvent;
import com.thrblock.util.RandomSet;
import geivcore.DefaultFactor;
import geivcore.KeyFactor;
import geivcore.KeyListener;
import geivcore.R;
import geivcore.UESI;
import geivcore.enginedata.obj.Obj;
public class Sierpinski extends DefaultFactor implements KeyListener{
	UESI UES;
	Obj[] basePoint;
	Obj crtPoint;
	public Sierpinski(UESI UES,int times){
		this.UES = UES;
		basePoint = new Obj[3];
		//创建三个基准点 
		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);
		// يتم تعيين مواقع النقاط الثلاث 
		basePoint[0].setCentralY(60);
		basePoint[1].setCentralX(60);
		basePoint[1].setCentralY(550);
		basePoint[2].setCentralX(740);
		basePoint[2].setCentralY(550);
		crtPoint = basePoint[0];
		// يتم تعيين النقطة رقم 0 كنقطة الحالية 
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0; i < times; i++) {
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		// يتم تعيين الإرتباط 
		if(ispressed) {
			if(keyCode == KeyEvent.VK_SPACE) {
				// يتم إنشاء نقطة واحدة جديدة عند ضغط مسافة 
				generateNew();
			} آخر إذا كان keyCode == KeyEvent.VK_A {
				// يتم إنشاء 100 نقطة جديدة عند ضغط A 
				for (int i = 0; i < 100; i++) {
					generateNew();
				}
			} آخر إذا كان keyCode == KeyEvent.VK_B {
				// يتم إنشاء 1000 نقطة جديدة عند ضغط B 
				for (int i = 0; i < 1000; i++) {
					generateNew();
				}
			}
		}
	}
	public void generateNew() {
		Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2)];
		// يتم اختيار نقطة مرجع عشوائية 
		float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f;
		// يتم حساب النقطة الوسطى 
		float ny = (flagPoint.getCentralY() + crtPoint.getCentralY())/2f;
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		// يتم إنشاء نقطة جديدة 
		newPoint.addGLPoint("70DBDB",0,0);
		newPoint.setColor(RandomSet.getRandomColdColor());
		newPoint.setCentralX(nx);
		// يتم تعيين الأشعة العرضية والمسافة العمودية 
		newPoint.setCentralY(ny);
		newPoint.show();
		crtPoint = newPoint;
		// يتم تعيين النقطة الحالية
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Sierpinski(ues,0);
		// يمكن تعيين عدد النقاط البداية من خلال المعلمات التركيبية.
	}
}

[نتائج الإيماءات]

عند ضغط زر B

[طريقة إنتاج الضوضاء لبarnsley fern]

على عكس القواعد البسيطة لثلاثية سيربينيسكي، يترك Barnsley fern (النبات المفرد) انطباعًا أكثر تعقيدًا، ومن خلال تعقيده، يُستخدم دائمًا في مجال الفوضى لاثبات نتيجة "القواعد البسيطة يمكن أن تنتج كائنات معقدة".

قواعد إنتاجه ليست معقدة جدًا:

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في عملية البرمجة، لاحظت مشكلة، لم يوضح Wiki قيمة النسبية لهذه الإحداثيات مع حجم الشاشة، ولم يوضح أيضًا اتجاه المحاور 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.R;
import geivcore.UESI;
import geivcore.enginedata.obj.Obj;
import java.awt.Color;
import java.awt.event.KeyEvent;
import com.thrblock.util.RandomSet;
public class Barnsleyfern extends DefaultFactor implements 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.setViewOffsetX(90);
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0; i < times; i++) {
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		// طريقة الدخول إلى لوحة المفاتيح مشابهة للنموذج السابق 
		if(ispressed) {
			if(keyCode == KeyEvent.VK_SPACE) {
				generateNew();
			} آخر إذا كان keyCode == KeyEvent.VK_A {
				for (int i = 0; i < 100; i++) {
					generateNew();
				}
			} آخر إذا كان keyCode == KeyEvent.VK_B {
				for (int i = 0; i < 1000; i++) {
					generateNew();
				}
			}
		}
	}
	public void generateNew() {
		float nx, ny;
		float ox = crtPoint.getCentralX() / 150f, oy = (600 - crtPoint.getCentralY()) / 60f;
		// هنا تم تحويل الأحداث الأوبريغ، عند تعيين موقع النقطة الجديدة يتم التدوير العكسي. 
		double code = 100.0 * RandomSet.getRandomFloatIn_1();
		// عدد عشوائي عديم الزائدة بين 0 و100 
		if(code >= 0 && code <= 1) {
			nx = 0;
			ny = 0.00f * ox + 0.16f * oy;
		} آخر إذا كان code > 1 && code <= 86 {
			nx = 0.85f * ox + 0.04f * oy;
			ny = -0.04f * ox + 0.85f * oy + 1.6f;
		} آخر إذا كان code > 86 && code <= 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;
			ny = 0.26f*ox + 0.24f*oy + 0.44f;
		}
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		newPoint.addGLPoint("70DBDB",0,0);
		newPoint.setColor(Color.GREEN);
		newPoint.setCentralX(nx*150f);
		//إلغاء تحويل الأحداثيات السابقة 
		newPoint.setCentralY(600 - ny*60f);
		newPoint.show();
		crtPoint = newPoint;
		//إعداد النقطة الجديدة كنقطة الحالية.
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Barnsleyfern(ues,0);
	}
}

[نتائج الإيماءات]

النهاية

هذا هو محتوى الكود المثالي للعبة الصوت المزعج Java Chaos Game كاملًا، نأمل أن يكون قد ساعدكم. يمكن للمشتركين المتمرسين الاستمرار في مراجعة المواضيع ذات الصلة في هذا الموقع، ونرحب بتعليقاتكم إذا كانت هناك نقاط ضعف، شكرًا للدعم الذي يقدمونه للمنتدى!

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية حقوق النسخ لصاحبها، تم جمع المحتويات من قبل المستخدمين عبر الإنترنت بشكل متعاوني وتم تحميلها بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل أي مسؤولية قانونية مرتبطة بذلك. إذا اكتشفتم محتوى مخالف لحقوق النسخ، يرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (أثناء إرسال البريد الإلكتروني، يرجى استبدال #بـ @) لإبلاغنا، وقدموا الأدلة ذات الصلة، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم فورًا.

أنت قد تحب