여기서translate()는 실제로 새 캔버스 좌표계의 원점 좌표인 두 개의 매개변수만 전달합니다. 아래 코드를 통해 효과를 살펴보겠습니다.
다른 모양의 색상, 是矩 모양의 원래 개체, 然后调사용translate()방법, 将矩형태의 位移至(200,200), 即红색깔 모양의 개체입니다. ,它是怎么做到平移变换的。
其实这里有一个坑,我们如果想把矩shape平移至(300,300)怎么办呢?或许我们会想,直接调사용context.translate(200,200)就可以了。好,我们看看效果。
JavaScript 코드
复复内容到剪贴板
-
- "zh">
-
- "UTF-8">
- 平移变换
-
-
-
"canvas-warp">
-
- 你的浏览器居然不支持Canvas?!赶快换一个吧!!
-
-
- <스크립트>
-
window.onload = 함수(){
-
var canvas = document.getElementById("canvas");
- canvas.width = 800;
- canvas.height = 600;
-
var context = canvas.getContext("2d");
-
context.fillStyle = "#FFF";
- context.fillRect(0,0,800,600);
-
-
context.fillStyle = "#00AAAA";
- context.fillRect(100,100,200,100);
-
-
context.fillStyle = "빨간색";
- context.translate(100,100);
- context.fillRect(100,100,200,100);
-
-
context.fillStyle = "녹색";
- context.translate(200,200);
- context.fillRect(100,100,200,100);
-
- };
-
-
-
运行结果:
여기에 있는 색색깔의 색종이는 우리에게 있습니다(300,300)位置处,而是跑到了(400,400)这里.为什么呢?想必大家已经知道了答案——Canvas是基于状态的绘제 。我们第一次平移之后,坐标系已经在(100,100)处了,所以如果继续平移,这个再基于新坐标系继续平移坐标系。那么要怎么去解决呢?很简单,有两个방법입니다.
第一,在每次使用完变换之后,记得将坐标系平移回原点,即调用translate(-x,-y)。
제2, 현재 사용 중인 context.save(), 사용 중인 context.save(), 사용 중인 context.restore().
切记,千万不要再想着我继续紧接着第一次平移之后再平移translate(100,100)不就行了,这样你自己的坐标系就乱套,根本找不到自己的坐标系原点에서哪,多次变换或者封装函数之后,会坑死你。所以一定要以最初状态为最根本的参根要,这是原则性问题。这里我建议使涉及所有图shape变换 사용 용도的时候,city要这么处理,不仅仅是平移变换。
具体使用如下。
JavaScript 코드复复内容到剪贴板
-
- "zh">
-
- "UTF-8">
- 平移变换
-
-
-
"canvas-warp">
-
- 你的浏览器居然不支持Canvas?!赶快换一个吧!!
-
-
- <스크립트>
-
window.onload = 함수(){
-
var canvas = document.getElementById("canvas");
- canvas.width = 800;
- canvas.height = 600;
-
var context = canvas.getContext("2d");
-
context.fillStyle = "#FFF";
- context.fillRect(0,0,800,600);
-
-
context.fillStyle = "#00AAAA";
- context.fillRect(100,100,200,100);
-
- context.save();
-
context.fillStyle = "빨간색";
- context.translate(100,100);
- context.fillRect(100,100,200,100);
- context.restore();
-
- context.save();
-
context.fillStyle = "녹색";
- context.translate(200,200);
- context.fillRect(100,100,200,100);
- context.restore();
-
- };
-
-
-
运行结果:
因此, 使用图形变换的时候, 要记得结使用状态保存。
旋转变换rotate()
동일하게 회전(deg)하여 회전(도)할 수 없습니다.圆心进行的顺时针旋转。所以,使userotate() 配前,일반적으로 常需要配合使用translate()平移坐标系,确定旋转的圆心 。即,旋转变换通常搭配平移变换매우 유용합니다.
最后一点需要注의심있는是, Canvas是基于状态的绘是, 所以每次旋转city, 是接着上次旋转的基础上继续旋转, 所以에서 저장() 및 복원() 방식을 사용하는 형식은 다음과 같습니다. ,일방면 겹침 旋转角,另 一 方 면 겹 置 坐 标 系 原点 。
JavaScript 코드复复内容到剪贴板
-
- "zh">
-
- "UTF-8">
- 旋转变换
-
-
-
"canvas-warp">
-
- 你的浏览器居然不支持Canvas?!赶快换一个吧!!
-
-
- <스크립트>
-
window.onload = 함수(){
-
var canvas = document.getElementById("canvas");
- canvas.width = 800;
- canvas.height = 600;
-
var context = canvas.getContext("2d");
-
context.fillStyle = "#FFF";
- context.fillRect(0,0,800,600);
-
-
-
용(var i = 0; i <= 12; i ){
- context.save();
- context.translate(70 i * 50, 50 i * 40);
-
context.fillStyle = "#00AAAA";
- context.fillRect(0,0,20,20);
- context.restore();
-
- context.save();
- context.translate(70 i * 50, 50 i * 40);
- context.rotate(i * 30 * Math.PI / 180);
-
context.fillStyle = "빨간색";
- context.fillRect(0,0,20,20);
- context.restore();
- }
-
- };
-
-
-
运行结果:
14개 수정 형식, 其中蓝Color是旋转前의 수정 형식, 红color是旋转后의 수정 형식에 대한 사용이 가능합니다.旋转。每次绘제토被save( )与restore()包裹起来,每次旋转前文移动了坐标系。妙了。