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. P>
p>
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. p>
J'ai essayé d'utiliser cette formule: p> 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. P> Merci de votre temps, toutes les informations sont volontiers prises. P> Le: En fait, j'ai fait une erreur, comme mentionné ci-dessous. Si le cercle est comme: p> P> P> P> P> P> P> P> P> >
6 Réponses :
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: p> espoir aide p> p>
Compte tenu de la deuxième image, en utilisant votre formule, lorsque je passe sur le point tacdxy, l'angle renvoyé est: 130 ...
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 ( Nous pouvons maintenant nous rappeler (ou Google) que P> COS a em> = UV fort> / (| u | * | V |) p> où a em> est l'angle entre les vecteurs et | 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);
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 code> renvoie l'angle de semi-cercle, envisageant d'utiliser
math.atan2 code>.
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.
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. P>
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: p>
Tourner l'image Vue basée sur le point tactile: p>
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
ceci pour l'angle entre deux points de degré p>
angle = (math.atan2 (y2-y1, x2-x1) * 180 / math.pi) code> p>
Pourquoi avez-vous 0 orienté nord?