围绕二维坐标系中的特定点进行缩放

问题描述 投票:0回答:3

下面是我的坐标系的图像:

我想做的是,我想开始围绕画布中的特定点进行缩放,缩放工作正常,但我的问题是我不知道如何计算缩放时移动画布的量,请注意我没有使用canvas.scale。

我只是在缩放时增加系统中每 2 个单位之间的距离,并且它工作得很好。

那么有没有什么方程可以帮助我找出在特定点缩放时画布偏移多少?

假设我想围绕点(0,4)缩放,如何知道缩放时画布移动多少?

android math canvas coordinates
3个回答
23
投票

在这种情况下,方程的用处不如了解正确的原理有用。答案只有一句话,但我得先解释一下原理。

当您说“围绕一个点缩放”时,您正在寻找的是暂时将该其他点视为原点。围绕原点缩放是微不足道的;这只是标量乘法。围绕另一个点缩放需要三个操作:

  • 将指定点平移至原点
  • 在(临时的、新的)原点进行缩放。
  • 向后平移,使原点回到指定点。

用数学符号表示,将缩放算子称为S。将指定点到原点的平移算子称为T。将原点到指定点的算子是T的逆算子,记为T-1。那么进行“在一点缩放”的算子就是T-1ST。 (从右到左应用运算符。)

算子 T-1ST 称为 S 与 T 的共轭。在线性代数中,也称为相似变换。如果 S 和 T 可以用矩阵表示(在本设置中也是如此),则组合运算符就是矩阵的乘积。

所以这是一句话答案:通过翻译到原点来结合你的缩放操作。

我应该补充一点,虽然这不是问题的一部分,但共轭也是围绕一个点旋转的方式。


9
投票

假设我们要应用缩放,使特定点 (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);

5
投票

新 X 坐标的方程为:

(old_coordinate_x - focus_point_around_which_scale_is_done_x) * scale_factor + focus_point_around_which_scale_is_done_x

新Y坐标的计算类似。

© www.soinside.com 2019 - 2024. All rights reserved.