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

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

如您所见,R2是基于R1的原点展开的。不是我想要的效果。
我想完成的是根据
执行缩放操作时的鼠标指针。
例如:
   +-----------------------+
   | +-----------------+   |
   | |  o              |   |
   | |       R1        |   |
   | |                 |   |
   | +-----------------+   |
   |            R2         |
   +-----------------------+

在这里,鼠标指针设置在点“o”上,然后进行缩放,结果是
矩形R2。请注意,R2不是以R1为中心,而是有点偏移到
右边和下面。
缩放后如何重新定位原点?.

最佳答案

这不是一个特定于编程的问题,而是一个数学问题。
如果鼠标位于屏幕中央,则每边的展开都相等。如果鼠标一直指向一侧,则矩形仅向该方向展开。所以你需要从一个比例来决定尺寸的增加。
所以,我们需要在这里设置几个变量:width_delta,height_delta,mouse_x_relative,mouse_y_relative,rect_width,rect_height。
宽度增量是新宽度减去旧宽度。
高度增量是新高度减去旧高度。
鼠标x相对是相对于矩形左侧的x坐标
鼠标y relative是相对于矩形顶部的y坐标
对于每个delta,当鼠标完全居中时,我们可以用delta-delta/2和delta/2计算矩形边的变化。这导致三角洲的一半流向一边,另一半流向另一边。所以我们需要找出这与鼠标位置和矩形大小的关系,而不是除以2。
足够简单:矩形宽度/鼠标相对宽度。假设一个矩形的宽度是10,鼠标在中间的位置是5,10/5是2,这就使得三角形平均分布在矩形的两边。所以我们需要用rect_width/mouse_x_relative来划分delta。

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

我相信这应该符合你的预期行为,不像我最后的回答。当您放大(缩小)矩形时,它会在鼠标上闭合(居中),当您缩小矩形时,它会远离鼠标(如果您愿意,可以取消居中),这与它移动的方式相反。

09-10 05:17
查看更多