Obtenir l'angle en radians étant donné un point sur un cercle

14

Je travaille sur un cadran qui tourne autour d'un cercle.

avant de cliquer

Ce cadran devrait vous permettre de vous déplacer n'importe où dans un cercle pour ajuster la position du cadran à un point du cercle avec le même angle que le clic. Par exemple, à partir du cadran ci-dessus, si vous avez cliqué sur le point indiqué en rose ci-dessous, je déplacerais le cadran au-dessus de ce point mais sur le cercle.

après clic (rose)

Je sais comment obtenir la position d'un point sur un cercle étant donné un rayon et un angle (en radians). Voilà cette formule :

x = Cos(angle) * radius + CenterX;
y = Sin(angle) * radius + CenterY;

Cependant, je cherche à faire un peu l'inverse - j'ai un point de clic, que je veux transformer en un point sur un cercle (où va le bouton de commande). J'essaie d'utiliser ce point (et un rayon donné) pour déterminer l'angle en radians pour cela, afin de pouvoir placer le bouton de commande sur le cercle au même angle.

Existe-t-il une formule pratique que je peux utiliser pour y parvenir?

éditeur
la source
Cherchez-vous la formule pour obtenir un angle entre les points?
William Mariager
Pouvez-vous obtenir un angle entre deux points? Je peux calculer la pente, mais je suppose que j'ai besoin d'un troisième point pour créer un triangle et utiliser une fonction trigonomique inverse pour résoudre ce problème.
éditeur
J'ai posté une réponse montrant comment le faire.
William Mariager
3
Ce que vous avez vraiment ici, c'est l' angle entre deux vecteurs . Ils proviennent tous les deux du centre du cercle et ont la même amplitude (rayon du cercle).
MichaelHouse
Voici les mathématiques derrière cela: fonctions trig inverses . atanest l'abréviation de arctan, et atan2est juste une fonction qui accepte des arguments individuels et fait la division pour vous.
voithos

Réponses:

25

Découvrez la fonction atan2 .

Il vous donne l'angle entre (0, 0) et (x, y), xet yétant les arguments de la fonction.

Edit: si le centre du cercle est pas (0, 0), peu importe, faire ceci: atan2(y - cy, x - cx).

jcora
la source
Est-ce important si le centre de mon cercle n'est pas là (0,0)? Je suppose que je viens de compenser les arguments atan2comme indiqué par @Luis ci-dessous?
éditeur
Traduisez simplement en soustrayant. Voir l'édition.
jcora
3
-1: Le premier paramètre pour atan2 esty
Luis Estrada
2
Merci @LuisEstrada, je viens de le corriger. (J'espère que vous en ferez un +1. :))
jcora
+ Luis Estrada Désolé de nnecro-bump cela, mais je devais vous remercier. J'essaie de déboguer mon programme depuis un jour et demi maintenant. Il s'avère que les arguments atan2étaient en arrière!
Carcigenicate
8

Vous avez besoin du centre du bouton et de la pointe du curseur ainsi que de la fonction atan2 . Vous l'utilisez ensuite comme ceci:

 angle = atan2(mouseY - knobCenterY, mouseX - knobCenterX)
William Mariager
la source