好的,所以您基本上是在围绕某个枢轴点 {Px, Py} 缩放视图后,尝试找出某个屏幕 X/Y 坐标对应的位置。
那么,让我们尝试分解它。
为了便于论证,我们假设 Px & Py = 0,并且 s = 2。这意味着视图围绕视图的左上角缩放了 2 倍。
在本例中,屏幕坐标 {0, 0} 对应于视图中的 {0, 0},因为该点是唯一未更改的点。一般来说,如果屏幕坐标等于枢轴点,则没有变化。
如果用户点击其他点(比如 {2, 3}),会发生什么?在本例中,曾经的 {2, 3} 现在已从枢轴点(即 {0, 0})移动了 2 倍,因此相应的位置为 {4, 6}。
当轴心点为 {0, 0} 时,这一切都很容易,但如果轴心点不是 {0, 0} 时会发生什么?
好吧,让我们看看另一种情况 - 枢轴点现在是视图的右下角(宽度 = w,高度 = h - {w,h})。同样,如果用户点击相同的位置,那么对应的位置也是{w, h},但是假设用户点击了其他位置,例如{w - 2, h - 3}?这里出现相同的逻辑:翻译后的位置是{w - 4, h - 6}。
概括而言,我们要做的是将屏幕坐标转换为平移坐标。我们需要对收到的 X/Y 坐标执行与对缩放视图中的每个像素执行的操作相同的操作。
Step 1- 我们想根据枢轴点平移 X/Y 位置:
X = X - Px
Y = Y - Py
Step 2- 然后我们缩放 X 和 Y:
X = X * s
Y = Y * s
Step 3- 然后我们翻译回来:
X = X + Px
Y = Y + Py
如果我们将其应用于我给出的最后一个示例(我将仅针对 X 进行演示):
Original value: X = w - 2, Px = w
Step 1: X <-- X - Px = w - 2 - w = -2
Step 2: X <-- X * s = -2 * 2 = -4
Step 3: X <-- X + Px = -4 + w = w - 4
将其应用于缩放之前收到的相关 X/Y 后,该点将被平移,以便它相对于缩放状态。
希望这可以帮助。