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 相关文章推荐
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
javascript中怎么做对象的类型判断
Nov 11 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
Sep 22 Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
JS实现直接运行html代码的方法
Mar 13 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
Apr 01 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
Jun 29 Javascript
Vue源码探究之状态初始化
Nov 14 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实现Ftp用户的在线管理
2012/02/16 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
初步探究Python程序的执行原理
2015/04/11 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
python解析基于xml格式的日志文件
2017/02/25 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
python属于软件吗
2020/06/18 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
EJB timer的种类
2014/10/28 面试题
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
廉政承诺书2015
2015/04/28 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
SQL CASE 表达式的具体使用
2022/03/21 SQL Server