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里使用Dom操作Xml
Sep 20 Javascript
Javascript Tab 导航插件 (23个)
Jun 11 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 Javascript
详解iframe与frame的区别
Jan 13 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
Aug 09 Javascript
详解使用nvm安装node.js
Jul 18 Javascript
vue-cli + sass 的正确打开方式图文详解
Oct 27 Javascript
使用 vue-i18n 切换中英文效果
May 23 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
vue框架制作购物车小球动画效果实例代码
Sep 26 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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+mysql保存和输出文件
2006/10/09 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
laravel5.6实现数值转换
2019/10/23 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
angularjs中的$eval方法详解
2017/04/24 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
python中退出多层循环的方法
2018/11/27 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
python和js交互调用的方法
2020/06/23 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
初级会计求职信范文
2014/02/15 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
2015年复活节活动总结
2015/02/27 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL