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的更多相关文章

  1. 软件项目技术点(2)——Canvas之坐标系转换

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为 ...

  2. 软件项目技术点(2)——Canvas之获取Canvas当前坐标系矩阵

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操 ...

  3. 软件项目技术点(8)—— canvas调用drawImage绘制图片

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...

  4. 二维坐标的平移,旋转,缩放及matlab实现

    本文结合matlab 软件解释二维坐标系下的平移,旋转,缩放 首先确定点在二维坐标系下的表达方法,使用一个1*3矩阵: Pt = [x,y,1] 其中x,y 分别为点的X,Y坐标,1为对二维坐标的三维 ...

  5. 【转载】Unity中矩阵的平移、旋转、缩放

    By:克森 简介 在这篇文章中,我们将会学到几个概念:平移矩阵.旋转矩阵.缩放矩阵.在学这几个基本概念的同时,我们会用到 Mesh(网格).数学运算.4x4矩阵的一些简单的操作.但由于克森也是新手,文 ...

  6. threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

  7. 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...

  8. 软件项目技术点(5)——在canvas上绘制动态网格线

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 grid类的实现 当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果. 下面是具体实现的代码,draw函数里计算出大 ...

  9. 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 我们创建一个类封装了所有鼠标需要处理的事件. export class MouseEventInfo { el: HTMLElemen ...

随机推荐

  1. JDBC_批处理Batch_插入2万条数据的测试

    批处理   Batch 对于大量的批处理,建议使用Statement,因为PreparedStatement的预编译空间有限,当数据特别大时,会发生异常. import java.sql.Connec ...

  2. 使用SWig出现调用异常的情况

    未经处理的异常:  System.TypeInitializationException: "Win32Project1PINVOKE"的 类型初始值设定项引发异常. ---> ...

  3. Nginx+certbot 实现泛域名的https证书

    yum -y install git git clone  https://github.com/certbot/certbot cd certbot ./certbot-auto certonly ...

  4. zTree学习笔记

    一.zTree的下载 官网:http://www.treejs.cn/v3/main.php#_zTreeInfo 解压后的目录结构为: 二.zTree入门案例 2.1 在页面中引入相关文件 要使用z ...

  5. 不带 www 跳转 到 带 www 网站..

    IIS: <rule name="已导入的规则 1-1" stopProcessing="true"> <match url="^( ...

  6. C#工具类之XmlNode扩展类

    using System; using System.Linq; using System.Xml; /// <summary> /// XmlNodeHelper /// </su ...

  7. C++ GUI Qt4编程(07)-3.1menu

    1. C++ GUI Qt4编程第三章,添加menu菜单. 2. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include < ...

  8. http请求报头和响应报头(1)

    1.web端不可避免的http缓存机制,要理解缓存机制,先来了解下http的请求报文和响应报文的内容 2.请求报文  2.1请求行    请求行三部分组成:请求方法.URL以及版本协议 请求的方法有G ...

  9. python_学生信息管理实例

    """提示:代码中的内容均被注释,请参考,切勿照搬""" """注意:代码切勿照搬,错误请留言指出" ...

  10. sqlplus连接oracle语法

    sqlplus文件在product\11.2.0\dbhome_1\BIN目录下. 连接语法:用户名/密码@ip/服务名