Calcular el ángulo del punto tocado y rotarlo en Android

Las matemáticas me han derrotado una vez más. Esta es una tarea tan simple, pero no puedo lograr hacerlo.

Escenario: dibujo en un SurfaceView una imagen redonda. El usuario toca un punto en el borde de la imagen y empieza a arrastrarlo adround. Necesito girar la imagen circular según el movimiento del usuario. Tengo dos información importante, el centro de la imagen X, coordenadas Y y las coordenadas de los puntos tocados.

Introduzca aquí la descripción de la imagen

Como se puede ver en la imagen, el usuario tocó un punto, de acuerdo con mi dibujo el ángulo de punto tocada debe ser alrededor de 40. No puedo manejar para calcularlo correctamente.

He intentado usar esta fórmula:

angle = Math.atan2(touchedY - centerY, touchedX - centerX) * 180 / Math.PI 

No puedo entender cómo debo calcular el ángulo, como es ahora, no funciona correctamente y los valores no son buenos. Por ejemplo, en el caso de la imagen, el ángulo calculado es -50.

Gracias por su tiempo, cualquier información es feliz.

LE: En realidad he cometido un error, creo, como se menciona a continuación. Si el círculo es como:

Introduzca aquí la descripción de la imagen

Vamos a reformular el problema: Usted quiere encontrar el ángulo entre dos vectores. El primer vector es el upvector que va straigt para arriba de su centro-punto ( u ), y el segundo vector es el vector del punto del centro al punto del tacto ( v ).

Ahora podemos recordar (o google) que

Cos a = uv / (| u | * | v |)

Donde a es el ángulo entre los vectores y | U Es la longitud de un vector. El upvector, u , es (0, 1) y tiene longitud 1.

La multiplicación de los vectores a mano cancela el término x y nos da algo así.

 double tx = touch_x - center_x, ty = touch_y - center_y; double t_length = Math.sqrt(tx*tx + ty*ty); double a = Math.acos(ty / t_length); 

Observe cómo el vector v se obtiene restando el punto central del punto de contacto. Recuerde convertir a grados si es necesario.

En primer lugar, el ángulo de rotación debe estar determinado por el origen de CenterX y CenterY. Por lo tanto, su (touchedY – centerY, touchedX – centerX) debe ser (centerY – touchedY, centerX – touchedX).

Y la respuesta correcta puede ser:

 (int) (Math.toDegrees(Math.atan2(centerY - touchedY, centerX - touchedX))); 

Espero eso ayude

Necesitas 3 puntos para un ángulo. Sólo tienes 2 (centro y táctil). Elija un tercer punto fijo, por ejemplo el de 90 en su imagen, y use la respuesta de @vidstige para encontrar su ecuación.

He intentado muchas cosas para hacer algo así y vengo con esto:

Su conseguir la posición de la visión en vez del centro de la pantalla, pero usted puede addapt él:

GIRAR LA VISTA DE LA IMAGEN BASADA EN EL PUNTO DE TACTO:

  iv = (ImageView) findViewById(R.id.soldier); // img view to rotate int touch_x = (int) event.getX(); // touch point x int touch_y = (int) event.getY(); // touch point y int[] location = new int[2]; iv.getLocationInWindow(location); // get img location on screen float angle = (float) Math.toDegrees(Math.atan2( touch_x - location[0], touch_y - location[1])); if(angle < 0){ angle += 360; } iv.setRotation(-angle); 
 private fun getAngle(touchX: Float, touchY: Float): Double { var angle: Double val x2 = touchX - centerX val y2 = touchY - centerY val d1 = Math.sqrt((centerY * centerY).toDouble()) val d2 = Math.sqrt((x2 * x2 + y2 * y2).toDouble()) if (touchX >= centerX) { angle = Math.toDegrees(Math.acos((-centerY * y2) / (d1 * d2))) } else angle = 360 - Math.toDegrees(Math.acos((-centerY * y2) / (d1 * d2))) return angle } 

Donde touchX = event.getX y touchY = event.getY

  • Mostrar una buena fórmula de matemáticas en Android
  • Obtener los siguientes N puntos geográficos más cercanos
  • Cómo convertir de fracción de la cadena formateada en Decimal o Float en Java?
  • Calcular la distancia entre dos puntos directamente en SQLite
  • Latitud / Longitud y metros
  • Almacene la orientación en una matriz y compare
  • ¿Debo confiar en Android para descartar los sorteos fuera de pantalla?
  • Mover la mano Minuto en el reloj de Android
  • Android Dividir el círculo en N partes iguales y conocer las coordenadas de cada punto de división
  • Problema básico de conversión imperial
  • ¿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.