摘要:今日分享一例Canvas画的钻石,不错的呦,还是立体动画呢,你也来看看~
今日分享一例Canvas画的钻石,不错的呦,还是立体动画呢,你也来看看~
代码分享:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="Keywords" content="" /> <meta name="Description" content="" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2,user-scalable=yes,minimal-ui" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <title>canvas之钻石</title> <style> html,body{margin:0;padding:0;height:100%;overflow:hidden;background-color:#000;} </style> </head> <body> <canvas></canvas> <script> //<![CDATA[ "use strict"; var run=window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(cb){return setTimeout(cb,16.6)}, W=window.innerWidth, H=window.innerHeight; function diamond(cx,cy,radius,cvs) { var Vector3d=typeof Float32Array==="function"?Float32Array:Array, len=8,len1=32,total=len*3*3+len1*3*2+3, fl=radius*2.5, g=cvs.getContext("2d"), idx=0, arr=new Vector3d(total), move=new Vector3d(total), i=0,radius1,startAngle,angle, angleX=0,angleY=0.005; cvs.width=W; cvs.height=H; g.strokeStyle="#FFF"; for(radius1=radius*0.58,angle=Math.PI*2/len;i<len;i++) { arr[idx++]=Math.cos(angle*i)*radius1; arr[idx++]=Math.sin(angle*i)*radius1; arr[idx++]=-radius*0.175; } for(i=0,radius1=radius*0.8,angle=Math.PI*2/len,startAngle=angle/2;i<len;i++) { arr[idx++]=Math.cos(angle*i+startAngle)*radius1; arr[idx++]=Math.sin(angle*i+startAngle)*radius1; arr[idx++]=-radius*0.08; } for(i=0,angle=Math.PI*2/len1;i<len1;i++) { arr[idx++]=Math.cos(angle*i)*radius; arr[idx++]=Math.sin(angle*i)*radius; arr[idx++]=radius*(0.162+(i&1)*0.025); } for(i=0,angle=Math.PI*2/len1;i<len1;i++) { arr[idx++]=Math.cos(angle*i)*radius; arr[idx++]=Math.sin(angle*i)*radius; arr[idx++]=radius*(0.187-(i&1)*0.025); } for(i=0,radius1=radius*0.25,angle=Math.PI*2/len;i<len;i++) { arr[idx++]=Math.cos(angle*i)*radius1; arr[idx++]=Math.sin(angle*i)*radius1; arr[idx++]=radius*0.8; } arr[idx++]=0; arr[idx++]=0; arr[idx++]=radius; function rotate(angleX,angleY) { var cX=Math.cos(angleX), sX=Math.sin(angleX), cY=Math.cos(angleY), sY=Math.sin(angleY), x1,y1,z1, i=0,len=arr.length; for(;i<len;i+=3) { x1=cY*arr[i]-sY*arr[i+2], z1=cY*arr[i+2]+sY*arr[i], y1=cX*arr[i+1]-sX*z1; z1=cX*z1+sX*arr[i+1]; arr[i]=x1; arr[i+1]=y1; arr[i+2]=z1; } } function setPerspective(){ for(var i=0,scale,len=arr.length;i<len;i+=3) { scale=fl/(fl+arr[i+2]); move[i]=arr[i]*scale; move[i+1]=arr[i+1]*scale; } } function draw(arr){ var idx=0,st=len*3*2+len1*3*2; g.clearRect(0,0,W,H); g.save(); g.translate(cx,cy); g.beginPath(); g.moveTo(arr[idx++],arr[idx++]); idx++; for(i=1;i<len;i++) { g.lineTo(arr[idx++],arr[idx++]); idx++; } g.closePath(); g.stroke(); g.beginPath(); g.moveTo(arr[0],arr[1]); for(i=0;i<len-1;i++) { g.lineTo(arr[idx++],arr[idx++]); g.lineTo(arr[idx-len*3+1],arr[idx-len*3+2]); idx++; } g.lineTo(arr[idx++],arr[idx++]); idx++; g.closePath(); g.stroke(); g.beginPath(); g.moveTo(arr[idx++],arr[idx++]); idx++; for(i=1;i<len1;i++) { g.lineTo(arr[idx++],arr[idx++]); idx++; } g.closePath(); g.stroke(); idx-=len1*3; g.beginPath(); g.moveTo(arr[idx-3],arr[idx-2]); g.lineTo(arr[idx],arr[idx+1]); for(i=0;i<len1;i++) { if(i&1) { idx+=3; } else { if(i%4) { g.moveTo(arr[idx++],arr[idx++]); } else { g.moveTo(arr[len*3+((i-1)/4|0)*3],arr[len*3+((i-1)/4|0)*3+1]); g.lineTo(arr[idx++],arr[idx++]); } g.lineTo(arr[len*3+(i/4|0)*3],arr[len*3+(i/4|0)*3+1]); idx++; } } g.stroke(); g.beginPath(); g.moveTo(arr[idx++],arr[idx++]); idx++; for(i=1;i<len1;i++) { g.lineTo(arr[idx++],arr[idx++]); idx++; } g.closePath(); g.stroke(); idx-=len1*3; g.beginPath(); g.moveTo(arr[st-6],arr[st-5]); g.lineTo(arr[st],arr[st+1]); for(i=0;i<len1;i++) { if(i&1) { idx+=3; } else { if(i%4) { g.moveTo(arr[st++],arr[st++]); g.lineTo(arr[idx++],arr[idx++]); st===total-4||g.lineTo(arr[++st],arr[st+1]); } else { g.moveTo(arr[idx++],arr[idx++]); g.lineTo(arr[total-3],arr[total-2]); } idx++; } } g.stroke(); g.restore(); } cvs.addEventListener(typeof cvs.onmousemove==="undefined"?"touchstart":"mousemove",function(e){ var crd=document.body.getBoundingClientRect(); e.type=="touchstart"&&(e=e.touches[0]); angleY=e.clientX-crd.left-cx>0?0.005:-0.005; angleX=e.clientY-crd.top-cy>0?0.005:-0.005; },false); rotate(-1.62,angleY); (function drawFrame(){ rotate(angleX,angleY); setPerspective(); draw(move); run(drawFrame); })(); } diamond(W/2,H/2,Math.max(120,Math.min(W,H)/4),document.querySelector("canvas")); //]]> </script> </body> </html>