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
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer