在2d坐标系中的特定点周围缩放

时间:2016-07-18 22:00:58

标签: android math canvas coordinates

下面是我的坐标系图像: enter image description here

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

我只是在缩放时增加系统中每2个单元之间的距离,它的工作正常。

那么是否有任何方程可以帮助我找出在特定点缩放时偏移画布的数量?

假设我想围绕点(0,4)进行缩放,以便在缩放时如何知道移动画布的数量?

3 个答案:

答案 0 :(得分:6)

在这种情况下,方程式不如知道正确的原则有用。答案只有一句话,但我首先需要解释这个原则。

当你说“围绕一个点”时,你要找的是暂时将另一个点作为原点。缩放原点是微不足道的;它只是标量乘法。缩放另一个点是三个操作:

  • 将指定点翻译为原点
  • 缩放(临时,新)原点。
  • 翻译回来,使原点回到指定点。

在数学符号中,调用缩放运算符S.调用将指定点指向原点T的转换运算符。将原点带到指定点的运算符是T的倒数,表示为T -1 。那么“在一点上缩放”的操作符是T -1 ST。 (从右到左应用运算符。)

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

所以这里是一句话答案:通过对原点的翻译来共轭你的缩放操作。

我应该补充一点,虽然它不是问题的一部分,但是共轭也是你在一个点上旋转的方式。

答案 1 :(得分:4)

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

答案 2 :(得分: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坐标。