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.

Figura 1

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.

Figura 2

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.

figura 3

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)]

  • Android Fourier Transform Realtime - Renderscript
  • ¿Cómo calcular la posición en un círculo con un cierto ángulo?
  • MathML y ​​Java
  • Obtener los siguientes N puntos geográficos más cercanos
  • 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
  • ¿Cómo determino qué triángulo tocó el usuario en este rectángulo?
  • Android getOrientation Azimut se contamina cuando el teléfono está inclinado
  • Cómo convertir de fracción de la cadena formateada en Decimal o Float en Java?
  • Mover la mano Minuto en el reloj de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.