Переместите прямоугольник после увеличения

У меня есть прямоугольник, определенный R1: x1, y1-x2, y2 и после применения увеличения, я получаю
прямоугольник R2: X1, Y1-X2, Y2.

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

Как вы можете видеть, R2 расширяется в зависимости от происхождения R1. Не мой желаемый эффект.

Что я хочу сделать, это пересчитать происхождение на основе того, где был
указатель мыши, когда была выполнена операция масштабирования.

Например:

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

Здесь указатель мыши был установлен на точку «o», а затем увеличен, в результате чего
прямоугольник R2. Обратите внимание, что R2 не сосредоточен на R1, но немного смещен в
справа и снизу.

Как я могу изменить исходное положение после увеличения?

0

Решение

Это не вопрос программирования, а математическая проблема.

Если мышь находится в центре экрана, каждая сторона расширяется одинаково. Если мышь полностью направлена ​​в одну сторону, прямоугольник расширяется только в этом направлении. Таким образом, вам нужно определить увеличение размера от соотношения.

Итак, нам нужно настроить несколько переменных здесь: width_delta, height_delta, mouse_x_relative, mouse_y_relative, rect_width, rect_height.

  • Дельта ширины — это новая ширина минус старая ширина.
  • Высота дельта — это новая высота минус старая высота.
  • Мышь х относительно — это координата х относительно левой стороны прямоугольника
  • Мышь y относительная — это координата y относительно верхней стороны прямоугольника.

С каждой дельтой, когда мышь идеально отцентрирована, мы можем вычислить изменение сторон прямоугольников с помощью delta — delta / 2 и delta / 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

я верю тот должен работать с вашим ожидаемым поведением, в отличие от моего последнего ответа. При увеличении (уменьшении) прямоугольник замыкается на мышь (центрирование), а при уменьшении он удаляется от мыши (не по центру, если хотите), в противоположность тому, как он перемещался.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]