Rectángulo Coordina con Respecto al Ángulo de Rotación
Estoy tratando de crear componentes personalizados en Android usando Surfaceview y dibujo de lienzo. Los componentes son re-dimensionables y giratorios tocando. Considere la posibilidad de crear una vista de imagen. Sus bordes superior, derecho, inferior y izquierdo son escalables tocando y arrastrando el borde requerido. Estoy usando RectF
para guardar los límites del componente, para la rotación estoy usando el canvas.rotate(angle, bounds.centerX(),bounds.centerY())
. El problema es que al cambiar el tamaño del borde superior, los bordes de Let, Right y Bottom deben estar fijos, y no puedo fijarlo si el ángulo de rotación es distinto de 0 grados. Necesito una solución matemática para averiguar las coordenadas x, y de un rectángulo girado con respecto a los límites del rectángulo real.
Puedo explicarlo con la ayuda de algunas imágenes. La siguiente figura muestra dos rectángulos cuyos límites también se conocen y se muestran en los respectivos colores. Considere el Rect Verde como los componentes de los límites iniciales, es decir. Girado por -45 grados, el centro es (10,10) . Ahora va a cambiar el tamaño del borde superior del rectángulo y se muestra en la siguiente figura 2.
- 1000 * 60 * 60 * 24 * 30 resultados en un número negativo
- MathML y Java
- Configuración de la alarma en base mensual android
- ¿Debo confiar en Android para descartar los sorteos fuera de pantalla?
- Dibuja un camino curvo en la lona?
De la Figura 2 se entiende que la posición Y se reduce a 4 desde 6. El Rectángulo girado también se muestra en color rosa. Recuerde que estoy haciendo el cambio de tamaño mientras el componente está en el ángulo de rotación de -45 grados, por lo que al arrastrar las posiciones izquierda, derecha e inferior del rectángulo superior no debe cambiarse . Por lo tanto, el Rectángulo Rosa de la Figura 2 debería tener las coordenadas Izquierda, Derecha e Inferior igual que el Rectángulo Verde de la Figura 1 . La comparación del rectángulo obtenido y esperado se muestra en la Figura 3.
En la figura 3, el rectángulo de color amarillo es el esperado / requerido . El rectángulo obtenido color rosa se desplaza hacia arriba en comparación con el rectángulo girado Verde y que varía depende del ángulo de rotación .
- Tengo ángulo de rotación = -45 grados
- Límites del rectángulo real (no redimensionado).
- Límites del rectángulo real (no redimensionado) en rotación = -45 grados.
- Límites del rectángulo Re-clasificado.
- Límites de tamaño del rectángulo en rotación = -45 grados.
Cómo calculo los límites / centro del rectángulo amarillo. ¿Para que pueda implementar el cambio de tamaño de mis componentes correctamente? Hágamelo saber si hay alguna matemática que se pueda aplicar?
Los puntos / coordenadas requeridos están marcados como círculos de color rojo en la figura 3.
- La mejor práctica para calcular la velocidad media de las coordenadas GPS
- ¿Cómo mostrar fórmulas matemáticas en mi aplicación Android?
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- Comprender claramente el cálculo de la matriz
- Cómo convertir de fracción de la cadena formateada en Decimal o Float en Java?
- Android getOrientation Azimut se contamina cuando el teléfono está inclinado
- Android Dividir el círculo en N partes iguales y conocer las coordenadas de cada punto de división
- Calcular el ángulo del punto tocado y rotarlo en Android
Todos los colores de esta respuesta se refieren a su figura 3.
Si he entendido su pregunta correctamente, usted sabe cómo calcular todos los detalles sobre el rectángulo de color rosa, así como el rectángulo verde. Así que simplemente tomar la diferencia entre una esquina del rectángulo de color rosa y la esquina correspondiente del rectángulo verde. Si se añade la diferencia (un vector de dos elementos, es decir, la diferencia xy y por separado) al centro del rectángulo rosa, se obtendrá el centro deseado del triángulo amarillo.
Si necesita calcular las dimensiones del rectángulo rosado también, es posible que desee hacerlo en el sistema de coordenadas no girado. Tome su rectángulo verde junto con las coordenadas del punto hacia el que desea extender el rectángulo y gírelos hacia atrás en + 45 °. A continuación, puede extender la altura del rectángulo al valor deseado, lo que le dará el rectángulo azul, ya partir de ese rotación del rectángulo rosa.
La clave es la siguiente: "No puedo arreglarlo si el ángulo de rotación es distinto de 0 grados".
Digamos que su rectángulo se gira 10 grados.
1) gire la coordenada del ratón alrededor de un punto en la pantalla de -10 grados
2) gire el centro del rectángulo en -10 grados
… ahora redujo el problema a un rectángulo que está en 0 grados. El rectángulo movido, sí, el ratón se movió, pero son relativos entre sí como deberían ser.
3) Ahora haga la manipulación del rectángulo. El centro del rectángulo se desplazará.
4) Gire el centro del nuevo rectángulo en 10 grados
De esta manera usted no tiene que pensar en ello y siempre está trabajando en coordenadas no giradas.
El punto de [x, y]
girado por el ángulo a
terminará en [x*cos(a) - y*sin(a), x*sin(a) + y*cos(a)]
- Ejemplo de programa para android Parche relajante usando xml API
- No se puede comprar en el producto de la aplicación de Google Play