【问题标题】:Scaling around a specific point in 2d coordinate system围绕二维坐标系中的特定点缩放
【发布时间】:2016-11-21 15:33:24
【问题描述】:
下图是我的坐标系:
我想做的是我想开始围绕画布中的特定点进行缩放,缩放效果很好,但我的问题是我不知道如何计算缩放时画布移动了多少,请注意,我没有使用 canvas.scale。
我只是在缩放时增加系统中每 2 个单位之间的距离,它工作得很好。
那么有什么公式可以帮助我找出在特定点缩放时画布偏移多少?
假设我想围绕 point(0,4) 进行缩放,如何知道缩放时画布移动了多少?
【问题讨论】:
标签:
android
math
canvas
coordinates
【解决方案1】:
等式是
(old_coordinate_x - focus_point_around_which_scale_is_done_x)*scale_factor + focus_point_around_which_scale_is_done_x = new_coordinate_x
同样计算点的y坐标。
【解决方案2】:
在这种情况下,方程式不如了解正确的原理有用。答案只有一句话,但我需要先解释一下原理。
当您说“围绕一个点缩放”时,您正在寻找的是暂时将另一个点视为原点。围绕原点缩放是微不足道的;它只是标量乘法。围绕另一个点进行缩放是三个操作:
- 将指定点平移到原点
- 在(临时的、新的)原点缩放。
- 向后平移,使原点回到指定点。
在数学符号中,称缩放算子S。称取指定点到原点T的平移算子。取原点到指定点的算子是T的倒数,记为T-1 。那么“在一点上缩放”的算子是 T-1ST。 (从右到左应用运算符。)
算子T-1ST称为S与T的共轭。在线性代数中,也称为相似变换。如果 S 和 T 可以用矩阵表示(在此设置中也是如此),则组合运算符是矩阵的乘积。
所以这是一个句子的答案:通过转换到原点来结合你的缩放操作。
我应该补充一点,虽然这不是问题的一部分,但共轭也是你围绕一个点旋转的方式。
【解决方案3】:
假设我们要应用一个缩放,使特定点 (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)
在psudocode中可能是这样的
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);