9
votes

Calculez l'angle du point touché et faites-la pivoter dans Android

Math m'a vaincu à nouveau. C'est une tâche aussi simple, mais je ne peux pas réussir à le faire.

Scénario: Je dessine sur une vision de la vue une image ronde. L'utilisateur touche un point sur la bordure de l'image et commence à le faire glisser à l'ajustement. J'ai besoin de faire pivoter l'image de cercle en fonction du mouvement de l'utilisateur. J'ai deux informations importantes, les coordonnées X, Y Center X, Y et les coordonnées de points touchés.

Entrez la description de l'image ici

Comme vous pouvez le voir dans l'image, l'utilisateur a touché un point, en fonction de mon tirage, l'angle de point touché doit être d'environ 40. Je ne peux pas réussir à le calculer correctement.

J'ai essayé d'utiliser cette formule: xxx

Je ne peux pas réussir à comprendre comment je dois calculer l'angle, comme il est maintenant, Ne fonctionne pas correctement et les valeurs ne sont pas bonnes. Par exemple, dans le cas de l'image, le calcul de l'angle est de -50.

Merci de votre temps, toutes les informations sont volontiers prises.

Le: En fait, j'ai fait une erreur, comme mentionné ci-dessous. Si le cercle est comme:

Entrez la description de l'image ici >


1 commentaires

Pourquoi avez-vous 0 orienté nord?


6 Réponses :


6
votes

Tout d'abord, l'angle de rotation doit être déterminé par l'origine de CentreX, et de la centrale. Donc, votre (toucherie - CENTERY, ToucheDX - CentreX) devrait être (century - Touchedy, CentryX - TouchEdx).

et la bonne réponse peut être la suivante: xxx

espoir aide


1 commentaires

Compte tenu de la deuxième image, en utilisant votre formule, lorsque je passe sur le point tacdxy, l'angle renvoyé est: 130 ...



12
votes

Réfensions du problème: vous voulez trouver l'angle entre deux vecteurs. Le premier vecteur est le UPVecteur qui va Straigt à partir de votre point central ( u fort> u strong>), et le deuxième vecteur est le vecteur du point central au point tactile ( v strong>) .

Nous pouvons maintenant nous rappeler (ou Google) que P>

COS a em> = UV fort> / (| u | * | V |) p>

a em> est l'angle entre les vecteurs et | u fort> | est la longueur d'un vecteur. La upvector, u forte>, est (0, 1) et a une longueur 1. P>

multiplier les vecteurs à la main annule le terme X et nous donne quelque chose comme ça. P >

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


4 commentaires

UPVector ne doit pas être présumé comme aller droit.


Eh bien, c'est ce que OP voulait. Je laisse cela comme un exercice pour créer une fonction qui calcule l'angle avec un vecteur arbitraire.


math.acos renvoie l'angle de semi-cercle, envisageant d'utiliser math.atan2 .


Ouais, maintenant que je lisais à nouveau sa question cinq ans plus tard, il devrait simplement faire pivoter et captiver à 360 pour obtenir des valeurs attendues.



1
votes

Vous avez besoin de 3 points pour un angle. Vous n'avez que 2 (centre et contact). Choisissez un point 3ème fixe, par exemple celui à 90 sur votre image et utilisez la réponse de @ Vidstige pour trouver votre équation.


0 commentaires

1
votes

J'ai essayé beaucoup de choses à faire quelque chose comme ça et venir avec ceci:

Son obtention de la position de la vue au lieu du centre de l'écran, mais vous pouvez l'ajouter:

Tourner l'image Vue basée sur le point tactile: xxx


0 commentaires

1
votes
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
}
where touchX = event.getX and touchY = event.getY

0 commentaires

0
votes

ceci pour l'angle entre deux points de degré

angle = (math.atan2 (y2-y1, x2-x1) * 180 / math.pi)


0 commentaires