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. 浅谈PHP的Public、Protected、Private三种方法的区别

    public:权限是最大的,可以内部调用,实例调用等.protected: 受保护类型,用于本类和继承类调用.private: 私有类型,只有在本类中使用. <?php error_report ...

  2. 【语义分割】large kernel matters中GCN模块的pytorch实现

    GCN模块的实现比较简单,在giuhub上看到两种实现,轻微不同 实现一:https://github.com/ycszen/pytorch-segmentation/blob/master/gcn. ...

  3. Android 给app加入百度地图

    1.获取sha1值 (1)win+R进入cmd窗口 (2)输入以下代码 C:\SoftApplication\javajdk\jdk1.8.0_151\bin>keytool -list -v ...

  4. 清华集训2017D2T1 小 Y 和地铁(metro)

    题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...

  5. 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】

    大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...

  6. bugzilla配置邮箱发送邮件问题

    2018-09-25 1.bugzilla注册账号,邮件无法发送 需要登录管理账号,配置邮箱服务 2.Can't locate object method "quit" via p ...

  7. Win32 进程间通信的分析与比较

    1 进程与进程通信 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线 程是Windows操作系统的一个基本特征.M ...

  8. [转]创建节约内存的JavaBean

    转自:创建节约内存的JavaBean 如果编写节约内存的java对象 编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑.但是殊不知, ...

  9. jsoup: Java HTML Parser

    jsoup  Java HTML Parser jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于j ...

  10. Android报错

      Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process. ...