您可以使用负值来取消转换。
ctx.translate(100,100);
ctx.translate(-100,-100);
ctx.scale(.75,.50);
ctx.scale(-.75,-.50);
ctx.rotate(Math.PI/4);
ctx.rotate(-Math.PI/4);
如果您进行了多个转换,则必须按相反的顺序撤消它们。
ctx.translate(100,100);
ctx.scale(.75,.50);
ctx.rotate(Math.PI/4);
// draw lots of stuff
ctx.rotate(-Math.PI/4);
ctx.scale(-.75,-.50);
ctx.translate(-100,-100);
但是,如果只需要翻译(移动)几个项目,使用偏移量比使用变换更快。
strokeRect(20+100,20+100,50,30);
fillRect(20+100,20+100,50,30);
裁剪是半永久性的,因此您必须保存/恢复整个上下文状态以撤消裁剪:
context.save();
context.clip();
context.restore();
使用变换矩阵进行变换。Canvas 可以通过 context.setTransform 方法让您访问该矩阵。
scaleX=.75;
scaleY=.50;
skewX=0;
skewY=0;
translateX=100;
translateY=100;
context.setTransform(scaleX, skewX, skewY, scaleY, translateX, translateY);
// draw stuff
context.setTransform(-scaleX, -skewX, -skewY, -scaleY, -translateX, -translateY);
如果您想设置旋转矩阵,您需要按以下方式设置比例和倾斜值的组合:
var radianAngle=Math.PI/4;
var cos=Math.cos(radianAngle);
var sin=Math.sin(radianAngle);
context.setTransform(cos,sin,-sin,-cos,0,0);
context.setTransform(-cos,-sin,sin,cos,0,0);
要同时进行旋转和其他变换,只需将旋转值添加到缩放和倾斜值中。
context.setTransform(scaleX+cos, skewX+sin, skewY-sin, scaleY-cos, translateX, translateY);
// draw stuff
context.setTransform(-scaleX-cos, -skewX-sin, -skewY+sin, -scaleY+cos, -translateX, -translate);
sin=Math.cos...
- 这是正确的吗? - d13