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

android math canvas coordinates

1306 просмотра

2 ответа

515 Репутация автора

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

Я пытаюсь начать масштабирование вокруг определенной точки на холсте, масштабирование работает нормально, но моя проблема в том, что я не знаю, как рассчитать, сколько нужно переместить холст при масштабировании, обратите внимание, что я я не использую canvas.scale.

Я просто увеличиваю расстояние между каждыми 2 блоками в системе при масштабировании, и это работает просто отлично.

Так есть ли какое-нибудь уравнение, которое может помочь мне выяснить, насколько сместить холст при масштабировании в определенной точке?

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

Автор: has19 Источник Размещён: 18.07.2016 10:00

Ответы (2)


6 плюса

6616 Репутация автора

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

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

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

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

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

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

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

Автор: eh9 Размещён: 02.09.2016 04:25

5 плюса

5645 Репутация автора

Допустим, мы хотим применить масштабирование, которое оставляет определенную точку (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)

В псудокоде это может быть как

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);
Автор: Salix alba Размещён: 06.09.2016 08:54
Вопросы из категории :
32x32