Масштабирование вокруг определенной точки в системе координат 2d

Ниже – изображение моей системы координат Введите описание изображения здесь

Что я пытаюсь сделать, так это то, что я хочу начать масштабирование вокруг определенной точки в холсте, масштабирование отлично работает, но моя проблема заключается в том, что я не знаю, как вычислить, сколько для перемещения холста при масштабировании, обратите внимание, что i Я не использую canvas.scale, я просто увеличиваю расстояние между каждыми 2 единицами в системе при масштабировании и его работе просто отлично.) Так же есть какое-то уравнение, которое может помочь мне узнать, сколько можно компенсировать холст при масштабировании по конкретным указать?

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

Уравнения в этом случае менее полезны, чем знание правильного принципа. Ответ – только одно предложение, но сначала мне нужно будет объяснить принцип.

Когда вы говорите «масштаб вокруг точки», то, что вы ищете, – это временно относиться к этой другой точке как к происхождению. Масштабирование вокруг начала тривиально; Это просто скалярное умножение. Масштабирование вокруг другой точки – три операции:

  • Переведите назначенный пункт в начало
  • Масштабировать (временное, новое) происхождение.
  • Верните назад, чтобы происхождение вернулось к назначенному пункту.

В математической нотации вызовите оператор масштабирования S. Вызовите оператор перевода, переводящий обозначенную точку в начало T. Оператор, который берет начало координат в указанную точку, является обратным к T, обозначаемому T -1 . Тогда оператор, который выполняет «масштабирование в точке», равен T -1 ST. (Применяйте операторы справа налево.)

Оператор T -1 ST называется сопряжением S через T. В линейной алгебре он также вызывает преобразование подобия. Если S и T могут быть представлены матрицами (как это верно в этой настройке), объединенный оператор является произведением матриц.

Итак, вот ответ из одного предложения: Сопрягайте операцию масштабирования путем перевода в начало.

Я должен добавить, хотя это не является частью вопроса, что сопряжение – это также то, как вы вращаетесь вокруг точки.

Итак, скажем, мы хотим применить масштабирование, которое фиксирует определенную точку (x0, y0). Допустим, мы используем равномерное масштабирование множителем s, за которым следует перевод (u, v). Это означает, что наше полное преобразование

(x',y') = s (x,y) + (u,v) 

Теперь (x0, y0) фиксировано так

 (x0,y0) = s * (x0,y0) + (u,v) 

Немного перестановки дает

 (u,v) = (1 - s) (x0, y0) 

В psudocode это может быть похоже на

 double s= scale_factor; double x0 = center_point_x; double y0 = center_point_y; canvas.scale(s); double u = (1-s) * x0; double v = (1-s) * y0; canvas.translate(u,v);