У меня есть прямоугольник, определенный R1: x1, y1-x2, y2 и после применения увеличения, я получаю
прямоугольник 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.
С каждой дельтой, когда мышь идеально отцентрирована, мы можем вычислить изменение сторон прямоугольников с помощью 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
я верю тот должен работать с вашим ожидаемым поведением, в отличие от моего последнего ответа. При увеличении (уменьшении) прямоугольник замыкается на мышь (центрирование), а при уменьшении он удаляется от мыши (не по центру, если хотите), в противоположность тому, как он перемещался.
Других решений пока нет …