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 相关文章推荐
NODE.JS加密模块CRYPTO常用方法介绍
Jun 05 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
Jun 25 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
Sep 06 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
Nov 07 Javascript
jquery心形点赞关注效果的简单实现
Nov 14 Javascript
概述jQuery的元素筛选
Nov 23 Javascript
js微信扫描二维码登录网站技术原理
Dec 01 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
详解swiper在vue中的应用(以3.0为例)
Sep 20 Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 Javascript
Vue Element UI自定义描述列表组件
May 18 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
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
javascript 数组操作详解
2015/01/29 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
javascript运动详解
2015/07/06 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
vue实现列表拖拽排序的功能
2020/11/02 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python实现两张图片的像素融合
2019/02/23 Python
django中forms组件的使用与注意
2019/07/08 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
python写一个随机点名软件的实例
2019/11/28 Python
浅析Python中字符串的intern机制
2020/10/03 Python
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
Weblogc domain问题
2014/01/27 面试题
高一自我鉴定
2013/12/17 职场文书
采购经理岗位职责
2014/02/16 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript