《每周一点canvas动画》——三角函数

本节主要内容有:

  • 三角函数介绍
  • 常用三角函数解析
  • 鼠标跟随角度旋转

看到三角函数,勾股定理这样的数学名词是不是有种双腿打颤的感觉啊!好吧,就算你已经吓尿了,也不能否认我们中学学习的知识终于有了用武之地,挽起袖子,开整!!!

1、三角函数

什么是三角函数呢?简单的定义:所谓三角函数,在几何上来说就是夹角与边的关系!为了更直观的表示,也为了让忘记的同学回忆起来,这里我给个示意图。

在上图中例出了几个常用的三角函数,角度与边(x, y和R)之间的关系如公式所示!那么在canvas中角度与边之间的关系是怎样的呢?首先,我们需要知道的是canvas中坐标是如何定义的。

如图所示,与普通坐标不同,canvas坐标以整个画布的左上角作为坐标原点,y轴朝下为正,x轴水平向右。坐标不同,对应的角度表示就有所差异,这个差异主要体现在角度的正负上。

上图中canvas的坐标与普通坐标感觉一样,但我想表达的是在canvas中顺时针方向为正,逆时针为负。

2、常用三角函数

前面我们简单的介绍了三角函数的表示方法以及canvas的坐标系统。但是,在实际开发中我们不仅想要通过角度来推出两边的距离长度比值。而更关心的是如何通过已知的距离(因为坐标的位置很好确定)来推出角度。这里我们要用到反三角函数

sin(θ)=x/R   --->  θ = arcsin(x/R)
cos(θ)=y/R   --->  θ = arccos(y/R)
tan(θ)=x/y   --->  θ = arctan(x/y)

对应到javascript中,相应表示方法如下。

sin(θ)  --->  Math.sin( θ * Math.PI/180 )
cos(θ)  --->  Math.cos( θ * Math.PI/180 )
tan(θ)  --->  Math.tan( θ * Math.PI/180 )

θ = arcsin(x/R) ---> Math.asin(x/R)*(180/Math.PI)
θ = arccos(y/R) ---> Math.acos(y/R)*(180/Math.PI)
θ = arctan(x/y) ---> Math.atan(x/y)*(180/Math.PI)

好吧!看到这里也许你已经恶心得想吐了。但是,没办法这就是数学的魅力!这里需要强调的是:canvas中角度的表示采用的是弧度制。这样你就可以理解 θ * Math.PI/180是将角度转成弧度,比如:30° = 30 * π /180 = π / 6。 而将弧度转成角度自然就要用弧度值`Math.asin(x/R) 乘上180/Math.PI`。这之间的转换关系,慢慢想想就明白了!

3、Math.atan2(dy, dx)

相比于Math.asin()和Math.cos()这两个函数,Math.atan()在开发中用到的更多。它可以直接通过两个直角边得到对应的角度值。相比于其他两个需要通过计算长边来得到角度值来说,计算过程更加简单!但是,该函数在角度的判定上回出现一个问题——存在两个相同的角度值而无法判定物体具体的旋转角度。详细说明如下图所示。

因为,tan函数的周期是(-π/2, π/2),由于这一特性导致电脑是无法判断旋转的到底是哪个角度!!!这时,另一个函数就横空出世了,当当当当,他就是Math.atan2(dy, dx)!他不仅解决了上面我们说的问题,而且只需要传入横纵坐标距离就可以计算出对应的角度值!是不是很酷。

4、跟随鼠标旋转

本章的理论知识已经介绍完成。现在,开始我们的第一个demo——rotate-to-mouse.html顾名思义就是跟随鼠标旋转。首先创建一个文件arrow.js,这个文件是使用canvas画一个箭头,并且为了今后方便使用,将它写成一个类文件!代码如下:

arrow.js文件

    function Arrow() {
        this.x = 0;  //初始位置
        this.y = 0;
        this.rotation = 0;  //初始旋转角度
        this.color = ‘#ffff00‘;

    }
    //在原型上定义draw方法
    Arrow.prototype.draw = function(context){
        context.save();
        context.translate(this.x , this.y); //将坐标移到this.x 和 this.y
        context.rotate(this.rotation); //设置旋转角度
        context.lineWidth = 5;  //设置线宽
        context.fillStyle = this.color; //设置填充色
        context.beginPath();  //路径开始
        context.moveTo(-50,-25);
        context.lineTo(0,-25);
        context.lineTo(0,-50);
        context.lineTo(50,0);
        context.lineTo(0,50);
        context.lineTo(0,25);
        context.lineTo(-50,25);
        context.closePath(); //路径闭合
        context.stroke(); //描边
        context.fill(); //填充
        context.restore();
    }

现在我们在rotate-to-mouse.html文件中引入它,来创建一个箭头

rotate-to-mouse.html 文件

  <canvas id=‘canvas‘ width="500" height="500" style="background:#ccc;">
      you browser not support canvas
  </canvas>

  <script src="../js/utils.js"></script> //引入我们的工具函数文件
  <script src="../js/arrow.js"></script> //引入我们的箭头函数文件
  <script>
      window.onload = function(){
        var canvas = document.getElementById(‘canvas‘);
        var context = canvas.getContext(‘2d‘);
        var centerX = canvas.width/2;
        var centerY = canvas.height/2;

        //传入canvas,获取鼠标在canvas上移动是的坐标
        var mouse = utils.captureMouse(canvas);

        //新建一个arrow对象
        var arrow = new Arrow();

        //将arrow的坐标设置为canvas的中心
        arrow.x = centerX;
        arrow.y = centerY;

      //动画循环函数
      (function drawFrame(){
          window.requestAnimationFrame(drawFrame,canvas);
          context.clearRect(0, 0, canvas.width, canvas.height);

          //获取dy,dx值
          var dx = mouse.x - arrow.x,
          dy = mouse.y - arrow.y;

          //设置旋转角度
            arrow.rotation = Math.atan2(dy, dx);

         //调用draw方法画出
           arrow.draw(context);

      })();
}

</script>

我们最终得到的结果就是一个,可以跟随鼠标旋转的箭头。

总结

这节你应该学会了如何运用三角函数,控制物体的旋转。重点公式:

dx = mouse.x - object.x;
dy = mouse.y - object.y;
object.rotation = Math.atan2(dy,dx);

原文地址:https://www.cnblogs.com/homehtml/p/12640994.html

时间: 2024-10-21 23:25:16

《每周一点canvas动画》——三角函数的相关文章

《每周一点canvas动画》——用户交互

用户交互也许是我们学习canvas动画中首先需要掌握的部分.毕竟,如果没有交互或者向动画中做一些动态的输入,那么这跟看电影有什么区别呢?用户交互基于事件,一般来说包括:鼠标事件,触摸事件和键盘事件. 1.事件和事件执行 在理解事件之前,你需要明白什么是listener和handler.listener(即监听器)决定当一个事件发生时是否做出反应.handler(即执行者)是一个函数,当事件发生时被调用.好了,扯了这么多直接上代码: element.addEventListener(type, h

《每周一点canvas动画》——速度与加速度(2)

在上一节中我们介绍了速度的基本概念,包括沿坐标轴的速度,和更普适的任意方向的速度,在文章的最后我们做了一个鼠标跟随的示例,以及通过改变物体的rotation属性做了一个关于速度的扩展.通过上一节的学习你会发现我们的物体可以沿着任意方向运动,但是这还远远不够,因为我们的物体都是在做匀速运动.既然有匀速运动,当然就有变速运动喽!这一节我们介绍本章的另一个重要内容加速度.本节将分为下面几个部分: 加速度基本概念 沿坐标轴的加速度 加速度的合成与分解 重力加速度 太空船(运用实例) 本章总结 1.加速度

2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等

1.面向对象贪吃蛇 2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片改变了,不管网速快慢它都有个加载时间. 3.好的canvas动画工具 或者游戏的推荐: 解决方法:工具推荐-1&工具推荐-2 4.下面代码为什么在Chrome下会报错? var log = console.log; log("test"); 解决方法:改为以下代码 log = cons

7 个顶级的 HTML5 Canvas 动画赏析

HTML5确实是一项改革浏览器乃至整个软件行业的新技术,它可以帮助我们Web开发者很方便地在网页上实现动画特效,而无需臃肿的Flash作为支撑.本文分享7个顶级的HTML5 Canvas 动画,都有非常不错的效果. 1.3D HTML5 Logo动画 HTML5多视角3D旋转动画 HTML5 3D动画实现起来非常方便,之前介绍过基于jQuery的3D旋转插件是利用多张多视角图片播放来实现的,而今天分享的这款HTML5 3D旋转动画是利用纯HTML5技术实现的,该动画实现了HTML5 Logo旋转

canvas动画文字效果

Doughnut Chartvar c=document.getElementById("canvas");var ctx=c.getContext("2d");ctx.font="50px sans-serif";ctx.fillText("75%",40,92);//ctx.clearRect(40, 52, 74, 68); var c=document.getElementById("canvas"

HTML5 Canvas动画效果实现原理

在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x, y)方法来刷新须要绘制的图形 首先是绘制图形的方法,例如以下: function myAnimation() { ctx.clearRect(0, 0, canvas_size_x, canvas_size_y); if (x_icon < 0 || x_icon > canvas_size_

8个经典炫酷的HTML5 Canvas动画欣赏

HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮助. 1.HTML5 Canvas可拖动的弹性大树摇摆动画 今天让我们继续来分享一个炫酷的HTML5动画,它是一款基于HTML5 Canvas的大树摇摆动画,这款HTML5动画的特点是我们可以拖拽树枝,从而让整棵树摇摆起来,这样就真实地模拟了大树从摇摆到静止的整个过程,相当逼真. 在线演示     

【原创】测试不同浏览器播放canvas动画的平滑程度

Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基本的Canvas API包括一个2D环境,该环境允许程序员绘制各种图形和渲染文本,并将图像显示在浏览器窗口的定义区域.实现Canvas动画时,程序员需要在下一帧渲染前设置屏幕内容,重绘图像以实现动画效果.Canvas动画的实现有点儿像“翻页动画”,在绘本上的每页绘制不同图像,快速翻过时每一帧都连续起

7个惊艳的HTML5 Canvas动画效果及源码

HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来看看. 1.HTML5 Canvas瀑布动画 超逼真 这是一个很逼真的HTML5瀑布动画,基于Canvas实现的,效果相当酷. 在线演示   /   源码下载 2.HTML5 Canvas彩色像素进度条动画 这也是一款基于HTML5 Canvas的动画特效,它是一个很有创意的HTML5进度条,大家可