canvas一些小知识记录
最近在做canvas相关的功能,遇到了一些问题,写这篇文章记录一下自己对canvas不熟悉的一些知识点
1. canvas旋转
canvas旋转画笔,可以使用rotate方法,rotate方法是绕着中心点旋转的,中心点默认是左上角的(0,0)位置,可以使用translate方法改变旋转的中心点,下面介绍两种方法旋转,可以根据自己的需求使用,关键是理解旋转的原理
1.旋转方法1
此种方法是,先将中心点平移到矩形中心,接着旋转,再将中心点平移回原点(0, 0),按照之前的位置和大小绘制即为绕中心旋转后的图形,此种方法,在还原之前,绘制的东西都会绕着调用rotate的位置旋转
<html> <head> <meta charset="utf-8" /> <title>canvas绕中心旋转</title> <style> canvas { border: 1px solid #ddd; } </style> </head> <body> <canvas id="canvas" width="600" height="800"></canvas> <script> let canvas = document.getElementById('canvas'); let ctx = canvas.getContext('2d'); let width = canvas.width; let height = canvas.height; // 矩形的参数 const x = 100; const y = 100; const rectWidth = 400; const rectHeight = 200; // 绘制旋转前的矩形 var grd = ctx.createLinearGradient(100, 100, 500, 100); grd.addColorStop(0, "red"); grd.addColorStop(1, "blue"); ctx.fillStyle = grd; ctx.fillRect(x, y, rectWidth, rectHeight); // 计算出矩形中心点的位置 let tx = x + rectWidth / 2; let ty = y + rectHeight / 2; // 先平移到中心点 ctx.translate(tx, ty); // 旋转90度 ctx.rotate(Math.PI / 2); // // 渐变的位置也要改 // var grd = ctx.createLinearGradient(-rectWidth / 2, -rectHeight / 2, rectWidth / 2, rectHeight / 2); // grd.addColorStop(0, "red"); // grd.addColorStop(1, "blue"); // ctx.fillStyle = grd; // // 绘制旋转后的矩形,要注意,此时中心点为矩形中心,所以左上角坐标要重新计算,不是之前的x和y // ctx.fillRect(-rectWidth / 2, -rectHeight / 2, rectWidth, rectHeight); // // 重新旋转 // ctx.rotate(-Math.PI / 2); // 再平移回原点 ctx.translate(-tx, -ty); // 绘制旋转后的图形 ctx.fillRect(x, y, rectWidth, rectHeight); // 重新还原旋转的角度,避免下次绘制出现问题 ctx.translate(tx, ty); ctx.rotate(-Math.PI / 2); ctx.translate(-tx, -ty); </script> </body> </html>
2. 旋转方法2
此种方法是,先将中心点平移到矩形中心,接着旋转,绘制,再还原回原来的状态,此种方法是在绘制好之后再还原,但是绘制的位置和距离等都需要重新计算
<html> <head> <meta charset="utf-8" /> <title>canvas绕中心旋转</title> <style> canvas { border: 1px solid #ddd; } </style> </head> <body> <canvas id="canvas" width="600" height="800"></canvas> <script> let canvas = document.getElementById('canvas'); let ctx = canvas.getContext('2d'); let width = canvas.width; let height = canvas.height; // 矩形的参数 const x = 100; const y = 100; const rectWidth = 400; const rectHeight = 200; // 绘制旋转前的矩形 var grd = ctx.createLinearGradient(100, 100, 500, 100); grd.addColorStop(0, "red"); grd.addColorStop(1, "blue"); ctx.fillStyle = grd; ctx.fillRect(x, y, rectWidth, rectHeight); // 计算出矩形中心点的位置 let tx = x + rectWidth / 2; let ty = y + rectHeight / 2; // 先平移到中心点 ctx.translate(tx, ty); // 旋转90度 ctx.rotate(Math.PI / 2); // 渐变的位置要改 var grd = ctx.createLinearGradient(-rectWidth / 2, -rectHeight / 2, rectWidth / 2, rectHeight / 2); grd.addColorStop(0, "red"); grd.addColorStop(1, "blue"); ctx.fillStyle = grd; // 绘制旋转后的矩形,要注意,此时中心点为矩形中心,所以左上角坐标要重新计算,不是之前的x和y ctx.fillRect(-rectWidth / 2, -rectHeight / 2, rectWidth, rectHeight); // 重新旋转 ctx.rotate(-Math.PI / 2); // 再平移回原点 ctx.translate(-tx, -ty); </script> </body> </html>
相关推荐
大地飞鸿 2020-11-12
星星有所不知 2020-10-12
jinxiutong 2020-07-26
MIKUScallion 2020-07-05
songfens 2020-07-05
songfens 2020-06-11
songfens 2020-06-08
northwindx 2020-05-31
northwindx 2020-05-31
northwindx 2020-05-27
northwindx 2020-05-25
MIKUScallion 2020-05-25
jinxiutong 2020-05-10
xdyangxiaoromg 2020-05-10
大地飞鸿 2020-05-06
northwindx 2020-04-25