(window.onload = function() {var mouseX,dx;var mouseY,dy;var x=new Array(320,260,200,140, 80,128,176,224,272,320,320,320);var y=new Array(260,260,260,260,260,224,188,152,116, 80,140,200);var a=new Array(12);var b=new Array(12);for (var i=0; i!=12; i++) b[i]=new Array(2,0,0,0,0,0,0,0,0,0,0,0,0);b[0][0]=1;b[4][0]=0; b[4][2]=1;b[9][0]=0; b[9][1]=1;var c=new Array(Math.PI/2.0,Math.acos(3.0/5.0),Math.acos(4.0/5.0),Math.acos(1.0/Math.sqrt(5.0)),Math.acos(2.0/Math.sqrt(5.0)),Math.acos(1.0/Math.sqrt(10.0)),Math.acos(3.0/Math.sqrt(10.0)),Math.acos(2.0/Math.sqrt(13.0)),Math.acos(3.0/Math.sqrt(13.0)),Math.acos(1.0/Math.sqrt(17.0)),Math.acos(4.0/Math.sqrt(17.0)),Math.acos(1.0/Math.sqrt(26.0)),Math.acos(5.0/Math.sqrt(26.0)));var s=new Array(0,-1,-1,-1,-1);var t=-1;var d=-1;var u=-1;var len10;var v=new Array(12);var wx=0,wy=0; function view() { var canvas = document.getElementById('cvs'); if ( ! canvas || ! canvas.getContext ) return false; var ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.clearRect(0,0,400,400); ctx.closePath(); ctx.lineWidth = 3.5; ctx.lineJoin = 'round'; eval('ctx.strokeS'+'tyle=\'rgb(0,0,0)\';'); eval('ctx.fillS'+'tyle=\'rgb(0,0,0)\';'); ctx.beginPath(); ctx.moveTo(x[0]+wx,y[0]+wy); for (var i=1; i!=12; i++) { ctx.lineTo(x[i]+wx,y[i]+wy); } ctx.closePath(); ctx.stroke(); for (var i=0; i!=12; i++) { ctx.beginPath(); ctx.arc(x[i]+wx,y[i]+wy,7,0,2*Math.PI,false); ctx.closePath(); ctx.fill(); } if ( t!=-1 ) { ctx.beginPath(); ctx.arc(x[t]+wx,y[t]+wy,10,0,2*Math.PI,false); ctx.closePath(); ctx.fill(); } for (var i=0; i!=s[0]; i++) { ctx.beginPath(); ctx.arc(x[s[i+1]]+wx,y[s[i+1]]+wy,10,0,2*Math.PI,false); ctx.closePath(); ctx.stroke(); } function aot(aa,bb,cc) { var r1, r2; if ((Math.max(aa,cc,bb)==aa)*(Math.min(aa,cc,bb)==bb)) { r1=aa-cc; r2=cc-bb; } else if ((Math.max(bb,cc,aa)==bb)*(Math.min(bb,cc,aa)==aa)) { r1=cc-aa; r2=bb-cc; } else if ((Math.max(cc,aa,bb)==cc)*(Math.min(cc,aa,bb)==bb)) { r1=cc-aa; r2=12-cc+bb; } else if ((Math.max(cc,bb,aa)==cc)*(Math.min(cc,bb,aa)==aa)) { r1=12-cc+aa; r2=cc-bb; } else if ((Math.max(aa,bb,cc)==aa)*(Math.min(aa,bb,cc)==cc)) { r1=12+cc-aa; r2=bb-cc; } else if ((Math.max(bb,aa,cc)==bb)*(Math.min(bb,aa,cc)==cc)) { r1=aa-cc; r2=12+cc-bb; } eval('ctx.strokeS'+'tyle=\'rgba(0,0,0,0.3)\';'); ctx.beginPath(); ctx.arc(x[aa]+wx,y[aa]+wy,60*r1,0,2*Math.PI,false); ctx.closePath(); ctx.stroke(); ctx.beginPath(); ctx.arc(x[bb]+wx,y[bb]+wy,60*r2,0,2*Math.PI,false); ctx.closePath(); ctx.stroke(); } if ((s[0]==2)*(t!=-1)) { aot(s[1],s[2],t); } function a2xy(p) { var aa=Math.atan2(x[(p+5)%12]-x[(p+6)%12],y[(p+5)%12]-y[(p+6)%12])+Math.PI/2.0; angle(); for (var i=p+6; i!=p+17; i++) { aa-=Math.PI-a[i%12]; x[(i+1)%12]=x[i%12]+60.0*Math.cos(aa); y[(i+1)%12]=y[i%12]-60.0*Math.sin(aa); } } function flat(s,e) { for (var i=s; i!=e+1; i++) { b[i%12][0]=2; for (j=1; j!=13; j++) { b[i%12][j]=0; } } } if (s[0]==3) { aot(s[1],s[2],s[3]); len10=Math.floor(1000000000.0*pythagoras(s[1],s[2])/6.0); switch (len10) { case 42426406871: if (((s[3]+3)%12==s[1])||((s[3]+3)%12==s[2])) { if (v[(s[3]+10)%12]==100) { flat(s[3]+10,s[3]+14); b[s[3]][0]=1; b[(s[3]+3)%12][0]++; b[(s[3]+3)%12][1]--; b[(s[3]+9)%12][0]--; } else if (v[(s[3]+2)%12]==100) { flat(s[3]+10,s[3]+14); b[s[3]][0]=1; b[(s[3]+3)%12][0]--; b[(s[3]+9)%12][0]++; b[(s[3]+9)%12][1]--; } } else if (((s[3]+1)%12==s[1])||((s[3]+1)%12==s[2])) { if (v[(s[3]+8)%12]==100) { flat(s[3]+8,s[3]+12); b[s[3]][0]-=2; b[s[3]][2]=1; b[(s[3]+1)%12][0]+=2; b[(s[3]+1)%12][1]--; b[(s[3]+7)%12][0]-=2; b[(s[3]+7)%12][1]++; } else if (v[(s[3]+10)%12]==1) { flat(s[3]+8,s[3]+12); b[s[3]][0]-=2; b[s[3]][2]=1; b[(s[3]+1)%12][0]++; b[(s[3]+7)%12][0]--; b[(s[3]+7)%12][1]++; } } else if (((s[3]+5)%12==s[1])||((s[3]+5)%12==s[2])) { if (v[(s[3]+4)%12]==100) { flat(s[3]+12,s[3]+16); b[s[3]][0]-=2; b[s[3]][2]=1; b[(s[3]+5)%12][0]-=2; b[(s[3]+5)%12][1]++; b[(s[3]+11)%12][0]+=2; b[(s[3]+11)%12][1]--; } else if (v[(s[3]+2)%12]==1) { flat(s[3]+12,s[3]+16); b[s[3]][0]-=2; b[s[3]][2]=1; b[(s[3]+5)%12][0]--; b[(s[3]+5)%12][1]++; b[(s[3]+11)%12][0]++; } } a2xy(s[3]); s[0]=0; break; case 44721359549: if (((s[3]+4)%12==s[1])||((s[3]+4)%12==s[2])) { if (v[(s[3]+3)%12]==10) { flat(s[3]+11,s[3]+15); b[s[3]][0]--; b[(s[3]+4)%12][0]--; b[(s[3]+10)%12][0]++; b[(s[3]+10)%12][2]--; } else if (v[(s[3]+11)%12]==10) { flat(s[3]+11,s[3]+15); b[s[3]][0]--; b[(s[3]+4)%12][0]++; b[(s[3]+4)%12][2]--; b[(s[3]+4)%12][3]--; b[(s[3]+4)%12][4]++; b[(s[3]+10)%12][0]--; b[(s[3]+10)%12][3]++; b[(s[3]+10)%12][4]--; optimize(s[1]); optimize(s[2]); } else if ((Math.min(b[(s[3]+4)%12][3],1)==1)*(Math.min(b[(s[3]+10)%12][4],1)==1)) { flat(s[3]+11,s[3]+15); b[s[3]][0]--; b[(s[3]+4)%12][3]--; b[(s[3]+4)%12][4]++; b[(s[3]+10)%12][4]--; b[(s[3]+10)%12][3]++; optimize(s[1]); optimize(s[2]); } } else if (((s[3]+2)%12==s[1])||((s[3]+2)%12==s[2])) { if (v[(s[3]+1)%12]==10) { flat(s[3]+9,s[3]+13); b[s[3]][0]--; b[(s[3]+2)%12][0]-=2; b[(s[3]+2)%12][3]+=2; b[(s[3]+8)%12][2]--; b[(s[3]+8)%12][4]+=2; } else if (v[(s[3]+9)%12]==10) { flat(s[3]+9,s[3]+13); b[s[3]][0]--; b[(s[3]+2)%12][0]++; b[(s[3]+2)%12][2]--; b[(s[3]+8)%12][0]--; } else if ((Math.min(b[(s[3]+2)%12][3],1)==1)*(Math.min(b[(s[3]+8)%12][4],1)==1)) { flat(s[3]+11,s[3]+15); b[s[3]][0]--; b[(s[3]+2)%12][3]--; b[(s[3]+2)%12][4]++; b[(s[3]+8)%12][3]++; b[(s[3]+8)%12][4]--; optimize(s[1]); optimize(s[2]); } } else if (((s[3]+1)%12==s[1])||((s[3]+1)%12==s[2])) { if (v[(s[3]+8)%12]==10) { flat(s[3]+8,s[3]+12); b[s[3]][0]-=2; b[s[3]][1]++; b[(s[3]+1)%12][0]+=2; b[(s[3]+1)%12][2]--; b[(s[3]+1)%12][3]--; b[(s[3]+1)%12][4]++; b[(s[3]+7)%12][0]-=2; b[(s[3]+7)%12][2]++; b[(s[3]+7)%12][3]++; b[(s[3]+7)%12][4]--; optimize(s[1]); optimize(s[2]); } else if ((Math.min(b[(s[3]+1)%12][3],1)==1)*(Math.min(b[(s[3]+7)%12][4],1)==1)) { flat(s[3]+8,s[3]+12); b[s[3]][0]-=2; b[s[3]][1]++; b[(s[3]+1)%12][0]++; b[(s[3]+1)%12][3]--; b[(s[3]+1)%12][4]++; b[(s[3]+7)%12][4]-=2; b[(s[3]+1)%12][2]++; b[(s[3]+1)%12][0]--;/* ここ */ } } else if (((s[3]+5)%12==s[1])||((s[3]+5)%12==s[2])) { if (v[(s[3]+4)%12]==10) { flat(s[3]+12,s[3]+16); b[s[3]][0]-=2; b[s[3]][1]++; b[(s[3]+5)%12][0]-=3; b[(s[3]+5)%12][2]++; b[(s[3]+5)%12][3]+=2; b[(s[3]+11)%12][0]++; b[(s[3]+11)%12][2]--; b[(s[3]+11)%12][4]+=2; } } a2xy(s[3]); s[0]=0; break;/* if ((s[3]+2)%12==s[1]) { flat(s[3]+9,s[3]+13); b[s[1]][0]--; b[s[2]][0]--; b[s[3]][0]=1; a2xy(s[3]); s[0]=0; } else if (s[3]==8) { b[4][2]=0; b[4][4]=2; b[10][0]=0; b[10][3]=2; b[9][0]=2; b[9][1]=0; b[8][0]=1; var r=2.0*Math.atan(1.0/2.0); x[8]=x[4]+4.0*60.0*Math.cos(r); y[8]=y[4]-4.0*60.0*Math.sin(r); x[6]=(x[4]+x[8])/2.0; y[6]=(y[4]+y[8])/2.0; x[5]=(x[4]+x[6])/2.0; y[5]=(y[4]+y[6])/2.0; x[7]=(x[6]+x[8])/2.0; y[7]=(y[6]+y[8])/2.0; x[9]=(x[8]+x[10])/2.0; y[9]=(y[8]+y[10])/2.0; s[0]=0; } else if (s[3]==3) { b[0][0]=2; b[4][0]=1; b[3][0]=0; b[3][1]=1; b[10][0]=1; b[10][2]=1; x[3]=x[4]; x[2]=x[5]; x[1]=x[6]; x[0]=x[7]; x[11]=x[8]; y[3]=y[4]+60.0; y[2]=y[5]+60.0; y[1]=y[6]+60.0; y[0]=y[7]+60.0; y[11]=y[8]+60.0; wx=200-(x[3]+x[9])/2.0; wy=200-(y[3]+y[9])/2.0; s[0]=0; }*/ break; case 14142135623: if (v[s[3]]==1) { b[s[3]][0]+=2; b[(s[3]+11)%12][0]--; b[(s[3]+13)%12][0]--; a2xy(s[3]); s[0]=0; } else if (v[s[3]]==3) { b[s[3]][0]-=2; b[(s[3]+11)%12][0]++; b[(s[3]+13)%12][0]++; a2xy(s[3]); s[0]=0; } break; case 22360679774: if (s[3]==10) { b[0][2]=-1; b[9][0]=1; b[9][1]=0; b[10][0]=1; b[11][0]=2; x[11]=x[0]+48.0; x[10]=x[11]+48.0; y[11]=y[0]-36.0; y[10]=y[11]-36.0; s[0]=0; } break; case 31622776601: if (s[3]==3) { b[0][1]=-1; b[1][0]=2; b[3][0]=1; b[4][0]=1; b[4][2]=0; x[1]=x[0]-48.0; x[2]=x[1]-48.0; x[3]=x[2]-48.0; y[1]=y[0]+36.0; y[2]=y[1]+36.0; y[3]=y[2]+36.0; s[0]=0; } break; case 41231056256: break; case 18973665961: if (s[3]==10) { b[10][0]=0; b[10][2]=-1; b[0][0]=b[9][0]=2; b[9][1]=0; b[1][0]=b[7][0]=1; b[1][1]=b[7][1]=1; x[0]=x[1]+48.0; y[0]=y[1]-36.0; x[11]=x[0]+48.0; y[11]=y[0]-36.0; x[10]=x[11]+48.0; y[10]=y[11]-36.0; x[9]=x[10]-60.0; x[8]=x[9]-60.0; y[8]=y[9]=y[10]; wx=200-(x[4]+x[10])/2.0; wy=200-(y[4]+y[10])/2.0; s[0]=0; } break; case 26832815729: if (s[3]==3) { b[0][2]=1; b[6][0]=1; b[6][2]=1; b[4][0]=2; b[4][2]=0; b[3][0]=0; b[3][1]=1; x[1]=x[0]-48.0; x[2]=x[1]-48.0; x[3]=x[2]-48.0; y[1]=y[0]+36.0; y[2]=y[1]+36.0; y[3]=y[2]+36.0; x[4]=x[5]=x[3]; y[4]=y[3]-60.0; y[5]=y[4]-60.0; wx=200-(x[3]+x[9])/2.0; wy=200-(y[3]+y[9])/2.0; s[0]=0; } break; } } function optimize(p) { for (var i=1; i!=13; i+=2) { var m=Math.min(b[p][i],b[p][i+1]); if (Math.min(m,0)==0) { b[p][0]+=m; b[p][i]-=m; b[p][i+1]-=m; } } b[p][0]%=4; } function angle() { for (var i=0; i!=12; i++) { a[i]=0; v[i]=0; for (var j=0,k=1; j!=13; j++,k*=10) { a[i]+=b[i][j]*c[j]; v[i]+=(b[i][j]+10)%10*k; } } } function near() { var l=100.0; var m; var n=-1; for (var i=0; i!=12; i++) { m=(mouseX-x[i]-wx)*(mouseX-x[i]-wx)+(mouseY-y[i]-wy)*(mouseY-y[i]-wy); if ( Math.min(l,m)==m ) { l=m; n=i; } } return n; } function pythagoras(m,n) { return Math.sqrt((x[m]-x[n])*(x[m]-x[n])+(y[m]-y[n])*(y[m]-y[n])); } function heron(m,n,o) { var p=pythagoras(m,n)/60.0; var q,r,ss; if ((Math.max(m,o,n)==m)*(Math.min(m,o,n)==n)) { q=m-o; r=o-n; } else if ((Math.max(n,o,m)==n)*(Math.min(n,o,m)==m)) { q=n-o; r=o-m; } else if ((Math.max(o,m,n)==o)*(Math.min(o,m,n)==n)) { q=o-m; r=12-o+n; } else if ((Math.max(o,n,m)==o)*(Math.min(o,n,m)==m)) { q=o-n; r=12-o+m; } else if ((Math.max(m,n,o)==m)*(Math.min(m,n,o)==o)) { q=n-o; r=12+o-m; } else if ((Math.max(n,m,o)==n)*(Math.min(n,m,o)==o)) { q=m-o; r=12+o-n; } var ss=(p+q+r)/2.0; return Math.floor(2000000000.0*Math.sqrt(ss*(ss-p)*(ss-q)*(ss-r))+0.5)/2000000000.0; } canvas.onmousedown = mouseDownListner; function mouseDownListner(e) { adjustXY(e); dx=mouseX; dy=mouseY; d=near(); } canvas.onmouseup = mouseUpListner; function mouseUpListner(e) { adjustXY(e); u=near(); if ((d!=-1)*(d==u)) { s[s[0]+1]=d; s[0]++; s[0]%=4; } else if ((d==-1)*(u==-1)) { wx+=mouseX-dx; wy+=mouseY-dy; } } canvas.onmousemove = mouseMoveListner; function mouseMoveListner(e) { adjustXY(e); t=near(); view(); ctx.font = '20pt Gothic'; angle(); if (t!=-1) { ctx.fillText(a[t]+' rad',10,30); ctx.fillText(a[t]*180.0/Math.PI+' deg',10,60); ctx.fillText(v[t]+' pol',10,90); switch (s[0]) { case 1: ctx.fillText('len='+Math.floor(1000000000.0*pythagoras(s[1],t)/6.0)/1000000000.0,10,120); break; case 2: ctx.fillText('len='+Math.floor(1000000000.0*pythagoras(s[1],s[2])/6.0)/1000000000.0,10,120); ctx.fillText('AoT='+heron(s[1],s[2],t)*100.0,10,150); break; } } else { switch (s[0]) { case 2: ctx.fillText('len='+Math.floor(1000000000.0*pythagoras(s[1],s[2])/6.0)/1000000000.0,10,120); break; } } } function adjustXY(e) { var rect = e.target.getBoundingClientRect(); mouseX = e.clientX - rect.left; mouseY = e.clientY - rect.top; } } view();})();
まず、3:4:5のピタゴラス三角形が表示されます。
隣り合う2点間の距離を10すると、面積は40×30÷2=600となります。
点にカーソルと当てると、内角の値をラジアン(rad)と度数(deg)で示します。
2点目にカーソルを当てる、2点間の距離(len)を求めます。
3点目にカーソルを当てると、先の2点を底辺とし、3点目をピンと張ってできる三角形の面積(Area of Triangle=AoT)を求めます。
その為に必要な2円と2交点も示します。
それぞれ、クリックすると確定します。
もし、AoTが整数となる場合、図形が変化することもあり、この1変化を1手とします。
どのような手順をふみ、図形を変化させ、手数、面積、形などのクエストを解くパズルゲームです。
まだ、実装されていませんが、以下のようなクエストを考えています。
※一部実装されているものもあります。
1手で図形をつくれ
1手で面積200の図形をつくれ
1手で面積300の図形をつくれ
1手で面積400の図形をつくれ
1手で面積500の図形をつくれ △
3種類の長方形をつくれ 0/3
1手で面積900の正方形をつくれ ○
1手で面積800の長方形をつくれ △
3手で面積500の長方形をつくれ ○
3種類の凧形をつくれ 0/3
1手で面積800の凧形をつくれ
1手で面積400の凧形をつくれ
3手で面積500の凧形をつくれ
4種類の平行四辺形をつくれ 0/4
1手で面積300の平行四辺形をつくれ
1手で面積400の平行四辺形をつくれ
1手で面積480の平行四辺形をつくれ
1手で面積640の平行四辺形をつくれ
2種類の菱形をつくれ 0/2
1手で面積540の菱形をつくれ
1手で面積720の菱形をつくれ
線対称凹四角形をつくれ
1手で面積300の線対称凹四角形をつくれ
1手で面積400の線対称凹四角形をつくれ
1手で面積480の線対称凹四角形をつくれ
1手で面積640の線対称凹四角形をつくれ
その他 1手で面積300の凸四角形をつくれ
1手で面積600の凸四角形をつくれ
1手で面積120の図形をつくれ
1手で面積440の図形をつくれ
1手で面積520の図形をつくれ
2手で面積360の図形をつくれ
2手で面積480の図形をつくれ
○ 仮実装済
△ 仮実装中
まず、3:4:5のピタゴラス三角形が表示されます。
隣り合う2点間の距離を10すると、面積は40×30÷2=600となります。
点にカーソルと当てると、内角の値をラジアン(rad)と度数(deg)で示します。
2点目にカーソルを当てる、2点間の距離(len)を求めます。
3点目にカーソルを当てると、先の2点を底辺とし、3点目をピンと張ってできる三角形の面積(Area of Triangle=AoT)を求めます。
その為に必要な2円と2交点も示します。
それぞれ、クリックすると確定します。
もし、AoTが整数となる場合、図形が変化することもあり、この1変化を1手とします。
どのような手順をふみ、図形を変化させ、手数、面積、形などのクエストを解くパズルゲームです。
まだ、実装されていませんが、以下のようなクエストを考えています。
※一部実装されているものもあります。
1手で図形をつくれ
1手で面積200の図形をつくれ
1手で面積300の図形をつくれ
1手で面積400の図形をつくれ
1手で面積500の図形をつくれ △
3種類の長方形をつくれ 0/3
1手で面積900の正方形をつくれ ○
1手で面積800の長方形をつくれ △
3手で面積500の長方形をつくれ ○
3種類の凧形をつくれ 0/3
1手で面積800の凧形をつくれ
1手で面積400の凧形をつくれ
3手で面積500の凧形をつくれ
4種類の平行四辺形をつくれ 0/4
1手で面積300の平行四辺形をつくれ
1手で面積400の平行四辺形をつくれ
1手で面積480の平行四辺形をつくれ
1手で面積640の平行四辺形をつくれ
2種類の菱形をつくれ 0/2
1手で面積540の菱形をつくれ
1手で面積720の菱形をつくれ
線対称凹四角形をつくれ
1手で面積300の線対称凹四角形をつくれ
1手で面積400の線対称凹四角形をつくれ
1手で面積480の線対称凹四角形をつくれ
1手で面積640の線対称凹四角形をつくれ
その他 1手で面積300の凸四角形をつくれ
1手で面積600の凸四角形をつくれ
1手で面積120の図形をつくれ
1手で面積440の図形をつくれ
1手で面積520の図形をつくれ
2手で面積360の図形をつくれ
2手で面積480の図形をつくれ
○ 仮実装済
△ 仮実装中