所以我知道这里已经有关于它的线索,比如那个。我遵循了上面线程中提出的想法,并且它有效。但是,我不明白它为什么起作用。
这是一个例子:
假设我有一个以 (100, 100) 为中心的正方形,它的宽度/高度为 100。所以它的左上角将位于 (50, 50)。
现在假设我要将 X2 放大到正方形的中心,即放大到 (100, 100)。所以我将编写以下转换序列:
translate(100, 100);
scale(2, 2);
translate(-100, -100);
所以因为画布以相反的顺序应用变换,我变换的正方形的左上角现在将位于 (0, 0),它的高度/宽度将为 200。
好的,假设现在我想将 X2 放大到已经转换的正方形的右下角。所以直观地说,我想执行以下转换序列:
translate(200, 200);
scale(2, 2);
translate(-200, -200);
但它不会起作用,因为画布再次以相反的顺序应用变换。也就是说,如果我总结我的两个转换序列,我会得到:
// First Sequence
translate(100, 100);
scale(2, 2);
translate(-100, -100);
// Second Sequence
translate(200, 200);
scale(2, 2);
translate(-200, -200);
这意味着第二个序列将应用于第一个序列之前的每个点(因为画布将应用从下到上的转换),这是错误的。因此,上面链接中的线程建议如下:
因为序列 2 将首先应用,所以我应该将点 (200, 200) 转换为其原始坐标,方法是对其应用第一个序列的倒数。也就是说,如果T1
是表示第一个序列的矩阵,那么它会是这样的:
// First Sequence
translate(100, 100);
scale(2, 2);
translate(-100, -100);
// Second Sequence
var point = SVGPoint(200, 200);
var transformedPoint = point.matrixTransform(T1.inverse());
translate(-transformedPoint.x, -transformedPoint.y);
scale(2, 2);
translate(transformedPoint.x, transformedPoint.y);
但为什么它有效?我真的不明白为什么它应该这样工作......有人可以详细说明吗?
谢谢!