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 相关文章推荐
Javascript学习笔记1 数据类型
Jan 11 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
JavaScript调用后台的三种方法实例
Oct 17 Javascript
jQuery+Ajax实现无刷新分页
Oct 30 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 Javascript
JS实现的贪吃蛇游戏完整实例
Jan 18 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 Javascript
Vue项目打包压缩的实现(让页面更快响应)
Mar 10 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
Jul 15 Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
你不知道的 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
javascript 对象的定义方法
2007/01/10 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
node中的cookie的具体使用
2018/09/13 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
python实现超简单的视频对象提取功能
2018/06/04 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
更夫岗位责任制
2014/02/11 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
企业授权委托书范本
2014/09/22 职场文书
排球赛新闻稿
2015/07/17 职场文书