缩放后重新定位矩形

时间:2013-05-03 00:25:07

标签: c++ c delphi math lazarus

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

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

如您所见,R2基于R1的来源进行了扩展。不是我想要的效果。

我想要完成的是根据地点重新计算原点 执行缩放操作时的鼠标指针。

例如:

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

这里,鼠标指针设置在点“o”上,然后缩放,产生一个 矩形R2。请注意R2不是以R1为中心,而是有点偏移 右边和底部。

如何在缩放后重新定位原点?。

1 个答案:

答案 0 :(得分:2)

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

如果鼠标位于屏幕中央,则每侧均匀扩展。如果鼠标一直到一侧,则矩形仅在该方向上扩展。因此,您需要确定比例的大小增加。

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

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

对于每个delta,当鼠标完全居中时,我们可以计算矩形边的变化,其中delta-delta / 2和delta / 2.这导致delta的一半到达一边,另一边一半到另一半。因此,我们需要找出它与鼠标位置和矩形大小的关系,而不是除以2。

足够简单:rect_width / mouse_x_relative。假设rect是宽度10,鼠标位于中心5,10/5是2,导致delta均匀分布到rect的两侧。所以我们需要将delta除以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 

我认为 应该与您预期的行为一致,不像我上一个回答。放大(收缩)时,矩形会在鼠标上方(居中)闭合,当你缩小它时,它会远离鼠标移动(如果你愿意,则取消居中),与它移动的方式相反。