javascript - 缩放后如何调整平移?

标签 javascript coordinates zooming viewport coordinate-transformation

我有一个用 React 构建的 View 。简化后,它由一个相对于视口(viewport)绝对定位的工作区组成。视口(viewport)与浏览器窗口的大小相同。通常(但不总是)工作区会比视口(viewport)大,如下图所示。

用户可以平移工作区,在视口(viewport)中显示它的不同区域。平移设置工作区相对于以像素表示的视口(viewport)(PanX 和 PanY)的负偏移。

Figure 1: Workspace scale 1.

用户还可以放大和缩小。缩放以固定步长完成,在此示例中,缩放系数为 0.25,即 +0.25 用于放大,-0.25 用于缩小。这会影响比例,进而影响工作区的大小。在下面的图 2 中,用户放大了一步(比例 +0.25)。

Figure 2: Workspace scale 1.25.

工作区中的每个对象都按比例缩放到工作区。在此示例中,绿色三 Angular 形表示工作区中的对象。所以放大之后,三 Angular 形会变大。当对象变大时,它在视口(viewport)中的偏移量将发生变化。在此示例中,它看起来像是向下和向右增长。

我想要完成的是,在用户放大或缩小后,视口(viewport)的中心仍应居中。为实现这一点,我需要调整 PanX 和 PanY,使视口(viewport)保持在缩放前它在工作区中居中的点的中心。

Figure 3: Workspace after zoom

所以我的问题是:如何在放大和缩小时使视口(viewport)居中于工作区中的同一点?

计算应该会产生新值,我可以为以视口(viewport)为中心的工作空间设置 PanX 和 PanY。请记住,视口(viewport)可以放置在任何位置,只要它的任何边缘都不在工作区之外(如下图所示)。

Figure 4: viewport inside workspace

提前致谢!

最佳答案

如果你想保留屏幕中央的任何东西,那么定义:

const centerX = screen.width / 2;
const centerY = screen.height / 2;

然后,当您按值scale(例如 0.25 或 -0.25)缩放时,您需要调整 PanXPanY:

PanX -= scale * centerX;
PanY -= scale * centerY;

我写了一个教程here ,它使用 SVG 和稍微不同的转换系统,但基本上是同一件事。

关于javascript - 缩放后如何调整平移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52849109/

相关文章:

php - 链接应该导航到新页面,还是显示不同的 div?

javascript - 将 eval 与 `with` 结合使用

r - 如何在 R 中绘制坐标(纬度/经度)数据并为其制作动画?

javascript - 如何在 HTML 中逐渐放大?

click - 双击间隔时间标准

javascript - 无法在幻灯片中添加效果

javascript - 通过多个元素重复脚本

c++ - 获取插入点的窗口坐标 - Cocoa

c# - 统一: What is Unity Measurements?

css - 缩放破坏了 CSS