canvas入门(六)旋转、偏移、缩放

canvas入门系列

canvas入门(一) 绘制线与正方形
canvas入门(二) 标签width与style:width的区别
canvas入门(三) 绘制代码分块
canvas入门(四) 绘制线的扩展api
canvas入门(五) 贝塞尔曲线
canvas入门(六) 旋转、偏移、缩放
canvas入门(七) 中心旋转

欢迎查看canvas第六节内容,本节内容主要介绍canvas的translate、scale、rotate三种方法

canvas之rotate

<script type="text/javascript">
	window.onload = function(){
		var canvas = document.getElementsByTagName('canvas')[0];
		var context = canvas.getContext('2d');
		context.fillStyle = "skyblue";
		context.rotate(20*Math.PI/180);
		context.rect(20,20,30,20);
		context.fill();
	}
</script>

绘制效果如下
在这里插入图片描述
context.rotate(angle);旋转角度,以弧度计。例如上面的例子是旋转20度;
在做旋转操作时切记先旋转画布再进行绘画,如果先绘制再旋转与正常绘制无表面区别。
继续分析上述例子,大家是否观察出了旋转中心点?再看一个例子

<script type="text/javascript">
	window.onload = function(){
		var canvas = document.getElementsByTagName('canvas')[0];
		var context = canvas.getContext('2d');
		context.beginPath();
		context.fillStyle = "#ccc";
		context.rect(0,0,100,100);
		context.fill();
		context.closePath();

		context.beginPath();
		context.strokeStyle = "skyblue";
		context.rotate(45*Math.PI/180);
		context.lineTo(0,0);
		context.lineTo(100,0);
		context.stroke();
		context.closePath();
	}
</script>

效果如下
在这里插入图片描述
在这一段代码中不仅很好的体现出了旋转之后再绘制的问题,也可以很清楚的反映出了旋转中心(0,0)。
context.lineTo(0,0);context.lineTo(100,0);本来是一条水平的直线,但是受context.rotate(45*Math.PI/180);旋转45度之后的影响刚好处于灰色正方形的对角线之上。
但是在实际需求中我们常常需要以中心点为中心进行旋转该如何实现呢?这时便需要我们canvas的另一个操作方法translate
canvas之translate

<script type="text/javascript">
	window.onload = function(){
		var canvas = document.getElementsByTagName('canvas')[0];
		var context = canvas.getContext('2d');
		context.beginPath();
		context.fillStyle = "skyblue";
		context.rect(0,0,100,100);
		context.fill();
		context.translate(50,50);
		context.rect(0,0,100,100);
		context.fill();
		context.closePath();
	}
</script>

效果如下
在这里插入图片描述
context.translate(x,y);x水平偏移量,y垂直偏移量;
在做偏移操作时切记先偏移画布再进行绘画。
实现定点旋转代码(示例中心旋转)

<script type="text/javascript">
	window.onload = function(){
		var canvas = document.getElementsByTagName('canvas')[0];
		var context = canvas.getContext('2d');
		context.beginPath();
		context.fillStyle = "#ccc";
		context.rect(50,50,50,50);
		context.fill();
		context.closePath();

		context.beginPath();
		context.fillStyle = "skyblue";
		context.translate(75,75);
		context.rotate(45*Math.PI/180);
		context.translate(-75,-75);
		context.rect(50,50,50,50);
		context.fill();
		context.closePath();
	}
</script>

效果如下
在这里插入图片描述
原理
首先确定你需要的旋转中心的坐标,上诉例子中旋转中心为(75,75),然后通过context.translate(75,75);将画布向左向下偏移75,使画布(0,0)点移至旋转中心,然后旋转画布,使正方形放生旋转,最后再将画布通过context.translate(-75,-75);移动回原来的位置;
canvas之scale

<script type="text/javascript">
	window.onload = function(){
		var canvas = document.getElementsByTagName('canvas')[0];
		var context = canvas.getContext('2d');
		context.beginPath();
		context.fillStyle = "#ccc";
		context.rect(10,10,10,10);
		context.fill();
		context.closePath();
		context.beginPath();
		context.scale(2,2);
		context.fillStyle = "skyblue";
		context.rect(10,10,10,10);
		context.fill();
		context.closePath();
	}
</script>

效果如下
在这里插入图片描述
context.scale(x,y);x水平方向的缩放,y垂直方向的缩放
对绘图进行缩放,定位也会被缩放。如果您 scale(2,2),那么绘图将定位于距离画布左上角两倍远的位置。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风舞红枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值