Escala alrededor de un punto específico en el sistema de coordenadas 2d

Abajo está una imagen mi sistema de coordenadas Introduzca aquí la descripción de la imagen

Lo que estoy tratando de hacer es que quiero empezar a escalar alrededor de un punto específico en el lienzo, la escala funciona bien, pero mi problema es el no sé cómo calcular cuánto mover el lienzo durante la escala, tenga en cuenta que i No estoy usando canvas.scale, estoy simplemente aumentando la distancia entre cada 2 unidades en el sistema mientras que la escala y su funcionamiento apenas fino.) Así que hay una ecuación que puede ayudarme a descubrir cuánto compensar el lienzo mientras que escala en específico ¿punto?

Supongo que quiero escalar alrededor de punto (0,4) ¿cómo saber cuánto mover el lienzo mientras escala?

Las ecuaciones en este caso son menos útiles que conocer el principio correcto. La respuesta es sólo una oración, pero necesitaré explicar primero el principio.

Cuando dices "escala alrededor de un punto", lo que estás buscando es tratar temporalmente ese otro punto como el origen. Escalar alrededor del origen es trivial; Es simplemente multiplicación escalar. Escalar alrededor de otro punto es tres operaciones:

  • Traducir el punto designado al origen
  • Escala en el origen (temporal, nuevo).
  • Traducir de nuevo para que el origen vuelva al punto designado.

En la notación matemática, llamar al operador de escala S. Llamar al operador de traducción que toma el punto designado al origen T. El operador que lleva el origen al punto designado es el inverso de T, denotado T -1 . Entonces el operador que hace "escalar en un punto" es T -1 ST. (Aplique operadores de derecha a izquierda.)

El operador T -1 ST se llama la conjugación de S por T. En álgebra lineal, también se llama transformada de similitud. Si S y T pueden ser representados por matrices (como es cierto en este ajuste), el operador combinado es el producto de las matrices.

Así que aquí está la respuesta de una oración: Conjugar su operación de escala con una traducción al origen.

Debo añadir, aunque no es parte de la pregunta, que la conjugación es también cómo se gira alrededor de un punto.

Así que digamos que queremos aplicar una escala que deja un punto específico (x0, y0) fijo. Digamos que estamos usando escala uniforme por un factor s seguido por una traducción de (u, v). Esto significa que nuestra plena transformación es

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

Ahora (x0, y0) se fija así

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

Un poco de reordenación da

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

En psudocode podría ser como

 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); 
  • Fórmulas matemáticas en textview en android
  • Cómo convertir de fracción de la cadena formateada en Decimal o Float en Java?
  • Calcular el ángulo del punto tocado y rotarlo en Android
  • ¿Debo confiar en Android para descartar los sorteos fuera de pantalla?
  • Comprender claramente el cálculo de la matriz
  • ¿Cuál es la mejor práctica para redondear un flotador a 2 decimales?
  • MathML y ​​Java
  • Mover la mano Minuto en el reloj de Android
  • Android - calcular el ángulo del arco
  • ¿Cómo calcular la posición en un círculo con un cierto ángulo?
  • ¿Cómo inserto caracteres especiales como texto en el editor de XML para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.