【发布时间】:2015-08-26 17:31:59
【问题描述】:
我有 2 个画布。我要做的是在第二个画布上绘制形状(即一条线)。当我想对这条绘制的线应用变换(旋转、缩放等)时,我会修改第一个画布的上下文并在上面画我的第二个画布。完美地工作。现在,当我想在第二个画布上再次绘制形状(即一条线)(带有变换)时,我在第二个画布上画了第一个画布并在上面画了一条线。工作得很好。现在问题发生了。当我再次想对这条线应用转换(旋转、缩放等)时,我修改了第一个画布的上下文并在上面绘制了第二个画布。但是这一次,当我在第一个画布上绘制时,我得到了突然的变化(绘制第二个画布)。这是由于在第二个画布上绘制第一个画布并再次将第二个画布绘制到第一个画布所应用的转换。有没有办法更改(重置或修改)已经在画布上绘制的任何内容?
var cantem = document.getElementById('canvasTemp1'); //second canvas
var ctxtem = cantem.getContext('2d');
var canMan = document.getElementById('canvasTempMan'); //first canvas
canMan.style.visibility = "visible";
var ctxcanman = canMan.getContext('2d');
var sWidth = getCanvasWidth(); //returns canvas width
var sHeight = getCanvasHeight(); //returns canvas height
canMan.height = sHeight;
canMan.width = sWidth;
cantem.style.visibility = "hidden";
ctxcanman.setTransform(1, 0, 0, 1, 0, 0);
ctxcanman.clearRect(0, 0, cantem.width, cantem.height);
ctxcanman.translate(sWidth / 2, sHeight / 2);
ctxcanman.scale(ZoomFactor, ZoomFactor);
ctxcanman.rotate(RotateAngle * Math.PI / 180);
ctxcanman.translate(-sWidth / 2, -sHeight / 2);
ctxcanman.drawImage(cantem, 0, 0, cantem.width, cantem.height, OffsetX, OffsetY, sWidth, sHeight);
ctxcanman.save();
现在我在这里将我的第一个画布绘制到第二个-->
var can = document.getElementById('canvasTempMan');
can.style.visibility = "hidden";
var cantem = document.getElementById('canvasTemp1');
var ctxannotate = cantem.getContext("2d");
ctxannotate.setTransform(1, 0, 0, 1, 0, 0);
ctxannotate.clearRect(0, 0, cantem.width, cantem.height);
ctxannotate.save();
ctxannotate.drawImage(can, 0, 0, cantem.width, cantem.height, OffsetX, OffsetY, can.width, can.height);
我使用鼠标事件和简单的上下文函数(如 moveTo、lineTo 等)在我的第二个画布上绘制(形状即线条)。
【问题讨论】:
-
阅读转换矩阵。它们可以保存对您的任何单个形状进行的所有累积变换(平移、旋转、缩放),并允许在以后需要继续变换任何形状时重新应用变换。
-
@markE 很好..但是可以在已经绘制的画布上重置转换吗??
-
没有。已经在画布上绘制的任何内容都无法转换。 要改变画布上任何东西的位置,only 方法是: (#1) 清除画布,(#2) 计算形状的新位置,(# 3)在新位置重绘所有形状。第 2 步是变换矩阵有用的地方,因为它们让您“记住”所有先前的移动、缩放和形状旋转。 ;-)
-
我的场景有点不同...1)我在画布上绘制..2)应用转换..3)再次绘制..4)并再次尝试转换之前绘制的所有内容...
-
当然,您可以预先计算形状的下一个位置,但是要在画布上直观地应用这些变换,您必须清除画布并在新位置重新绘制所有形状。同样,如果不清除和重绘,画布上的任何东西都不能重新定位……画布上的形状永远不能重新定位。 :-)
标签: javascript html canvas