Obter ângulo em radianos dado um ponto em um círculo

14

Estou trabalhando em um mostrador que gira em torno de um círculo.

antes de clicar

Esse mostrador deve mover o mouse em qualquer lugar do círculo para ajustar a posição do mostrador em um ponto do círculo com o mesmo ângulo do clique. Por exemplo, no mostrador acima, se você clicar no ponto mostrado em rosa abaixo, moverei o mostrador acima desse ponto, mas no círculo.

depois do clique (rosa)

Eu sei como obter a posição de um ponto em um círculo, dado um raio e um ângulo (em radianos). Essa é a fórmula :

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

No entanto, estou procurando fazer o contrário - tenho um ponto de clique, que quero transformar em um ponto em um círculo (para onde o botão de controle vai). Estou tentando usar este ponto (e um determinado raio) para descobrir o ângulo em radianos, para que eu possa colocar o botão de controle no círculo no mesmo ângulo.

Existe uma fórmula útil que eu possa usar para fazer isso?

editor
fonte
Você está procurando a fórmula para obter um ângulo entre os pontos?
William Mariager
Você pode obter um ângulo entre dois pontos? Posso calcular a inclinação, mas acho que preciso de um terceiro ponto para criar um triângulo e usar uma função trigonômica inversa para resolver isso.
editor de
Publiquei uma resposta mostrando como fazê-lo.
William Mariager
3
O que você realmente tem aqui é o ângulo entre dois vetores . Ambos se originam do centro do círculo e têm a mesma magnitude (raio do círculo).
Michaelhouse
Aqui está a matemática por trás disso: funções trigonométricas inversas . atané uma abreviação de arctane atan2é apenas uma função que aceita argumentos individuais e faz a divisão para você.
voithos 7/08/12

Respostas:

25

Confira a função atan2 .

Ele fornece o ângulo entre (0, 0) e (x, y) xe yos argumentos da função.

Edit: se o centro do círculo não é (0, 0), não importa, basta fazer o seguinte: atan2(y - cy, x - cx).

jcora
fonte
Importa se o centro do meu círculo não está (0,0)? Suponho que apenas compensei os argumentos atan2conforme mostrado por @Luis abaixo?
editor de
Apenas traduza subtraindo. Veja a edição.
jcora
3
-1: O primeiro parâmetro para atan2 éy
Luis Estrada
2
Obrigado @LuisEstrada, acabei de corrigir. (Esperamos que você vai torná-lo um +1 :).)
jcora
+ Luis Estrada Desculpe por nnecro-bump isso, mas eu tive que agradecer. Estou tentando depurar meu programa há um dia e meio agora. Acontece que os argumentos atan2foram para trás!
precisa saber é o seguinte
8

Você precisa do centro do botão giratório e do ponto do cursor, juntamente com a função atan2 . Você o usa assim:

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