一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java Chaos Game噪聲游戲實例代碼

Java Chaos Game噪聲游戲實例代碼

2021-03-09 13:23三向板磚 Java教程

這篇文章主要介紹了Java Chaos Game噪聲游戲實例代碼,具有一定借鑒價值,需要的朋友可以參考下。

[簡介]

最近一直在讀《深奧的簡潔》,里面有一章介紹了幾種使用噪聲產生分形圖的方法,感覺很有意思,于是嘗試使用計算機模擬了一下,效果還不錯(噪聲法比傳統迭代法在編程上好實現一些,后來發現這類算法還不少,搜索chaosgame可以找到更多)。

[sierpinski三角形的噪聲產生法]

Java Chaos Game噪聲游戲實例代碼

在這些噪聲游戲中,sierpinski(謝爾賓斯基)三角形的生成規則可謂是最簡單的:

1.在平面上選取三個點,標記為1、2、3,作為大三角形的頂點。

2.選擇其中一點,作為“當前點”(比如選擇1號)。

3.產生1~3的隨機數,在該數表達的頂點與“當前點”的中點繪制一個新點,并將新點作為“當前點”。

4.重復步驟3,即可逼近圖案。

*.注意隨機數最好不要使用以時間作為種子的產生方式。

[模擬程序]

java" id="highlighter_271338">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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();
            } else if(keycode == keyevent.vk_a){
                //a對應創建100個新點
                for (int i = 0;i < 100;i++){
                    generatenew();
                }
            } else if(keycode == keyevent.vk_b){
                //b對應創建1000個新點
                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鍵按下時

Java Chaos Game噪聲游戲實例代碼

Java Chaos Game噪聲游戲實例代碼

Java Chaos Game噪聲游戲實例代碼

[barnsleyfern的噪聲產生法]

Java Chaos Game噪聲游戲實例代碼

相比于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。在編程時,我發現一個問題,wiki并未指明這個坐標的決對值與屏幕大小的關系,也并未說明x、y軸的方向,在我自己定義的坐標系下繪制總是不成功,后來我按照公式搜索,找到了這個面:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp。這是一個c++下的opengl程序,而里面用了與wiki相同的公式,也就是說,這組公式是以opengl的坐標系為基準的,在做了對應變換后終于成功繪制。

[模擬程序]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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) {
        //鍵盤io的方式同上例
        if(ispressed){
            if(keycode == keyevent.vk_space){
                generatenew();
            } else if(keycode == keyevent.vk_a){
                for (int i = 0;i < 100;i++){
                    generatenew();
                }
            } else if(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;
        //這里做了opengl坐標轉換,在設置新點位置時對應反轉。
        double code = 100.0 * randomset.getrandomfloatin_1();
        //隨機浮點數數0~100
        if(code >= 0&&code <= 1){
            nx = 0;
            ny = 0.00f * ox + 0.16f * oy;
        } else if(code > 1&& code <= 86){
            nx = 0.85f*ox + 0.04f*oy;
            ny = -0.04f*ox + 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;
        } 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噪聲游戲實例代碼

Java Chaos Game噪聲游戲實例代碼

Java Chaos Game噪聲游戲實例代碼

總結

以上就是本文關于java chaos game噪聲游戲實例代碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/shuzhe66/article/details/40113149

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人在线影院 | 无毒成人社区 | 51精品 | 小sao货ji巴cao死你视频 | 毛片网站大全 | 天堂一区二区在线观看 | 538亚洲欧美国产日韩在线精品 | 国色天香社区在线视频播放 | 国产99re在线观看69热 | 亚洲成在人线视频 | 校园春色偷拍自拍 | 欧美日韩国产另类一区二区三区 | 久久青青草视频在线观 | 无码乱人伦一区二区亚洲 | 99久久精品免费看国产一区二区 | 国产婷婷综合丁香亚洲欧洲 | 日韩制服丝袜在线观看 | 久草在线精彩免费视频 | 好大夫在线个人空间 | 爆操俄罗斯美女 | 亚洲欧美7777 | 男女性刺激爽爽免费视频 | h片免费网站| 日本无吗免费一二区 | 91yellow吧字幕网zmff7 | 日本在线观看免费观看完整版 | 猛h辣h高h文湿重口 门房秦大爷在线阅读 | 亚洲国产欧美在线人成aaa | 久久大胆视频 | 国产精品资源在线观看 | 草草视频在线观看最新 | 欧美1 | 精品国产在天天线在线麻豆 | 成人福利网站 | 91精品国产一区 | 任你操视频在线观看 | 成人小视频在线观看 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 欧美有码 | 色天天色综合 | 精品视频免费在线观看 |