Escala alrededor de un punto específico en el sistema de coordenadas 2d
Abajo está una imagen mi sistema de coordenadas
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?
- Implementar página curl en android?
- Android: ¿Cómo obtener sólo dos dígitos después del punto en el valor decimal? no quiere trunc el valor
- La mejor práctica para calcular la velocidad media de las coordenadas GPS
- Determine el ángulo de visión de la cámara del teléfono inteligente
- Desplazamiento pequeño al calcular la rotación en función del punto de contacto
Supongo que quiero escalar alrededor de punto (0,4) ¿cómo saber cuánto mover el lienzo mientras escala?
- Determinación de números pares / impares (enteros)?
- Tengo problemas para entender lo que realmente obtiene GetDisplayRect () de PhotoView (construyendo una herramienta de recorte de fotos de android)
- Android Dividir el círculo en N partes iguales y conocer las coordenadas de cada punto de división
- Android Fourier Transform Realtime - Renderscript
- Almacene la orientación en una matriz y compare
- Convertir valores de ReplayGain a ajustes de volumen
- Detectar si está a un kilómetro del punto de interés
- Problema básico de conversión imperial
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);