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 相关文章推荐
jquery无缝向上滚动实现代码
Mar 29 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
AspNet中使用JQuery上传插件Uploadify详解
May 20 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
bootstrap table动态加载数据示例代码
Mar 25 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
Vue插值、表达式、分隔符、指令知识小结
Oct 12 Javascript
vue实现把接口单独存放在一个文件方式
Aug 13 Javascript
基于js实现的图片拖拽排序源码实例
Nov 04 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 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中GET变量的使用
2006/10/09 PHP
php生成缩略图的类代码
2008/10/02 PHP
php adodb连接不同数据库
2009/03/19 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
浅析php工厂模式
2014/11/25 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
vue 微信授权登录解决方案
2018/04/10 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
深入探究Django中的Session与Cookie
2017/07/30 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
2014年个人思想工作总结
2014/11/27 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
使用 Apache 反向代理的设置技巧
2022/01/18 Servers