最近在联系JavaScript 二维绘图,经常会用到旋转,前几篇博文也提到过这类问题。

但是我忘记了JavaScript二维绘图中有关旋转最核心的两个方法:save()和restore()

在w3c上对于save()方法的解释是:

save( ) 方法把当前状态的一份拷贝压入到一个保存图像状态的栈中。这就允许您临时地改变图像状态。

原文链接:http://www.w3school.com.cn/jsref/met_canvasrenderingcontext2d_save.asp

restore() 的解释:

restore() 方法从栈中弹出存储的图形状态并恢复 CanvasRenderingContext2D 对象的属性、剪切路径和变换矩阵的值。

原文链接:http://www.w3school.com.cn/jsref/met_canvasrenderingcontext2d_restore.asp

其实对于这两个方法有个更为生动形象的解释:类似于拿了一把标尺画完图之后又把标尺放回了原位

这样就可以避免rotate()方法互相干扰

不然很有可能出现这种情况:

你会发现每次旋转时秒针会在时针分钟旋转的基础上再次旋转,本来只想每秒旋转6度的,但是由于指针间相互干扰直接旋转了半个钟面,连带着数字也一起旋转

所以在每次旋转时要记得在旋转前后加入save()和restore()方法保存和恢复画布的旋转状态。

代码:

         ctx.save();
ctx.rotate(angle*Math.PI/180);
ctx.fillRect(x,y,w,h);
ctx.restore();

  

部分资料转自:http://www.cnblogs.com/youryida/p/3487601.html

JavaScript中如何让图形旋转不会相互影响的更多相关文章

  1. HTML表格中各元素之间属性之间的相互影响

    开发了一个动态表格制作程序,用的是谷歌浏览器.发现几个现象,记录如下: 1.按照技术文档的说法,正规的表格样式如下: <table> <caption>标题</capti ...

  2. CSS3和javascript中的transform

    在javascript中,WebkitTransform 大概相当于 transform .transform 为标准,WebkitTransform 适用于Webkit浏览器.js中的WebkitT ...

  3. GL10控制图形旋转

    GL10提供了glRotatef(float  angle , float  x ,  float  y , float  z)方法,该方法用于控制旋转,该方法种angle控制旋转角度:而x.y.z参 ...

  4. Zend Studio 12.0.2正式版发布和破解方法,zend studio 12.0.1汉化,相式设置为Dreamweaver,空格缩进为4个, 代码默认不折叠的设置,Outline中使用的图形标志,代码颜色之eot设置。

    背景:zend studio 12.0.2 修复了一个12.0.1的:  Fixed problem with referenced variables marked as undefined,我都说 ...

  5. 【转】JavaScript中的constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  6. javascript中的“向量”

    什么是向量 向量通常指一个有长度有方向的量.向量使所有的移动和空间行为更容易理解和在代码中实现.向量可以相加,缩放,旋转,指向某物体. 在javascript中,一个方向和长度(即向量)在二维空间中可 ...

  7. Javascript 中 == 和 === 区别是什么?

    Javascript 中 == 和 === 区别是什么? 作者:Belleve链接:https://www.zhihu.com/question/31442029/answer/77772323来源: ...

  8. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  9. JavaScript中的工厂方法、构造函数与class

    JavaScript中的工厂方法.构造函数与class 本文转载自:众成翻译 译者:谢于中 链接:http://www.zcfy.cc/article/1129 原文:https://medium.c ...

随机推荐

  1. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  2. python网络爬虫实战之快速入门

    本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...

  3. SAP Smartforms打印输出条形码 及相关问题

    最近凭证打印需要附加打印条形码,遂做了一个小例子,结果还出现了很多的小问题,按领导的话说,这就是经验! 首先:SE73 -> 系统条形码 -> 更改 -> 创建 -> 选择 N ...

  4. while语句基本练习(求和思想,统计思想)

    A:循环结构while语句的格式: 初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; } B:执行流程: a:执行初始化语句 b:执行判断条件语句,看其返回值是true还是f ...

  5. 算法8-5:Prim算法

    Prim算法用于计算最小生成树.Prim算法分为两种,一种是懒汉式,一种是饿汉式. 懒汉式Prim 懒汉式Prim算法过程例如以下: 首先将顶点0增加到MST中 从MST与未訪问顶点之间边中选出最短的 ...

  6. Java面试宝典(7)混合2

    数据库 & XML & 流行的框架与新技术 & 软件工程与设计模式 & J2EE & EBJ & webservice & 其他 pageSiz ...

  7. C常量与变量

    /** * C中的常量与变量 * 常量的值在程序中是不可变化的,其在定义时必须给一个初始值 * 常量的定义方式: * 1.#define 定义宏常量 * 2.const 定义const常量 * 对于# ...

  8. data-*存数据,拿出ul li中的数据

    <ul class="questions"> <li> <div class="question">1.您的年龄是?< ...

  9. 关于UITableViewAutomaticDimension的产生的bug

      一.下面这句代码要想有作用 在iOS11之前需要适配,两个代理都需要实现 - (CGFloat)tableView:(UITableView *)tableView heightForHeader ...

  10. PHP 遍历数组for foreach while

    以下是使用foreach  while  for 三种循环展示遍历数组的概念 1:foreach( ) <?php $a = array('hank','mike','lucy'); forea ...