1.translate(x,y):平移

将画布的坐标原点向左右方向移动x,向上下方向移动y.canvas的默认位置是在(0,0).
  例子:画布原点假如落在(1,1),那么translate(10,10)就是在原点(1,1)基础上分别在x轴、y轴移动10,则原点变为(11,11)。
2.scale(x,y):扩大

x为水平方向的放大倍数,y为竖直方向的放大倍数。
3.rotate(angel):旋转

angle指旋转的角度,顺时针旋转。
4.transform():切变

所谓切变,其实就是把图像的顶部或底部推到一边。

第一条很好理解,就是要明确顺序。

canvas的转换不是针对整个canvas的,而是针对调用转换方法之后绘制的shapes 或 paths。如下:

context.rotate(45 * Math.PI/180);
context.fillRect(50, 50, 50, 50);

顺序很重要,反了就没有旋转的效果了。

第二条,转换的时候,需要把转换的中心点移到shape的自身的中心,不然的话,请看下面这个例子(浅蓝色部分表示canvas):

context.fillRect(50, 50, 50, 50);

这是没有转换的效果,接着来看旋转45°的效果:

context.rotate(45 * Math.PI/180);
context.fillRect(50, 50, 50, 50);

可以看出,旋转的中心是canvas的左上角(scale()的中心也是左上角),也就是点(0,0),但是通常我们需要的是围绕自己的中心进行旋转,所以就有了第二条。

==========================================================================================

下面说说怎么移动中心点

假如fillRect(50, 50, 50, 50),那么这个矩形的中心点是(x + width/2, y + height/2),即(75, 75)。

上面刚说了,旋转的中心是canvas的左上角,我们要做的就是把(0, 0)移到(75, 75)的位置。

canvas的translate()方法可以使坐标系统的原点向上下左右移动。这正是我们需要的!

context.translate(x + width/2, y + height/2);

好了,中心点处理完了,还记得上面的第一条不,切记顺序,现在该画矩形了,fillRect()的参数 x 和 y 现在是什么呢?

调用translate()之后,整个坐标系统都平移了,所以我们之前的fillRect(50, 50, 50, 50),矩形的左上角不再是(50, 50)了,而是(-0.5 * width, -0.5 * height);

context.fillRect(-0.5 * width, -0.5 * height);

==========================================================================================

再说下scale(),如果我们需要放大1倍,即 scale(2, 2); 刚才也说了,缩放的中心点默认也是canvas的左上角,所以我们还是要进行坐标平移:

context.translate(x + width/2, y + height/2);
context.scale(2, 2);

接着画矩形,这里很容易出现幻觉,好像要画一个放大1倍后的矩形,其实不用的,该怎么画还是怎么画:

context.fillRect(50, 50, 50, 50);

例子:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>马尾图案</title>
</head>
<body>
<div class="container">
<canvas id="myCanvas" width="300" height="300" >
Your browser does not support the canvas element.
</canvas>
</div>
<script>
window.onload=function(){
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
context.translate(160,30);//平移
context.fillStyle='rgba(120,93,222,0.25)';//填充
context.fillRect(0,0,100,50) for(var i=0;i<50;i++){
context.translate(25,25);//平移
context.scale(0.95,0.95);//扩大。所有的方法包括扩大,他们的对象都是针对后面要画出的图形,而非canvas画布。因此后面的fillRecr函数画的矩形的宽仍然是100,高仍然是50.这里相当于把这个矩形扩大为原来的0.95倍。
context.rotate(Math.PI/10);//旋转。
context.fillRect(0,0,100,50);//画矩形 这里仍然是画(0,0,100,50)
}
} </script> </body>
</html>

马尾图案之canvas的translate、scale、rotate的方法详解的更多相关文章

  1. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  2. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  3. android canvas中rotate()和translate()两个方法详解

    rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示 ...

  4. HTML canvas中translate()与rotate()的理解

    首先,当我们在页面上初始化canvas时,相当于在上面放了一块画布,这块画布我们可以理解为上面有一个坐标系(如下图),左上角是原点,往右是X轴的正方向,往下是Y轴的正方向,我们在画布上绘制的内容都是基 ...

  5. HTML5新增Canvas标签及对应属性、API详解(基础一)

    知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一.标签 ...

  6. CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解

    一.前言    IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...

  7. CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解[转]

    一.前言    IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...

  8. html5的canvas绘制线条,moveTo和lineTo详解

    今天在看html5,里面新增的属性有一个canvas,它相当于一个画布你可以用js在里面画你想要的效果!我在w3c的手册里面看到用moveTo和lineTo绘制线条讲的不是很清楚,尤其是moveTo和 ...

  9. 闭包在python中的应用,translate和maketrans方法详解

    python对字符串的处理是比较高效的,方法很多.maketrans和translate两个方法被应用的很多,但是具体怎么用常常想不起来. 让我们先回顾下这两个方法吧: 1.s.translate(t ...

随机推荐

  1. Web项目测试流程总结

    个人知识脑图总结 - 未完全(工作项目脑图总结存于网盘中)

  2. Javascript——数据类型 和 注释

    数据类型:JavaScript中包括如下7种数据类型:字符串.数字.布尔.数组.对象.null.undefined 字符串: 注意:字符串类型的数据需要使用单引号或双引号引起来. 数字: 注意:Jav ...

  3. 解决VS2005打开js,css,asp.php等文件,中文都是乱码的问题

    用记事本打开可以正常观看但是用VS2005编辑器打开JS,中文确实乱码. 解决办法:在VS 2005 的设置里面选择自动检测Utf-8:“工具”->“选项”->“文本编辑器”->“自 ...

  4. 题解 P2661 【信息传递】

    首先介绍个概念:基环外向树,也叫环加外向树,环基树,章鱼图. 这就是一颗基环外向树. 不难发现,若基环外向树有n个结点就有n条边,这也意味 着它不是颗普通的树,而是必定有一个自环. 再看看题目中的介绍 ...

  5. 向PHP发送HTTP-Post请求

    欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti 1.post.html <!DOCTYPE html> <html lang=&q ...

  6. upload上传 和 download下载

    文件上传:   <div class="upload-form"> <input id="fileUpload" type="fil ...

  7. CSS总结六:动画(一)ransition:过渡、animation:动画、贝塞尔曲线、step值的应用

    transition-property transition-duration transition-timing-function transition-delay animation-name a ...

  8. spket IDE插件更新地址

    http://www.agpad.com/update spket  IDE插件更新地址

  9. 前端入门Js笔记

    T 001 ____________--信息页面展示 需求分析: 有一个页面,在页面上有很多文字信息,且格式不一. 技术分析: html: 文字标签: 字体标签: 标题标签: 其他标签: 排版标签: ...

  10. IPC之mq_sysctl.c源码解读

    // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) 2007 IBM Corporation * * Author: Cedric ...