软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale
AxeSlide软件项目梳理 canvas绘图系列知识点整理
画布操作介绍
画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响。
函数 | 方法 | 描述 |
translate | dx,dx | 转换的量的 X 和 Y 大小 |
scale | sx,sy | 水平和垂直的缩放因子 |
rotate | angle | 旋转的量,用弧度表示。正值表示顺时针方向旋转,负值表示逆时针方向旋转。 |
setTransform | a,b,c,d,e,f | 水平缩放,水平倾斜(与旋转有关),垂直倾斜(与旋转有关,-水平倾斜),垂直缩放,水平移动,垂直移动 |
transform | a,b,c,d,e,f | 水平缩放,水平倾斜,垂直倾斜,垂直缩放,水平移动,垂直移动 |
translate() 方法为画布的变换矩阵添加水平的和垂直的偏移。参数 dx 和 dy 添加给后续定义路径中的所有点。
scale() 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx 值,会导致 X 坐标沿 Y 轴对折,而指定一个负的sy 会导致 Y 坐标沿着 X 轴对折。
rotate() 方法通过指定一个角度,改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射,使得任意后续绘图在画布中都显示为旋转的。它并没有旋转 <Canvas> 元素本身。注意,这个角度是用弧度指定的。
setTransform() 会将当前的变换矩阵重置为单位矩阵,然后构建新的矩阵。
transform() 添加一个新的变换矩阵,再次绘制矩形,调用 transform() 时,它都会在前一个变换矩阵上构建。
具体使用范例
我们在画布上绘制一个矩形。
<!DOCTYPE html>
<html>
<body> <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.
</canvas> <script> var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d"); ctx.fillStyle="yellow";
ctx.fillRect(0,0,250,100) </script> </body>
</html>
然后画出的图形如下图所示:绘制范围就是从坐标(0,0)开始画一个宽高分别为250,100的矩形。
下面对这个矩形进行平移,缩放,旋转等操作。
1 平移
如果往中间平移的话,我们可以改变它的坐标值例如ctx.fillRect(25,25,250,100),就将矩形起始位置移动到了(25,25)。绘制出的效果如下图:
另外还有一种方法,我们可以通过context的translate方法移动画布,来达到同样的视觉效果。未变换前画布的原点在左上角,使用translate方法后相当于整个坐标系在平移。
注:在操作画布变换矩阵时,最好在变换前使用save方法保存记录画布当前状态,完成绘制后可以使用restore方法恢复变换前的矩阵状态。
ctx.save();
ctx.translate(25,25);
ctx.fillStyle="yellow";
ctx.fillRect(0,0,250,100)
ctx.restore();
2 缩放
缩放矩形当然可以通过调整宽高的方式这里不再举例说明。
这里主要介绍通过context的scale方法缩放画布的方法,通过以下代码就可以将黄色矩形所缩小到原来的一半(如下图)。
ctx.save();
ctx.scale(0.5,0.5);
ctx.fillStyle="yellow";
ctx.fillRect(25,25,250,100);
ctx.restore();
3 旋转
旋转图中矩形,就需要把画布矩阵状态通过rotate方法变换下了。rotate(Math.PI/6)就是将画布顺时针旋转30度,画出的矩形如下图。
ctx.save();
ctx.rotate(Math.PI/6);
ctx.fillStyle="yellow";
ctx.fillRect(25,25,250,100)
ctx.restore();
4 确定中心点
通过图可以看出上面的缩放和旋转都是以画布左上角为中心进行的,如果我们需要以画布中心点为中心进行变换,需要在rotate和scale方法调用前去修正画布的坐标原点位置到画布占位的中心位置ranslate(width/2,height/2),然后进行缩放变换,之后再用ranslate(-width/2,-height/2)修正坐标系。如下代码:
ctx.save();
ctx.translate(width/2,height/2);//将画布坐标系原点移至中心
ctx.rotate(0.5,0.5);//如果是缩放,这里是缩放代码
ctx.translate(-width/2,-height/2);//修正画布坐标系
ctx.fillStyle="yellow";
ctx.fillRect(25,25,250,100)
ctx.restore();
效果如下图:
5 设置矩阵
方法setTransform的六个参数上面已经提到,其实可以理解为缩放、旋转、移动的复合方法。当您调用 setTransform() 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面。
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d"); ctx.fillStyle="yellow";
ctx.fillRect(0,0,250,100) ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);//两个1代表画布进行缩放,Math.PI/6表示顺时针旋转30度,(30,10)表示平移
ctx.fillStyle="red";
ctx.fillRect(0,0,250,100); ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);
ctx.fillStyle="blue";
ctx.fillRect(0,0,250,100);
和setTransform类似的还有一个方法transform(),它们都有六个参数。但是不同的是每次调用 transform() 时,它都会在前一个变换矩阵上构建。如下代码中先绘制的红色矩形和上图的位置是一致的,画完红色矩形后,再次调用transform(1,Math.PI/6,-Math.PI/6,1,30,10)改变画布,这次变换是在当前画布状态上变换的所以画的蓝色矩形不会和红色的重叠。如下图看上去,红色和黄色的相对位置 与 蓝色和红色的相对位置 是一样的。
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d"); ctx.fillStyle="yellow";
ctx.fillRect(0,0,250,100) ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
ctx.fillStyle="red";
ctx.fillRect(0,0,250,100); ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
ctx.fillStyle="blue";
ctx.fillRect(0,0,250,100);
对canvas绘图感兴趣的,还可以参看此博文 http://www.cnblogs.com/fangsmile/p/5644611.html
软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale的更多相关文章
- 软件项目技术点(2)——Canvas之坐标系转换
AxeSlide软件项目梳理 canvas绘图系列知识点整理 默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为 ...
- 软件项目技术点(2)——Canvas之获取Canvas当前坐标系矩阵
AxeSlide软件项目梳理 canvas绘图系列知识点整理 前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操 ...
- 软件项目技术点(8)—— canvas调用drawImage绘制图片
AxeSlide软件项目梳理 canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...
- 二维坐标的平移,旋转,缩放及matlab实现
本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...
- 【转载】Unity中矩阵的平移、旋转、缩放
By:克森 简介 在这篇文章中,我们将会学到几个概念:平移矩阵.旋转矩阵.缩放矩阵.在学这几个基本概念的同时,我们会用到 Mesh(网格).数学运算.4x4矩阵的一些简单的操作.但由于克森也是新手,文 ...
- threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸
这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...
- 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移
AxeSlide软件项目梳理 canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...
- 软件项目技术点(5)——在canvas上绘制动态网格线
AxeSlide软件项目梳理 canvas绘图系列知识点整理 grid类的实现 当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果. 下面是具体实现的代码,draw函数里计算出大 ...
- 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布
AxeSlide软件项目梳理 canvas绘图系列知识点整理 我们创建一个类封装了所有鼠标需要处理的事件. export class MouseEventInfo { el: HTMLElemen ...
随机推荐
- 【python】10分钟教你用python一行代码搞点大新闻
准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python. ...
- [SCOI2007]最大土地面积(旋转卡壳)
首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...
- c#优秀文章
文件传输示例]C# WinForm WebSocket (非浏览器):http://bbs.cskin.net/thread-4431-1-1.html NanUI for Winform发布,让Wi ...
- mysql5.6 的st_distance 实现按照距离远近排序。
当前所处在的位置(113.858202 , 22.583819 ),需要查询我附近1000米内的小区,并安装由近到远的顺序排列 SELECT s.id,s.name,s.lng,s.lat, rou ...
- CMM模型,结构化开发方法和面向对象开发方法的比较,UML(统一建模语言),jackson开发方法
CMM模型 一.CMM简介 CMM,英文全称为Capability Maturity Model for Software,即:软件成熟度模型. CMM的核心是把软件开发视为一个过程.它是对于软件在定 ...
- FLUENT 流体计算应用教程
温正 清华大学出版 2013.1 子谓颜渊曰,用之则行,舍之则藏,惟我与尔有是夫! 非常合适的一本书. ...
- SSH 项目建立过程
1. 加入 Spring 1). 加入 jar 包 2). 配置 web.xml 文件 <context-param> <param-name>contextConfigLoc ...
- Oracle分析函数系列之first_value/last_value:在记录集中查找第一条记录和最后一条记录
[转自] http://blog.csdn.net/rfb0204421/article/details/7675911 注意:与max,min的区别,虽然也可以实现,但只是针对数字字段. 1.初始化 ...
- Oracle 查看表结构视图
-- 创建视图 CREATE VIEW VIEW_TABLEASSELECT A.TABLE_NAME, A.column_name 字段名,A.data_type 数据类型,A.data_lengt ...
- PIE SDK存储格式转换
1.算法功能简介 影像存储格式转换可以实现栅格数据存储格式的自由转换,其中存储格式可以是 BSQ. BIP. BIL 三种格式. 遥感数字图像数据的存储与分发,通常采用以下三种数据格式: BSQ( ...