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常用技巧及常用方法列表集合
Apr 06 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
Sep 16 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
jquery和css3实现的炫酷时尚的菜单导航
Sep 01 Javascript
javascript密码强度校验代码(两种方法)
Aug 10 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
javascript中json对象json数组json字符串互转及取值方法
Apr 19 Javascript
express框架实现基于Websocket建立的简易聊天室
Aug 10 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
微信小程序 scroll-view 实现锚点跳转功能
Dec 12 Javascript
React+EggJs实现断点续传的示例代码
Jul 07 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
详解javascript高级定时器
2015/12/31 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python实现简单多线程任务队列
2016/02/27 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
python日志记录模块实例及改进
2017/02/12 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
详解Python self 参数
2019/08/30 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
解决c++调用python中文乱码问题
2020/07/29 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
大学生开西餐厅创业计划书
2014/02/01 职场文书
党校培训自我鉴定
2014/02/01 职场文书
优质服务演讲稿
2014/05/14 职场文书
投标授权委托书范文
2014/08/02 职场文书
2015年三万活动总结
2015/03/25 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL