【问题标题】: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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-08
          • 1970-01-01
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          • 1970-01-01
          • 2021-06-06
          • 1970-01-01
          相关资源
          最近更新 更多