JavaScript 动态三角函数实例详解
下面一段代码给大家分享JavaScript动态三角函数,具体代码如下所述:
<html> <head> <metacharset="utf8"/> <title>三角函数图形</title> <styletype="text/css"> body{ background-color:black; } #canvas{ position:absolute; top:50%; left:50%; margin:-151px00-401px; border:1pxdashed#171717; } </style> </head> <body> <canvasid="canvas"width="800px"height="300px">您的浏览器不支持canvas</canvas> <scripttype="text/javascript"> //判断是否支持canvaas functionisSupportCanvas(canvas){ return!!(canvas.getContext&&canvas.getContext("2d")); } //requestAnimationFrame会自动使用最优的帧率进行渲染 functionsetupRAF(){ varlastTime=0; //兼容各个浏览器,InternetExplorer11、GoogleChrome(MicrosoftEdge)、MozillaFirefox、Opera varvendors=["ms","moz","webkit","o"]; for(vari=0;i<vendors.length;i++){ window.requestAnimationFrame=window[vendors[i]+"RequestAnimationFrame"]; window.cancelAnimationFrame=window[vendors[i]+"CancelAnimationFrame"]||window[vendors[i]+"CancelRequestAnimationFrame"]; //测试浏览器支持哪一张 if(window.requestAnimationFrame){ console.log(vendors[i]+"requestAnimationFrame"); } if(window[vendors[i]+"CancelAnimationFrame"]){ console.log(vendors[i]+"CancelAnimationFrame"); } if(window[vendors[i]+"CancelRequestAnimationFrame"]){ console.log(vendors[i]+"CancelRequestAnimationFrame"); } } //回退机制 if(!window.requestAnimationFrame){ window.requestAnimationFrame=function(callback,element){ varcurrentTime=newDate().getTime(); vartimeToCall=Math.max(0,16-(currentTime-lastTime)); varcallTime=currentTime+timeToCall; varid=window.setTimeout(function(){ callback(callTime); },timeToCall); lastTime=callTime; returnid; }; } //回退机制 if(!window.cancelAnimationFrame){ window.cancelAnimationFrame=function(id){ clearTimeout(id); } } } varCanvasController=function(canvas){ varctx=canvas.getContext("2d"); ctx.lineWidth=1; ctx.textAlign="left"; ctx.textBaseline="middle"; ctx.font="bold18ptCalibri"; vari=0; varstep=1; varunitX=90 varunitY=canvas.height*0.3; functionupdate(){ i+=step; i%=360; } //渲染坐标 functionrendeRcoordinate(){ ctx.strokeStyle="white"; ctx.beginPath(); vartopUnit=0.5*canvas.height-unitY; varbottomUnit=0.5*canvas.height+unitY; ctx.moveTo(0,topUnit); ctx.lineTo(canvas.width,topUnit); ctx.moveTo(0,bottomUnit); ctx.lineTo(canvas.width,bottomUnit); ctx.stroke(); } //渲染三角函数 functionrender(trigonometricFunction,color){ ctx.strokeStyle=color; ctx.beginPath(); varisInRange=false; for(varx=0;x<canvas.width;x++){ vara=(x+i)/180*Math.PI; vary=trigonometricFunction(a); //tan值有可能是无穷大或无穷小 if(isFinite(y)){ y=y*unitY+0.5*canvas.height; if(isInRange){ if(y<0||y>canvas.height){ isInRange=false; }else{ ctx.lineTo(x,y); } }else{ isInRange=true; ctx.moveTo(x,y); } if(x==0){ ctx.fillStyle=color; varfuncName=trigonometricFunction.toString(); varreg=/function\s*(\w*)/i; varmatches=reg.exec(funcName); ctx.fillText(matches[1],0,y); } }else{ isInRange=false; } } ctx.stroke(); } this.init=function(){ functionloop(){ requestAnimationFrame(loop,canvas); ctx.clearRect(0,0,canvas.width,canvas.height); update(); rendeRcoordinate(); render(Math.sin,"red"); render(Math.cos,"green"); render(Math.tan,"blue"); } loop(); } } functioninit(){ varcanvas=document.getElementById("canvas"); if(!isSupportCanvas(canvas)){ return; } setupRAF(); varcanvasController=newCanvasController(canvas); canvasController.init(); } init(); </script> </body> </html> </html>