DIR : /home/kozerus/public_html/jkwii/js/jsdoit/kilidoscope/index.js

/home/kozerus/public_html/jkwii/js/jsdoit/kilidoscope

var canvas,ctx,gtype,gmin,gmax,gcp,gpr,mtime,costank,timeseed,map,gime2,gime1;

window.onload=function(){
var a,b;
    canvas=document.getElementById("maincan");
    ctx=canvas.getContext("2d");
    ctx.fillStyle="rgb(0,0,0)";
    canvas.width=800;
    canvas.height=800;
    ctx.fillRect(0,0,canvas.width,canvas.height);
    gime2=ctx.getImageData(0,0,800,800);
    canvas.width=400;
    canvas.height=400;    
    ctx.fillRect(0,0,canvas.width,canvas.height);
    gime1=ctx.getImageData(0,0,400,400);
    
    costank=new Float32Array(10000);
    for(a=0;a<10000;a++){
        b=a/1000000;
        b=1-b*50;
        b=0.5-Math.cos(b*Math.PI)/2;
        costank[a]=b;
    }
    
    kaisi(1);
};

//縮小
function syuku(ime1,ime2,bai){
    var a,b,c,d,e;
    var iti,miti,yoko,tate,ritu,mf,col1,col2,col3,imd1,imd2;
    
    mf=Math.floor;
    yoko=ime1.width;
    tate=ime1.height;
    ritu=bai*bai;
    imd1=ime1.data;imd2=ime2.data;
    
    iti=0;
    for(a=0;a<tate;a++){
        for(b=0;b<yoko;b++){
            col1=col2=col3=0;
            for(c=0;c<bai;c++){
                for(d=0;d<bai;d++){
                    miti=((a*bai+c)*yoko*bai+b*bai+d)*4;
                    col1+=imd2[miti++];
                    col2+=imd2[miti++];
                    col3+=imd2[miti];
                } 
            }
            imd1[iti++]=mf(col1/ritu);
            imd1[iti++]=mf(col2/ritu);
            imd1[iti]=mf(col3/ritu);
            iti+=2;
        }
    }
}

//Math.randomはなんか同じパターンが出やすいので時間を使って無駄に回す
function rando(){
    var a,b,c;
    timeseed=(641*timeseed+3313)%100000;
    c=Math.random();
    b=Math.floor(timeseed/20000);
    for(a=0;a<b;a++){
        c+=Math.random();
    }
    return c%1;
}

//ボタンクリック
function kaisi(b){
    var a;
    a=document.location+"";
    a=a.split("/")[3];
    if(b!=1 && a!="jagarikin"){
        window.open("http://jsdo.it/jagarikin/rEHm");
        return;
    }
    if(b==1){
        a=[-1.211684203427285,-0.5531065377872437];
        gmin=14;
        gtype=1;
        gmax=32;
        gpr=0.05;
        gcp=0;
    }else{
        timeseed=new Date().getTime()%100000;
        gcp=Math.floor(rando()*8);
        gmin=1+Math.floor(rando()*7);
        for(a=0;a<3;a++)if(rando()<0.2)gmin+=5;
        if(rando()<0.05)gmin=0;
        gtype=Math.floor(rando()*2);
        gmax=gmin+8+Math.floor(rando()*15);
        gpr=0.02+rando()/15;
        a=sjuri();
    }
    setman(gime2,800,800,a[0],a[1]); 
    syuku(gime1,gime2,2);
    ctx.putImageData(gime1,0,0);
}

//座標をランダムに決めて模様になってるか判定
function sjuri(){
    var a,b,c,d,e,f,g,h,x,y,x1,y1,z,x2,y2;
    var tx,ty,step2,kai,max,ht;
    var irotank,irokazu,iromax,maxkazu,mae,zatu,chsize,chbai;
    
    chsize=200;
    chbai=1;
    step2=1/50;
    max=gmax;
    
    for(ht=0;;ht++){
        if(ht==1){
            chsize=100;
            step2=1/25;
            chbai=1/4;
        }else if(ht==2){
            chsize=50;
            step2=1/12.5;
            chbai=1/16;
        }
        
        tx=(rando()-0.5)*3.2-0.28;
        ty=(rando()-0.5)*3.4;
        maxkazu=irokazu=iromax=mae=zatu=0;
        irotank=new Int32Array(40+gmin);
        
        ry=-step2*chsize/2;
        for(a=0;a<chsize;a++){
            rx=-step2*chsize/2;
            for(b=0;b<chsize;b++){
                x=rx;y=ry;x2=x*x;y2=y*y;
                for(kai=0;kai<max;kai++){
                    x1=x2-y2+tx;
                    y1=2*x*y+ty; 
                    if(gtype==1){x1=Math.abs(x1);y1=Math.abs(y1);}
                    z=1/(x1*x1+y1*y1+gpr);
                    x1*=z;y1*=z;x2=x1*x1;y2=y1*y1;
                    if(kai>=gmin)if(Math.abs(x2-y2)<0.01)break;
                    x=x1;
                    y=y1;
                }
                
                if(kai==max){
                    maxkazu++;
                }else{
                    if(irotank[kai]===0)irokazu++;
                    irotank[kai]++;
                    if(irotank[kai]>iromax)iromax=irotank[kai];
                }
                
                if(mae!=kai)zatu++;
                mae=kai;
                rx+=step2; 
            }
            ry+=step2;
        }
        if(iromax>10000*chbai || maxkazu<200*chbai || maxkazu>39000*chbai || irokazu<6 || zatu/iromax>5)continue;
        break;
    }
    return [tx,ty];
}

//描画
function setman(ime,yoko,tate,tx,ty){
    var a,b,c,x,y,xx,yy,x2,y2,xy2,z,zoom,max;
    var step,rx,ry,mf,iti,kai,hige,gcol,irotank,irokazu,maxkazu,imd;
    mf=Math.floor;
    
    gcol=[
    [155,255,255], [255,211,55], [155,255,155], [195,55,255],
    [150,150,255], [255,115,52], [255,255,0], [255,255,255]
    ];
    zoom=200;
    max=gmax;
    rx=tx;ry=ty;
    imd=ime.data;
    step=1/zoom;
    tx=-step*(yoko/2);
    ty=-step*(tate/2);
    iti=0;
    xx=tx;
    
    for(a=0;a<tate;a++){
    tx=xx;
        for(b=0;b<yoko;b++){
            x=tx;y=ty;x2=x*x;y2=y*y;xy2=x*y*2;
            hige=1;
            for(kai=0;kai<max;kai++){
                x=x2-y2+rx;   
                y=xy2+ry; 
                if(gtype==1){x=Math.abs(x);y=Math.abs(y);}
                    z=1/(x*x+y*y+gpr);
                    x*=z;y*=z;
                    x2=x*x;y2=y*y;xy2=x*y*2;
                    if(kai>=gmin){
                        hige=Math.abs(x2-y2);
                        if(hige<0.01)break;
                    }
                }
            
                if(kai!=max){
                    c=(kai*13+gcp)%8;
                    hige=costank[mf(hige*1000000)];
                    col1=mf(gcol[c][0]*hige);col2=mf(gcol[c][1]*hige);col3=mf(gcol[c][2]*hige);
                }else{
                    col1=0;col2=0;col3=0;
                }
                imd[iti++]=col1;
                imd[iti++]=col2;
                imd[iti]=col3;
                iti+=2;
                tx+=step;   
           }  
           ty+=step;
    }
    
}
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer