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 相关文章推荐
用于table内容排序
Jul 21 Javascript
网页禁用右键实现代码(JavaScript代码)
Oct 29 Javascript
再探JavaScript作用域
Sep 24 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
Nov 07 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
Vue自定义指令拖拽功能示例
Feb 17 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
Angular4学习教程之DOM属性绑定详解
Jan 04 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
vue动态绘制四分之三圆环图效果
Sep 03 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
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
Python写的服务监控程序实例
2015/01/31 Python
Python3 处理JSON的实例详解
2017/10/29 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
vivo智能手机官方商城:vivo
2016/09/22 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
英语三分钟演讲稿
2014/08/19 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
欢送领导祝酒词
2015/08/12 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python