Obtener el ángulo en radianes dado un punto en un círculo

14

Estoy trabajando en un dial que gira alrededor de un círculo.

antes de hacer clic

Este dial debería permitirle mover el mouse a cualquier parte del círculo para ajustar la posición del dial a un punto del círculo con el mismo ángulo que el clic. Por ejemplo, desde el dial de arriba si hace clic en el punto que se muestra en rosa debajo, movería el dial sobre ese punto pero en el círculo.

después de hacer clic (rosa)

Sé cómo obtener la posición de un punto en un círculo dado un radio y un ángulo (en radianes). Esa es esta fórmula :

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

Sin embargo, estoy buscando hacer algo de lo contrario: tengo un punto de clic, que quiero convertir en un punto en un círculo (donde va la perilla de control). Estoy tratando de usar este punto (y un radio dado) para calcular el ángulo en radianes, de modo que pueda colocar la perilla de control en el círculo en el mismo ángulo.

¿Hay alguna fórmula útil que pueda usar para lograr esto?

editor
fuente
¿Estás buscando la fórmula para obtener un ángulo entre puntos?
William Mariager
¿Puedes obtener un ángulo entre dos puntos? Puedo calcular la pendiente, pero supongo que necesito un tercer punto para crear un triángulo y usar una función trigonométrica inversa para resolver esto.
editor
Publiqué una respuesta que muestra cómo hacerlo.
William Mariager
3
Lo que realmente tienes aquí es el ángulo entre dos vectores . Ambos se originan en el centro del círculo y tienen la misma magnitud (radio del círculo).
MichaelHouse
Aquí están las matemáticas detrás de esto: funciones trigonométricas inversas . atanes la abreviatura de arctan, y atan2es solo una función que acepta argumentos individuales, y hace la división por usted.
voithos

Respuestas:

25

Echa un vistazo a la función atan2 .

Le da el ángulo entre (0, 0) y (x, y), xy yser los argumentos de la función.

Editar: si el centro del círculo no es (0, 0), no importa, simplemente hacer esto: atan2(y - cy, x - cx).

jcora
fuente
¿Importa si el centro de mi círculo no está en (0,0)? Supongo que acabo de compensar los argumentos atan2como se muestra en @Luis a continuación.
editor
Solo traduce restando. Ver la edición.
jcora
3
-1: El primer parámetro para atan2 esy
Luis Estrada
2
Gracias @LuisEstrada, lo acabo de corregir. (Ojalá lo conviertas en un +1. :))
jcora
+ Luis Estrada Perdón por hacer esto, pero tenía que agradecerte. He estado tratando de depurar mi programa durante un día y medio. Resulta que los argumentos atan2fueron al revés!
Carcigenicate
8

Necesita el centro del mando y el punto del cursor junto con la función atan2 . Luego lo usas así:

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