缩放后重新定位矩形

Reposition rectangle after zooming

本文关键字:定位 新定位 缩放      更新时间:2023-10-16

我有一个矩形定义为R1:x1,y1-x2,y2,在应用缩放后,我得到矩形R2: X1, Y1-X2, Y2。

+--------------+---+
|              |   |
|     R1       |   |
|              |   |
+--------------+   |
|              R2  |
+------------------+

可以看到,R2是基于R1的原点展开的。这不是我想要的效果。

我想完成的是重新计算原点的基础上,在哪里是执行缩放操作时的鼠标指针。

例如:

   +-----------------------+ 
   | +-----------------+   |
   | |  o              |   |
   | |       R1        |   |
   | |                 |   |
   | +-----------------+   |
   |            R2         |
   +-----------------------+

在这里,鼠标指针被设置在点"o"上,然后缩放,结果是a矩形R2。请注意R2不是以R1为中心,而是有一点移位

缩放后如何重新定位原点

这不是一个特定于编程的问题,而是一个数学问题。

如果鼠标位于屏幕中央,则每边均匀展开。如果鼠标一直移动到一侧,则矩形只向该方向扩展。所以你需要从一个比率来确定大小的增加。

因此,我们需要在这里设置一些变量:width_delta, height_delta, mouse_x_relative, mouse_y_relative, rect_width, rect_height。

  • Width delta是新宽度减去旧宽度。
  • 高度增量是新高度减去旧高度。
  • 鼠标x相对是相对于矩形左侧的x坐标
  • 鼠标y相对坐标是相对于矩形顶部的y坐标

对于每个δ,当鼠标完全居中时,我们可以用δ - δ/2和δ/2计算矩形边的变化。结果是一半的流向一边,另一半流向另一边。因此,我们不需要除以2,而是需要找出它与鼠标位置和矩形大小之间的关系。

很简单:rect_width/mouse_x_relative。假设矩形宽度为10,鼠标位于5的中心位置,10/5 = 2,导致增量平均分布在矩形的两侧,因此我们需要将增量除以rect_width/mouse_x_relative。

left_delta = width_delta / rect_width / mouse_x_relative
right_delta = width_delta - left_delta 

但是我们可以把它修改成:

left_delta = width_delta * mouse_x_relative / rect_width
right_delta = width_delta - left_delta 

我相信应该符合你的预期行为,不像我上一个答案。当你放大(缩小)时,矩形会靠近鼠标(定心),当你缩小时,它会远离鼠标(如果你愿意,可以不定心),这与它移动的方式相反。