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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
Prototype源码浅析 Number部分
Jan 16 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
Jan 13 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
Mar 17 Javascript
基于js中的原型、继承的一些想法
Aug 10 Javascript
jQuery 实现双击编辑表格功能
Jun 19 jQuery
React Native中Mobx的使用方法详解
Dec 04 Javascript
js实现json数组分组合并操作示例
Feb 12 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
Jul 10 Javascript
手把手教你从零开始react+antd搭建项目
Jun 03 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编程中八种常见的文件操作方式
2006/11/19 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
Python如何读取、写入JSON数据
2020/07/28 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
UNIX文件系统分类
2014/11/11 面试题
高中生的自我评价
2014/03/04 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
学习张林森心得体会
2014/09/10 职场文书
停车位租赁协议书
2014/09/24 职场文书
2014年行政部工作总结
2014/11/19 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书