[導入]
私は「The Secret Scise」を読んでいます。その中には、ノイズを使用してフラクタルチャートを生成するいくつかの方法を導入する章があります。非常に興味深いと感じたので、コンピューターを使用してシミュレーションしようとしましたが、効果は悪くありません(ノイズ方法は、従来の反復方法よりもプログラミングで実装しやすいです。後で、そのようなアルゴリズムがまだたくさんあることがわかりました。
[sierpinski三角形ノイズ生成方法]
これらのノイズゲームでは、Sierpinskiの三角形を生成するためのルールが最も簡単です。
1.大きな三角形の頂点として、1、2、および3とマークされた平面上の3つのポイントを選択します。
2。そのいずれかを「現在のポイント」(1番の選択など)として選択します。
3.乱数1〜3を生成し、頂点の中間点と数字で表される「現在のポイント」に新しいポイントを描き、新しいポイントを「現在のポイント」として使用します。
4.ステップ3を繰り返して、パターンに近づきます。
*。乱数に注意してください。時間をシード生成の方法として使用しないことが最善です。
[シミュレーションプログラム]
パッケージcom.geiv.chaos; import java.awt.event.keyevent; import com.thrblock.util.randomset; import geivcore.defaultfactor; Import geivcore.keyfactor; import geivcore.keivcore.r; import geivcore.r; Import geivcore.usi; defaultFactor Implention keylistener {uesi ues; obj [] basepoint; obj crtpoint; public sierpinski(uesi ues、int times){this.ues = ues; basepoint; new obj [3]; //(int i = 0; i++){basepoint [i] ues.creatobj(uesi.bgindex); basepoint [i] .addglpoint( "70dbdb"、0,0); basepoint [i] .show();} basepoint [0] .setcentralx(400); // 3点位置を設定しますbasepoint [0] .setcentraly(60); basepoint [1] .setcentralx(60); basepoint [1] .setcentraly(550); basepoint [2] .setcentralx(740); setcentraly(550); crtpoint = basepoint [0]; this.setKeyListener(this); ues.pushkeyboardio(this); for(int i = 0; i <times; i ++){generateNew();}}@override public void dokeybord(keyactor who、int keycode、boolean ispressed){// callback.if(is predided.vk_ kievent.vk_ keyebent. GenerateNew();} else if(keycode == keyevent.vk_a){// aは(int i = 0; i <100; i ++){generateNew();}} else(keycode == keyevent.vk_b)の100の新しいポイントに対応します。 1000; i ++){generateNew();}}}}} public void generateNew(){obj flagpoint = basepoint [randomset.getRandomNum(0、2)]; (flagpoint.getcentraly() + crtpoint.getcentraly())/2f; obj newpoint = ues.creatobj(uesi.bgindex); // new point newpoint.addglpoint( "70dbdb"、0,0); newpoint.setcolor(nx); newpoint.setcolor(nx); newpoint.setcolor(nx); newpoint.setcolor(nx); newpoint.setcentraly(ny); newpoint.show(); crtpoint = newpoint; //現在のポイントとして設定} public static void main(string [] args){uesi ues = new r(); new Sierpinski(ues、0); }}[シミュレーション結果]
Bキーが押されたとき
[Barnsleyfernのノイズ生成方法]
Sierpinskiの三角形の単純な規則性と比較して、Barnsleyfern(Fractal Tooth Grass)は人々により複雑な印象を与えます。その複雑さのために、カオスの規律は、「単純なルールも複雑なオブジェクトを生成できる」という結論を証明するためにしばしば現れます。
その生成ルールも複雑ではありません。
1。最初に、「電流点」(0,0)を考えると、牛とOYを使用して水平および垂直座標を表します。
2。次のポイント(NX、NY)を計算するには、特定のランダムルールを使用して、次の4つの反復式のいずれかを選択する必要があります。
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。これはC ++のOpenGLプログラムであり、Wikiと同じ式が使用されます。つまり、この式のセットは、OpenGLの座標系に基づいています。対応する変換を行った後、最終的に正常に描画されました。
[シミュレーションプログラム]
パッケージcom.geiv.chaos; import geivcore.defaultfactor; import geivcore.keyfactor; import geivcore.keylistener; import geivcore.uesi; import geivcore.uesi; intemint geivcore.enginedata.obj.obj; import java.awt.color; com.thrblock.util.randomset; public class barnsleyfern extends defaultfactor emplments keylistener {uesi ues; obj crtpoint; public barnsleyfern(uesi ues、int times){this = ues; crtpoint = ues; crtpoint = ues.creatobj(uesi.bgindex); crtpoint.addglpoint( "70dbdb"、0,0); crtpoint.show(); crtpoint.setcentralx(0); crtpoint.setcentraly(0); ues.setViewOffsetx(90); 0; i <times; i ++){generateNew();}}@Override 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();}} else if(keycode == keyevent.vk_b){for(int i = 0; i <100; i ++){generateNew();}} if(keyCode == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 00; 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;} 0.85f*oy + 1.6f;} else if(code> 86 && code <= 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.addglpoint( "70dbdb"、0,0); newpoint.setcolor(color.green); newpoint.setcentralx(nx*150f); ny*60f); newpoint.show(); crtpoint = newpoint; //新しいポイントを現在のポイントに設定します。 } public static void main(string [] args){uesi ues = new r(); new Barnsleyfern(ues、0);}}}[シミュレーション結果]
要約します
上記は、Java Chaosゲームノイズゲームの例コードに関するこの記事のすべての内容です。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!