我想做的是,我想开始围绕画布中的特定点进行缩放,缩放工作正常,但我的问题是我不知道如何计算缩放时移动画布的量,请注意我没有使用canvas.scale。
我只是在缩放时增加系统中每 2 个单位之间的距离,并且它工作得很好。
那么有没有什么方程可以帮助我找出在特定点缩放时画布偏移多少?
假设我想围绕点(0,4)缩放,如何知道缩放时画布移动多少?
在这种情况下,方程的用处不如了解正确的原理有用。答案只有一句话,但我得先解释一下原理。
当您说“围绕一个点缩放”时,您正在寻找的是暂时将该其他点视为原点。围绕原点缩放是微不足道的;这只是标量乘法。围绕另一个点缩放需要三个操作:
用数学符号表示,将缩放算子称为S。将指定点到原点的平移算子称为T。将原点到指定点的算子是T的逆算子,记为T-1。那么进行“在一点缩放”的算子就是T-1ST。 (从右到左应用运算符。)
算子 T-1ST 称为 S 与 T 的共轭。在线性代数中,也称为相似变换。如果 S 和 T 可以用矩阵表示(在本设置中也是如此),则组合运算符就是矩阵的乘积。
所以这是一句话答案:通过翻译到原点来结合你的缩放操作。
我应该补充一点,虽然这不是问题的一部分,但共轭也是围绕一个点旋转的方式。
假设我们要应用缩放,使特定点 (x0,y0) 保持固定。假设我们使用因子 s 进行统一缩放,然后进行 (u,v) 平移。这意味着我们的全面转型是
(x',y') = s (x,y) + (u,v)
现在 (x0,y0) 已固定,所以
(x0,y0) = s * (x0,y0) + (u,v)
稍微重新排列一下就可以了
(u,v) = (1 - s) (x0, y0)
在伪代码中可能是这样的
double s= scale_factor;
double x0 = center_point_x;
double y0 = center_point_y;
canvas.scale(s);
double u = (1-s) * x0;
double v = (1-s) * y0;
canvas.translate(u,v);
新 X 坐标的方程为:
(old_coordinate_x - focus_point_around_which_scale_is_done_x) * scale_factor + focus_point_around_which_scale_is_done_x
新Y坐标的计算类似。