百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Canvas绘图之平移translate、旋转rotate、缩放scale

toyiye 2024-07-06 23:32 14 浏览 0 评论

画布操作介绍

画布绘图的环境通过translate,scale,rotate, setTransform和transform来改变,它们会对画布的变换矩阵产生影响。

函数方法描述
translatedx,dx转换的量的 X 和 Y 大小
scalesx,sy水平和垂直的缩放因子
rotateangle旋转的量,用弧度表示。正值表示顺时针方向旋转,负值表示逆时针方向旋转。
setTransforma,b,c,d,e,f水平缩放,水平倾斜(与旋转有关),垂直倾斜(与旋转有关,-水平倾斜),垂直缩放,水平移动,垂直移动
transforma,b,c,d,e,f水平缩放,水平倾斜,垂直倾斜,垂直缩放,水平移动,垂直移动

translate 方法为画布的变换矩阵添加水平的和垂直的偏移。参数 dxdy添加给后续定义路径中的所有点。

scale 方法为画布的当前变换矩阵添加一个缩放变换。缩放通过独立的水平和垂直缩放因子来完成。例如,传递一个值 2.0 和 0.5 将会导致绘图路径宽度变为原来的两倍,而高度变为原来的 1/2。指定一个负的 sx值,会导致 X 坐标沿 Y 轴对折,而指定一个负的sy会导致 Y 坐标沿着 X 轴对折。

rotate 方法通过指定一个角度,改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射,使得任意后续绘图在画布中都显示为旋转的。它并没有旋转 <Canvas> 元素本身。注意,这个角度是用弧度指定的。

setTransform 会将当前的变换矩阵重置为单位矩阵,然后构建新的矩阵。

transform 添加一个新的变换矩阵,再次绘制矩形,调用 transform 时,它都会在前一个变换矩阵上构建。

具体使用范例

我们在画布上绘制一个矩形。

 1 <!DOCTYPE html>
 2 <html>
 3 <body>
 4 
 5 <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
 6 Your browser does not support the HTML5 canvas tag.
 7 </canvas>
 8 
 9 <script>
10 
11 var c=document.getElementById("myCanvas");
12 var ctx=c.getContext("2d");
13 
14 ctx.fillStyle="yellow";
15 ctx.fillRect(0,0,250,100)
16 
17 </script>
18 
19 </body>
20 </html>

然后画出的图形如下图所示:绘制范围就是从坐标(0,0)开始画一个宽高分别为250,100的矩形。

下面对这个矩形进行平移,缩放,旋转等操作。

1 平移

如果往中间平移的话,我们可以改变它的坐标值例如ctx.fillRect(25,25,250,100),就将矩形起始位置移动到了(25,25)。绘制出的效果如下图:

另外还有一种方法,我们可以通过context的translate方法移动画布,来达到同样的视觉效果。未变换前画布的原点在左上角,使用translate方法后相当于整个坐标系在平移。

注:在操作画布变换矩阵时,最好在变换前使用save方法保存记录画布当前状态,完成绘制后可以使用restore方法恢复变换前的矩阵状态。

1 ctx.save;
2 ctx.translate(25,25);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(0,0,250,100)
5 ctx.restore;

2 缩放

缩放矩形当然可以通过调整宽高的方式这里不再举例说明。

这里主要介绍通过context的scale方法缩放画布的方法,通过以下代码就可以将黄色矩形所缩小到原来的一半(如下图)。

1 ctx.save;
2 ctx.scale(0.5,0.5);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(25,25,250,100);
5 ctx.restore;

3 旋转

旋转图中矩形,就需要把画布矩阵状态通过rotate方法变换下了。rotate(Math.PI/6)就是将画布顺时针旋转30度,画出的矩形如下图。

1 ctx.save;
2 ctx.rotate(Math.PI/6);
3 ctx.fillStyle="yellow";
4 ctx.fillRect(25,25,250,100)
5 ctx.restore;

4 确定中心点

通过图可以看出上面的缩放和旋转都是以画布左上角为中心进行的,如果我们需要以画布中心点为中心进行变换,需要在rotate和scale方法调用前去修正画布的坐标原点位置到画布占位的中心位置ranslate(width/2,height/2),然后进行缩放变换,之后再用ranslate(-width/2,-height/2)修正坐标系。如下代码:

1 ctx.save;
2 ctx.translate(width/2,height/2);//将画布坐标系原点移至中心
3 ctx.rotate(0.5,0.5);//如果是缩放,这里是缩放代码
4 ctx.translate(-width/2,-height/2);//修正画布坐标系
5 ctx.fillStyle="yellow";
6 ctx.fillRect(25,25,250,100)
7 ctx.restore;

效果如下图:

5 设置矩阵

方法setTransform的六个参数上面已经提到,其实可以理解为缩放、旋转、移动的复合方法。当您调用 setTransform 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面。

 1 var c=document.getElementById("myCanvas");
 2 var ctx=c.getContext("2d");
 3 
 4 ctx.fillStyle="yellow";
 5 ctx.fillRect(0,0,250,100)
 6 
 7 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);//两个1代表画布进行缩放,Math.PI/6表示顺时针旋转30度,(30,10)表示平移
 8 ctx.fillStyle="red";
 9 ctx.fillRect(0,0,250,100);
10 
11 ctx.setTransform(1,Math.PI/6,-Math.PI/6,1,30,10);
12 ctx.fillStyle="blue";
13 ctx.fillRect(0,0,250,100);

和setTransform类似的还有一个方法transform,它们都有六个参数。但是不同的是每次调用 transform 时,它都会在前一个变换矩阵上构建。如下代码中先绘制的红色矩形和上图的位置是一致的,画完红色矩形后,再次调用transform(1,Math.PI/6,-Math.PI/6,1,30,10)改变画布,这次变换是在当前画布状态上变换的所以画的蓝色矩形不会和红色的重叠。如下图看上去,红色和黄色的相对位置 与 蓝色和红色的相对位置 是一样的。

 1 var c=document.getElementById("myCanvas");
 2 var ctx=c.getContext("2d");
 3 
 4 ctx.fillStyle="yellow";
 5 ctx.fillRect(0,0,250,100)
 6 
 7 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
 8 ctx.fillStyle="red";
 9 ctx.fillRect(0,0,250,100);
10 
11 ctx.transform(1,Math.PI/6,-Math.PI/6,1,30,10);
12 ctx.fillStyle="blue";
13 ctx.fillRect(0,0,250,100);

对canvas绘图感兴趣的,还可以参看此博文http://www.cnblogs.com/fangsmile/p/5644611.html

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码