canvas学习18之canvas的旋转

复习上节内容:改变canvas圆心的位置

上一节中,我们学习了如何改变一个canvas的圆心,及改变后的坐标轴展现方式,我们现在来复习一下。

  • 改变canvas的圆心:使用translate(x,y)方法,我们可以改变canvas圆心的位置。x表示圆心在水平方向上的偏移量,y表示圆心在垂直方向的偏移量。

  • 改变圆心位置后的坐标轴展示方式。坐标轴垂直方向为y轴,原点以上为负,原点以下为正,x和我们日常生活中用到的一样。

学习:canvas的旋转

上节课我们学会了移动圆心的位置,这节课我们来学习,如何来将canvas进行旋转。

要将canvas进行旋转,我们需要用到一个新的方法,他叫rotate(angle), angle是旋转的弧度数,按顺时针方向旋转。

标重点js中弧度和角度的转换公式: 弧度 = (Math.PI/180) * 角度。角度 = 弧度 * (180/Math.PI)

下面,我们通过动手来切实学习ratate(angle)方法。

  • 首先,我们建立绘画上下文对象
```html
<canvas id="mycanvas" width="500" height="500"></canvas>
<script>
const canvas = document.getElementById('mycanvas')
const ctx = canvas.getConText('2d')
</script>
```
  • 接下来,为了方便演示canvas的旋转,利用上节学习过的移动canvas原点的方法,我们把原点水平和垂直各移动250个单位,移动到canvas正中间。

    <canvas id="mycanvas" width="500" height="500"></canvas>
    <script>
      const canvas = document.getElementById('mycanvas')
      const ctx = canvas.getConText('2d')
      ctx.translate(250,250) 
    </script>
    
  • 接下来,在没有旋转的x轴正半轴上,我们画一条线,标出未旋转前的x轴位置,并将此状态保存。这里,我们复习了之前用到的很多知识点哦,请注意复习。

    <canvas id="mycanvas" width="500" height="500"></canvas>
    <script>
      const canvas = document.getElementById('mycanvas')
      const ctx = canvas.getConText('2d')
      ctx.translate(250,250) 
      ctx.beginPath()
      ctx.strokeStyle = 'green'
      ctx.moveTo(0,0)
      ctx.lineTo(200, 0)
      ctx.fillText('没旋转前', 50, 0)
      ctx.stroke()
      ctx.closePath()
      ctx.save()
    </script>
    
  • 最后,我们使用rotate(angle)来旋转canvas,并且每次旋转后都将x轴正半轴的位置标出来。为了使标出来的线不至于很凌乱,我们每隔30度旋转一下,标出从0到360的12条线来。在这个过程中,我们使用了状态的恢复和保存,角度弧度的转换,记得复习。

<canvas id="mycanvas" width="500" height="500"></canvas>
<script>
  const canvas = document.getElementById('mycanvas')
  const ctx = canvas.getConText('2d')
  ctx.translate(250,250) 
  ctx.beginPath()
  ctx.strokeStyle = 'green'
  ctx.moveTo(0,0)
  ctx.lineTo(200, 0)
  ctx.fillText('没旋转前', 50, 0)
  ctx.stroke()
  ctx.closePath()
  ctx.save()
  for (let i = 0; i <= 12; i++) {
    let jiaodu = 30 * i
    let ratateAngle = (Math.PI / 180) * jiaodu
     ctx.restore() // 将canvas恢复到未旋转前的状态
     ctx.save() // 保存未旋转前的状态
    ctx.rotate(ratateAngle)
    ctx.beginPath()
    ctx.strokeStyle = '#e74478'
    ctx.moveTo(0,0)
    ctx.lineTo(200, 0)
    ctx.fillText('旋转' + jiaodu , 20 + 12 * i, 0)
    // ctx.font = '20px sans-serif'
    ctx.stroke()
    ctx.closePath()
}
</script>

到这里,我们完成了canvas的每隔30度一个旋转,将canvas旋转360度的工程。效果图如下

canvas旋转

可以点击这里查看具体实例,自己进行修改操作,可以自己尝试一下,如果不用状态恢复保存的方法,如何将360度都画出来。

我们可以看到,在旋转的过程中,x轴发生了相应的变化。最后旋转前,和360度重合在了一起。

查看原文

版权声明:本文为zhangxiaochunxy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangxiaochunxy/article/details/105191674

智能推荐

canvas学习

今天有空实践写了个扇形图,有需要的借鉴。比较难一点的是如何在图形中画字,运用了极坐标系。还有画扇形的时候,为了简化代码,我使用了循环复用。其次如果想封装也没有问题!...

【JUC】004-ReadWriteLock读写锁

目录 一、ReadWriteLock读写锁 1、概述 官方文档介绍: 2、问题引出 代码实现: 运行结果: 问题: 3、使用读写锁 代码实现: 运行结果: 4、分析 一、ReadWriteLock读写锁 1、概述 官方文档介绍: 读可以多个线程读,写只能一个线程写;   2、问题引出 代码实现: 运行结果: 问题: 出现了多线程不安全的问题,我们要实现的是“读可以多个线程读,...

Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  通常,这类需求在客户端应用中不太会用到,但是在后端的各种统计分析模块会经常碰到。比如:通过折线图、柱状图、雷达图等可视化形式,更直观的展现和分析经营状况或系统运行情况。这里我们将引入的数据可视化组件库 ECharts来帮助我们完成这样的任务。 ECharts简介 ECharts是百度开源的一个前端组件。它是一个使用 J...

Java数据结构和算法之环形队列

实现原理: 代码实现: 总结: 思路并不太难,主要是理解rear和front相等时歧义的消除。如果对为什么每次移动rear和front都 取模以及判断有效值个数的时候的取模等操作不太理解,就画图看下,你就懂了。...

前端打印页面window.print(),会把页面把A标签里面的href属性也给打印出来解决办法

一、问题描述: 大家都知道用window.print()可以实现调用浏览器的打印功能从而打印系统页面 但是直接用window.print()会把A标签里面的href属性也给打印出来了,如下图所示   二、解决办法 解决办法也很简单,只要加上如下css代码就可以啦 三、最后对自己说的  做梦也没想到自己也能有30个粉丝,有的文章还被人收藏了,嘻嘻嘻,超开心啊!  虽然我...

猜你喜欢

kubernetes 资源清单 initC

编写配置验证initC 编写 init-pod.yaml文件 执行init-pod.yaml文件 查看Pod创建的具体运行状态 这里可能会有无用pod干扰 建议先删除无用pod 查看Pod初始化日志 编写myservice.yaml文件 执行myservice.yaml文件 再次查看pod状态 编写mydb.yaml文件 执行mydb.yaml文件 再次查看Pod状态 学习笔记来源。1 尚硅谷ku...

idea部署远程主机姿势

希望有一天大家都能在借鉴中创新 关键词: 接口服务;自动部署;快速开发 主题: 对于前后端分离的项目往往需要在开发完成一个迭代周期的时候更新部署的服务,常规的操作往往是:clean -> package -> xshell -> sftp -> start。 简单的项目往往每天都需要进行这种操作N次,如果开发支持jenkins环境,可以配置自动脚本进行打包部署,甚至是完成各...

3.4 CNN卷积神经网络基础知识-ReLU**函数(百度架构师手把手带你零基础实践深度学习原版笔记系列)

3.4 CNN卷积神经网络基础知识-ReLU**函数(百度架构师手把手带你零基础实践深度学习原版笔记系列)   ReLU**函数 前面介绍的网络结构中,普遍使用Sigmoid函数做**函数。在神经网络发展的早期,Sigmoid函数用的比较多,而目前用的较多的**函数是ReLU。这是因为Sigmoid函数在反向传播过程中,容易造成梯度的衰减。让我们仔细观察Sigmoid函数的形式...

在 AWS上域名备案流程和文件

AWS北京地区是由 光环新网运营,所以 aws 北京地区 ICP 备案 需要提交资料到 光环新网 ,由 光环新网 公司审核后才可以。 备案流程 第一步 请您将注册 AWS 云业务 Account ID 的截图发送至 光环新网 邮箱,具体样式请参见下图。光环新网 需要据此截图进行核对。 1、如果您有一个 Account ID ,请提供对应的 Account ID 2、如果您有多个 Account I...

官方重磅!国产统一操作系统 UOS 20 正式版发布

公众号关注 “GitHubDaily” 设为 “星标”,带你了解圈内新鲜事! 来源:统信软件 官方重磅! 统一操作系统 UOS 正式版面向合作伙伴发布! 统一操作系统是由统信软件开发的一款基于 Linux 内核的操作系统,支持龙芯、飞腾、兆芯、海光、鲲鹏等芯片平台的笔记本、台式机、一体机和工作站,以及服务器。统一桌面操作系统以桌面应用场景为...