返回列表 回复 发帖
class IFsystem{
    constructor(canvas,funs,num,scale,color,seed,x,y,z){
        this.canvas=canvas;
        this.scale=scale;
        this.funs=funs;
        this.getseed=seed;
        this.getcolor=color;
        this.ox=x;
        this.oy=y;
        this.num=num;
        this.point={x:0,y:0,z:z};
        this.tp=0;
        this.density=[];
        this.init();
    }
    init(){
        if(this.funs[0].length<7)
            for(let i=0;i<this.funs.length;i++)this.funs[6]=1;
        for(let i=0;i<this.funs.length;i++)this.tp+=this.funs[6];
        this.density=[];
        for(let x=0;x<this.canvas.width;x++){
            this.density[x]=[];
            for(let y=0;y<this.canvas.height;y++){
                this.density[x][y]=[];
                for(let i=0;i<4;i++)this.density[x][y]=0;
            }
        }
    }
    iterate(d){
        let k=-1,p=random()*this.tp,funs=this.funs;
        while(p>0)p-=funs[++k][6];
        let x=funs[k][0]*d.x+funs[k][1]*d.y+funs[k][4],
            y=funs[k][2]*d.x+funs[k][3]*d.y+funs[k][5],
            z=this.getseed({x:x,y:y,z:d.z});
        return{x,y,z}
    }
    getDensity(){
        let w=this.canvas.width,h=this.canvas.height,dens=0;
        for(let i=0;i<this.num;i++){
            this.point=this.iterate(this.point);
            let x=floor(this.ox+this.point.x*this.scale),
                y=floor(h-this.oy-this.point.y*this.scale);
            if(x>=0&&x<w&&y>=0&&y<h){
                let col=this.getcolor(this.point.z);
                for(let i=0;i<4;i++)this.density[x][y]+=col;
            }
        }
        for(let x=0;x<w;x++)for(let y=0;y<h;y++)
            dens=max(this.density[x][y][3],dens);
        return log(dens)*log(dens);
    }
    drawIfs(){
        let w=this.canvas.width,h=this.canvas.height,
            ctx=this.canvas.getContext('2d'),
            image=ctx.createImageData(w,h),
            data=image.data,
            maxDensity=this.getDensity();
        for(let x=0;x<w;x++)for(let y=0;y<h;y++)
            if(this.density[x][y][3]>0){
                let idx=(x+y*w)*4;
                for(let k=0;k<4;k++){
                    let light=log(this.density[x][y][k]);
                    light=(light*light)/maxDensity;
                    data[idx+k]=floor(255*light);
                }
            }
        ctx.putImageData(image,0,0);
    }
}
其中的 getSeed,getColor在窗体中实时编辑和运行。
这是除窗体外的所有代码
000.jpg
2020-9-17 19:51

001.jpg
2020-9-17 19:51

002.jpg
2020-9-17 19:51

003.jpg
2020-9-17 19:51

004.jpg
2020-9-17 19:51

005.jpg
2020-9-17 19:51

006.jpg
2020-9-17 19:51

007.jpg
2020-9-17 19:51

008.jpg
2020-9-17 19:51

009.jpg
2020-9-17 19:51

010.jpg
2020-9-17 19:51
001.jpg
2020-9-18 20:17

002.jpg
2020-9-18 20:17

003.jpg
2020-9-18 20:17

004.jpg
2020-9-18 20:17

005.jpg
2020-9-18 20:17

006.jpg
2020-9-18 20:17

007.jpg
2020-9-18 20:17

008.jpg
2020-9-18 20:17

009.jpg
2020-9-18 20:17

010.jpg
2020-9-18 20:17
001.jpg
2020-9-19 20:20

002.jpg
2020-9-19 20:20

003.jpg
2020-9-19 20:20

004.jpg
2020-9-19 20:20

005.jpg
2020-9-19 20:20

006.jpg
2020-9-19 20:20

007.jpg
2020-9-19 20:20

008.jpg
2020-9-19 20:20

009.jpg
2020-9-19 20:20

010.jpg
2020-9-19 20:23
001.jpg
2020-9-20 23:07

002.jpg
2020-9-20 23:07

003.jpg
2020-9-20 23:07

004.jpg
2020-9-20 23:07

005.jpg
2020-9-20 23:07

006.jpg
2020-9-20 23:07

007.jpg
2020-9-20 23:07

008.jpg
2020-9-20 23:07

009.jpg
2020-9-20 23:07

010.jpg
2020-9-20 23:07
001.jpg
2020-9-21 20:13

002.jpg
2020-9-21 20:13

003.jpg
2020-9-21 20:13

004.jpg
2020-9-21 20:13

005.jpg
2020-9-21 20:13

006.jpg
2020-9-21 20:13

007.jpg
2020-9-21 20:13

008.jpg
2020-9-21 20:13

009.jpg
2020-9-21 20:13

010.jpg
2020-9-21 20:13
001.jpg
2020-9-22 21:35

002.jpg
2020-9-22 21:35

003.jpg
2020-9-22 21:35

004.jpg
2020-9-22 21:35

005.jpg
2020-9-22 21:35

006.jpg
2020-9-22 21:35

007.jpg
2020-9-22 21:35

008.jpg
2020-9-22 21:35
001.jpg
3 天前 22:52

002.jpg
3 天前 22:52

003.jpg
3 天前 22:52

004.jpg
3 天前 22:52

005.jpg
3 天前 22:52

006.jpg
3 天前 22:52

007.jpg
3 天前 22:52

008.jpg
3 天前 22:52

009.jpg
3 天前 22:52

010.jpg
3 天前 22:52
你玩过Apo这款软件没?你实现了这款软件的部分功能,但函数太少,没组合。如果能补充上这些,就完美了。
001.png
前天 23:28
28# xuefeiyang
xuefeiyang老师好,我没玩过Apo这款软件,关于IFS建模,我其实完全不得要领,这里后面贴出的并非主观设计而是纯随机生成的模型,除了简单的着色外,没有任何额外的渲染,我这个充其量就是个小程序而已,谢谢关注,谢谢!!!
返回列表