HTml5 Canvas 整理笔记之图形变换

先提出:为啥要图形变换?
先回答:对图形的变化不单单是单纯的“迎合”视觉,更大的用处在于代码的复用,绘制完基础图形之后,可以调用它进行复用,单纯的复用是不是很单调,通过图形变换则使画面更加精彩,比如你只画了一个树,起就能通过代码复用加图形变换拥有一片绚丽的森林。

进入主题

1.位移translate(x,y)

默认坐标的(0,0)点是画布(canvas)的左上定点,你画图形和曲线的是以它为基准,translate()的功能就是改变图形的基准点((0,0)点),这样你能平移所画的东西。

2.缩放scale(sx,sy)

sx:在横向缩放比例
sy:纵向缩放比例

对于位移和缩放给出下面代码做示例:

<canvas id="tails" width=400 height=600 style="border: 1px slateblue dashed;display: block;margin: 50px auto;">
            <script>
                var canvas = document.getElementById("tails");
                var context = canvas.getContext('2d');
                //画文字
                context.textAlign="center";
                context.fillStyle="green";
                context.font="bold 50px Arial";
                context.fillText("Happy Trails!",200,50);
                //先画个小树
                DrawTreen(context,1,1,130, 250);

                //再画一个大树
                DrawTreen(context,1.4,1.4,200,500);
                context.save();
                context.translate(-10, 350);
                context.beginPath();
                context.moveTo(0, 0);
                context.quadraticCurveTo(170, -50, 260, -190);
                context.quadraticCurveTo(310, -250, 410, -250);
                context.strokeStyle = 'chocolate';
                context.lineWidth = 20;
                context.stroke();
                context.restore();
                //画树函数
                function DrawTreen(context,x1,y1,x2,y2) {

                    DrawShadow(context,x1,y1,x2,y2);
                    context.save();
                    context.translate(x2,y2);
                    context.scale(x1,y1);
                    context.shadowBlur = 14;
                    context.beginPath();
                    context.moveTo(-25, -50);
                    context.lineTo(-10, -80);
                    context.lineTo(-20, -80);
                    context.lineTo(-5, -110);
                    context.lineTo(-15, -110);
                    context.lineTo(0, -140);
                    context.lineTo(15, -110);
                    context.lineTo(5, -110);
                    context.lineTo(20, -80);
                    context.lineTo(10, -80);
                    context.lineTo(25, -50);
                    context.closePath();
                    context.fillStyle = 'green';
                    context.fill();
                    context.fillStyle = 'black'
                    context.fillRect(-5, -50, 10, 50);
                    context.stroke();
                    context.restore();
                }
                //画阴影
                function DrawShadow(context,x1,y1,x2,y2){
                    context.save();
                    context.translate(x2,y2);
                    context.scale(x1,y1);
                    context.transform(1, 0, -0.5, 0.6, 0, 0)
                    context.beginPath();
                    context.moveTo(-25, -50);
                    context.lineTo(-10, -80);
                    context.lineTo(-20, -80);
                    context.lineTo(-5, -110);
                    context.lineTo(-15, -110);
                    context.lineTo(0, -140);
                    context.lineTo(15, -110);
                    context.lineTo(5, -110);
                    context.lineTo(20, -80);
                    context.lineTo(10, -80);
                    context.lineTo(25, -50);
                    context.closePath();
                    context.fillStyle = 'rgba(0, 0, 0,0.3)';
                    context.fill();
                    context.fillStyle = 'rgba(0, 0, 0, 0.3)'
                    context.fillRect(-5, -50, 10, 50);
                    //                  context.stroke();
                    context.restore();
                }
            </script>
        </canvas>

结果如下:

这里写图片描述

3.旋转rotate(deg)

旋转就是绕基准点((0,0)点)旋转特定角度,至于可以做什么自己可以思考,你如时钟的刻度,动态的旋转某一物体等。

温馨提醒Cavans的保存和恢复:

save()
restore()
它们(要配对使用,最好要养成习惯,反正加了没有坏处)的作用就是对图形变换状态的保存和恢复,因为在有些情况下你会做很多图形变换,translate(x,y) 、scale(sx,sy)、rotate(deg)会有叠加现象(会相互影响)。

如下:

代码:
这里写图片描述

没加 save()和restore()之前

这里写图片描述

加 save()和restore()之后

这里写图片描述

4.transform(a,b,c,d,e,f)

这里写图片描述

原图

这里写图片描述

水平缩为原来的0.5倍

这里写图片描述

这里写图片描述

使用settransform可以避免叠加,相当于重新开始set一遍

设置setTransform之前

这里写图片描述

这里写图片描述

替换为setTransform之后

这里写图片描述

这里写图片描述

它会把前面设置的图形变换都清除!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值