Intereting Posts
Что означает msm в источнике android? Аниматоры могут запускаться только в потоках Looper на панели действий Sherlock Cocos2d-xv 2.0.4 FATAL EXCEPTION GLThread при запуске на эмуляторе Android Удалить префикс URL из строки (http: /, www и т. Д.) Android. Попробуйте отправить поддельные sms мне без использования мобильной сети. Разница между «com.android.vending.BILLING» и «android.permission.BILLING» Нарисуйте круг в холсте с несколькими цветами градиента Как реализовать Карты Google в фрагменте и использовать объект GoogleMap? Как исправить «Organize Imports» в Android Studio для статического импорта Установите для параметра CodeBeforeField атрибут перед отношением GreenDAO Как заменить словарь Android нашим пользовательским словарем? Android 4.4 – Прозрачные статусные / навигационные полосы – fitsSystemWindows / clipToPadding не работают через транзакции фрагментов Камера Android в портрете по SurfaceView Несоответствия выборки AudioTrack Как создать API веб-сайта

Масштабирование вокруг определенной точки в системе координат 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);