激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - Java Chaos Game噪聲游戲?qū)嵗a

Java Chaos Game噪聲游戲?qū)嵗a

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

這篇文章主要介紹了Java Chaos Game噪聲游戲?qū)嵗a,具有一定借鑒價值,需要的朋友可以參考下。

[簡介]

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

[sierpinski三角形的噪聲產(chǎn)生法]

Java Chaos Game噪聲游戲?qū)嵗a

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

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

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

3.產(chǎn)生1~3的隨機數(shù),在該數(shù)表達(dá)的頂點與“當(dāng)前點”的中點繪制一個新點,并將新點作為“當(dāng)前點”。

4.重復(fù)步驟3,即可逼近圖案。

*.注意隨機數(shù)最好不要使用以時間作為種子的產(chǎn)生方式。

[模擬程序]

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];
        //創(chuàng)建三個基準(zhǔn)點
        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);
        //設(shè)置三點位置
        basepoint[0].setcentraly(60);
        basepoint[1].setcentralx(60);
        basepoint[1].setcentraly(550);
        basepoint[2].setcentralx(740);
        basepoint[2].setcentraly(550);
        crtpoint = basepoint[0];
        //將0號點作為當(dāng)前點
        this.setkeylistener(this);
        ues.pushkeyboardio(this);
        for (int i = 0;i < times;i++){
            generatenew();
        }
    }
    @override
      public void dokeybord(keyfactor whom, int keycode, boolean ispressed) {
        //掛載回調(diào)
        if(ispressed){
            if(keycode == keyevent.vk_space){
                //空格對應(yīng)創(chuàng)建一個新點
                generatenew();
            } else if(keycode == keyevent.vk_a){
                //a對應(yīng)創(chuàng)建100個新點
                for (int i = 0;i < 100;i++){
                    generatenew();
                }
            } else if(keycode == keyevent.vk_b){
                //b對應(yīng)創(chuàng)建1000個新點
                for (int i = 0;i < 1000;i++){
                    generatenew();
                }
            }
        }
    }
    public void generatenew(){
        obj flagpoint = basepoint[randomset.getrandomnum(0, 2)];
        //隨機選擇基準(zhǔn)點之一
        float nx = (flagpoint.getcentralx() + crtpoint.getcentralx())/2f;
        //計算中點
        float ny = (flagpoint.getcentraly() + crtpoint.getcentraly())/2f;
        obj newpoint = ues.creatobj(uesi.bgindex);
        //創(chuàng)建新點
        newpoint.addglpoint("70dbdb",0,0);
        newpoint.setcolor(randomset.getrandomcoldcolor());
        newpoint.setcentralx(nx);
        //設(shè)置坐標(biāo)
        newpoint.setcentraly(ny);
        newpoint.show();
        crtpoint = newpoint;
        //置為當(dāng)前點
    }
    public static void main(string[] args) {
        uesi ues = new r();
        new sierpinski(ues,0);
        //后面的構(gòu)造參數(shù)可以設(shè)置初始點數(shù)。
    }
}

[模擬結(jié)果]

在b鍵按下時

Java Chaos Game噪聲游戲?qū)嵗a

Java Chaos Game噪聲游戲?qū)嵗a

Java Chaos Game噪聲游戲?qū)嵗a

[barnsleyfern的噪聲產(chǎn)生法]

Java Chaos Game噪聲游戲?qū)嵗a

相比于sierpinski三角的簡單規(guī)則性,barnsleyfern(分形羊齒草)給人以更加復(fù)雜的印象,出于它的復(fù)雜性,混沌學(xué)科經(jīng)常拿出它來證明“簡單規(guī)則也可產(chǎn)生復(fù)雜對象”的結(jié)論。

它的產(chǎn)生規(guī)則也不是很復(fù)雜:

1.首先給定”當(dāng)前點”(0,0),我們用ox,oy表示橫縱坐標(biāo)。

2.計算下一點(nx,ny)需要以一定隨機規(guī)則選擇下列四種迭代公式之一:

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),并將其設(shè)為當(dāng)前點,重復(fù)2,即可無限逼近結(jié)果。

↑以上公式摘自wiki:http://en.wikipedia.org/wiki/barnsley_fern。在編程時,我發(fā)現(xiàn)一個問題,wiki并未指明這個坐標(biāo)的決對值與屏幕大小的關(guān)系,也并未說明x、y軸的方向,在我自己定義的坐標(biāo)系下繪制總是不成功,后來我按照公式搜索,找到了這個面:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp。這是一個c++下的opengl程序,而里面用了與wiki相同的公式,也就是說,這組公式是以opengl的坐標(biāo)系為基準(zhǔn)的,在做了對應(yīng)變換后終于成功繪制。

[模擬程序]

?
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坐標(biāo)轉(zhuǎn)換,在設(shè)置新點位置時對應(yīng)反轉(zhuǎn)。
        double code = 100.0 * randomset.getrandomfloatin_1();
        //隨機浮點數(shù)數(shù)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);
        //將之前的坐標(biāo)變換抵消
        newpoint.setcentraly(600 - ny*60f);
        newpoint.show();
        crtpoint = newpoint;
        //設(shè)置新點為當(dāng)前點。
    }
    public static void main(string[] args) {
        uesi ues = new r();
        new barnsleyfern(ues,0);
    }
}

[模擬結(jié)果]

Java Chaos Game噪聲游戲?qū)嵗a

Java Chaos Game噪聲游戲?qū)嵗a

Java Chaos Game噪聲游戲?qū)嵗a

總結(jié)

以上就是本文關(guān)于java chaos game噪聲游戲?qū)嵗a的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www久久久久久 | 欧美雌雄另类xxxxx | 国产精品久久久久久久hd | 一级毛片在线观看视频 | 国产成人精品免高潮在线观看 | 天堂亚洲一区 | 国产精品一区二区三区在线播放 | 91色爱| 亚洲最大中文字幕 | 日韩精品久久久久久 | 玩偶姐姐 在线观看 | 国产免费久久久久 | 欧美18—19sex性护士中国 | 狼人狠狠干 | av91肉丝一区二区电影 | 日韩精品免费看 | 欧美黄色一区 | 一级免费大片 | 俄罗斯论理片 | 99国产精品国产免费观看 | 亚洲成人福利 | 成年人视频免费看 | 国产精品呻吟 | 日朝毛片| 免费观看一级 | 性感美女一级毛片 | 国产亚洲精品视频中文字幕 | 91九色电影| 久久国产精品99久久人人澡 | 免费观看的毛片手机视频 | 久久精品中文字幕一区二区三区 | 国产无遮挡一级毛片 | av电影免费看 | 毛片在线免费播放 | 青青草成人影视 | 韩国一级免费视频 | 精品一区二区久久久久久按摩 | 国产精品美女一区二区 | 亚洲成人欧美在线 | 国产精品高潮视频 | chinesexxx少妇露脸 |