JavaScript 动态三角函数实例详解


Posted in Javascript onJanuary 08, 2017

下面一段代码给大家分享JavaScript 动态三角函数,具体代码如下所述:

<html>
 <head>
 <meta charset="utf8" />
 <title>三角函数图形</title>
 <style type="text/css">
  body {
  background-color:black;
  }
  #canvas {
  position:absolute;
  top:50%;
  left:50%;
  margin:-151px 0 0 -401px;
  border:1px dashed #171717;
  }
 </style>
 </head>
 <body>
 <canvas id="canvas" width="800px" height="300px">您的浏览器不支持canvas</canvas>
 <script type="text/javascript">
  //判断是否支持canvaas
  function isSupportCanvas(canvas) {
  return !!(canvas.getContext && canvas.getContext("2d"));
  }
  //requestAnimationFrame会自动使用最优的帧率进行渲染
  function setupRAF() {
  var lastTime = 0;
  //兼容各个浏览器,Internet Explorer11、Google Chrome(Microsoft Edge)、Mozilla Firefox、Opera
  var vendors = ["ms", "moz", "webkit", "o"];
  for(var i=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) {
   var currentTime = new Date().getTime();
   var timeToCall = Math.max(0, 16-(currentTime-lastTime));
   var callTime = currentTime + timeToCall;
   var id = window.setTimeout(function() {
    callback(callTime);
   }, timeToCall);
   lastTime = callTime;
   return id;
   };
  }
  //回退机制
  if(!window.cancelAnimationFrame) {
   window.cancelAnimationFrame = function(id) {
   clearTimeout(id);
   }
  }
  }
  var CanvasController = function(canvas) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 1;
  ctx.textAlign = "left";
  ctx.textBaseline = "middle";
  ctx.font = "bold 18pt Calibri";
  var i = 0;
  var step = 1;
  var unitX = 90
  var unitY = canvas.height * 0.3;
  function update() {
   i += step;
   i %= 360;
  }
  //渲染坐标
  function rendeRcoordinate() {
   ctx.strokeStyle = "white";
   ctx.beginPath();
   var topUnit = 0.5 * canvas.height - unitY;
   var bottomUnit = 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();
  }
  //渲染三角函数
  function render(trigonometricFunction, color) {
   ctx.strokeStyle = color;
   ctx.beginPath();
   var isInRange = false;
   for(var x=0; x < canvas.width; x++) {
   var a = (x + i) / 180 * Math.PI;
   var y = 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;
    var funcName = trigonometricFunction.toString();
    var reg = /function\s*(\w*)/i;
    var matches = reg.exec(funcName);
    ctx.fillText(matches[1], 0, y);
    } 
   } else {
    isInRange = false;
   }
   }
   ctx.stroke();
  }
  this.init = function() {
   function loop() {
   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();
  }
  }
  function init() {
  var canvas = document.getElementById("canvas");
  if(!isSupportCanvas(canvas)) {
   return;
  }
  setupRAF();
  var canvasController = new CanvasController(canvas);
  canvasController.init();
  }
  init();
 </script>
 </body>
</html>
</html>
Javascript 相关文章推荐
css图片自适应大小
Nov 28 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
js弹出窗口返回值的简单实例
May 28 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
leaflet的开发入门教程
Nov 17 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
基于Vue2.X的路由和钩子函数详解
Feb 09 Javascript
使用RxJS更优雅地进行定时请求详析
Jun 02 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
Jul 21 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 Javascript
你不知道的 javascript【推荐】
Jan 08 #Javascript
js时间控件只显示年月
Jan 08 #Javascript
javascript函数的四种调用模式
Jan 08 #Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 #Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 #Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
Jan 08 #Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 #Javascript
You might like
php动态函数调用方法
2015/05/21 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Django中使用Celery的方法示例
2018/11/29 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
销售自我评价
2013/10/22 职场文书
咖啡馆创业计划书
2014/01/26 职场文书
优秀学生事迹材料
2014/02/08 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
文案策划求职信
2014/04/14 职场文书
杜甫草堂导游词
2015/02/03 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
给病人的慰问信
2015/03/23 职场文书
2015年组织部工作总结
2015/04/03 职场文书
保护环境的宣传语
2015/07/13 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
JavaScript中reduce()的用法
2022/05/11 Javascript