HTML5 Canvas 六角光阑动态效果
来源:互联网 发布:js多个异步请求结果 编辑:程序博客网 时间:2024/05/13 09:08
光阑是光具组件中光学元件的边缘、框架或特别设置的带孔屏障,本人实现了结构比较简单的六角光阑,效果有点像宇航员在徐徐张开的飞船舷窗中看到逐渐完整的地球,下面四张图可以感受一下。
当然看动态效果才能真正体验,要看完整的演示请下载:https://files.cnblogs.com/files/xiandedanteng/slotAnimation.rar 并用chrome打开。
代码如下:
<!DOCTYPE html><html lang="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><head> <title>六角光阑</title> </head> <body onload="draw()"> <canvas id="myCanvus" width="400px" height="400px" style="border:1px dashed black;"> 出现文字表示你的浏览器不支持HTML5 </canvas> </body></html><script type="text/javascript"><!--function draw(){ var canvas=document.getElementById('myCanvus'); canvas.width=400; canvas.height=400; context=canvas.getContext('2d'); context.translate(200,200); animate();};var delta=0;// 旋转角var radius=0;// 旋转半径var outerRad=200;// 外径var context;function animate(){ context.clearRect(-200,-200,400,400);// 清屏 var s=new Slot(); s.update(radius,delta,outerRad); s.paintBg(context); s.paint(context); s.paintBase(context); delta+=1; radius+=1; if(radius<outerRad){ // 让浏览器自行决定帧速率 window.requestAnimationFrame(animate); }}// 角度得到弧度function getRad(degree){ return degree/180*Math.PI;}function Slot(){ var obj=new Object; obj.bx=0; obj.by=0; obj.cx=0; obj.cy=0; obj.dx=0; obj.dy=0; obj.angleC=0; obj.angleD=0; obj.radius=0; obj.outerRad=0; obj.img; // 计算 obj.update=function(radius,theta,outerRad){ this.img=new Image(); this.img.src="earth.jpg"; this.radius=radius; this.outerRad=outerRad; this.bx=radius*Math.cos(getRad(theta+60)); this.by=radius*Math.sin(getRad(theta+60)); var alpha=Math.asin(radius*Math.sin(getRad(60))/this.outerRad); this.angleC=getRad(theta)+alpha; this.cx=outerRad*Math.cos(this.angleC); this.cy=outerRad*Math.sin(this.angleC); this.angleD=this.angleC-Math.PI/3; this.dx=outerRad*Math.cos(this.angleD); this.dy=outerRad*Math.sin(this.angleD); }; // 画背景 obj.paintBg=function(ctx){ context.drawImage(this.img,0,0,800,800,-200,-200,400,400); }; // 描光阑 obj.paint=function(ctx){ ctx.strokeStyle = "black"; for(var i=0;i<6;i++){ ctx.save(); ctx.fillStyle = getColor(i+5); ctx.rotate(Math.PI/3*i); ctx.beginPath(); ctx.lineTo(this.bx,this.by); ctx.lineTo(this.dx,this.dy); ctx.arc(0,0,this.outerRad,this.angleD,this.angleC,false); ctx.lineTo(this.bx,this.by); ctx.closePath(); ctx.stroke(); ctx.fill(); ctx.restore(); } }; // 描基座 obj.paintBase=function(ctx){ ctx.strokeStyle = "black"; for(var i=0;i<4;i++){ ctx.save(); ctx.fillStyle = getColor(13); ctx.rotate(Math.PI/2*i); ctx.beginPath(); ctx.arc(0,0,this.outerRad,0,Math.PI/2,false); ctx.lineTo(this.outerRad,this.outerRad); ctx.lineTo(this.outerRad,0); ctx.closePath(); ctx.stroke(); ctx.fill(); ctx.restore(); } }; return obj;}// 得到颜色function getColor(index){ if(index==0){ return "green"; }else if(index==1){ return "silver"; }else if(index==2){ return "lime"; }else if(index==3){ return "gray"; }else if(index==4){ return "white"; }else if(index==5){ return "yellow"; }else if(index==6){ return "maroon"; }else if(index==7){ return "navy"; }else if(index==8){ return "red"; }else if(index==9){ return "blue"; }else if(index==10){ return "purple"; }else if(index==11){ return "teal"; }else if(index==12){ return "fuchsia"; }else if(index==13){ return "aqua"; }else if(index==14){ return "black"; }}//--></script>
阅读全文
0 0
- HTML5 Canvas 六角光阑动态效果
- HTML5 Canvas 六角光阑动态效果
- HTML5 Canvas 六角光阑动态效果
- html5:<canvas>标签实现动态效果
- HTML5 canvas 效果
- canvas绘图动态效果
- 【html5 canvas】使用Canvas做出橡皮擦效果
- HTML5 Canvas实现透明效果
- HTML5 Canvas动画效果演示
- 关于HTML5 canvas 阴影效果
- HTML5 canvas创建粒子效果
- HTML5 Canvas刮刮卡效果 实例
- html5 canvas画图手电筒效果
- 【HTML5】Canvas 实现放大镜效果
- html5 canvas实现刮刮卡效果
- html5 canvas clock 时钟效果
- canvas动态小球重叠效果
- canvas动态小球重叠效果
- SSL
- React 修改端口号
- 怎么把gradle项目转为maven项目?
- iOS OpenGL renderbufferStorage:fromDrawable 方法详解
- 沉浸式状态栏简单的方法
- HTML5 Canvas 六角光阑动态效果
- Modbus学习总结
- Java查看类的成员
- zab一致性协议
- 问题解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
- Java的八大基本数据类型及封装类
- 数据库去重
- Cobbler部署指南之配置管理篇[上文]
- 3dsMax 快捷键记录