Uzyskaj kąt w radianach z danym punktem na okręgu

14

Pracuję nad tarczą, która obraca się wokół koła.

przed kliknięciem

To pokrętło powinno umożliwiać ruch myszką w dowolnym miejscu koła, aby dopasować położenie pokrętła do punktu na okręgu pod tym samym kątem co kliknięcie. Na przykład z powyższej tarczy, jeśli klikniesz miejsce pokazane na różowo poniżej, przesunęłem tarczę nad ten punkt, ale na kółko.

po kliknięciu (różowy)

Wiem, jak uzyskać pozycję punktu na okręgu, biorąc pod uwagę promień i kąt (w radianach). Oto ta formuła :

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

Jednak chcę zrobić coś wręcz przeciwnego - mam punkt kliknięcia, który chcę zmienić w punkt na kole (tam, gdzie idzie gałka kontrolna). Próbuję użyć tego punktu (i danego promienia), aby obliczyć kąt w radianach, aby móc ustawić pokrętło sterujące na okręgu pod tym samym kątem.

Czy istnieje przydatna formuła, której mogę użyć, aby to osiągnąć?

redaktor
źródło
Czy szukasz wzoru pozwalającego uzyskać kąt między punktami?
William Mariager
Czy potrafisz uzyskać kąt między dwoma punktami? Potrafię obliczyć nachylenie, ale zgaduję, że potrzebuję trzeciego punktu, aby utworzyć trójkąt i użyć odwrotnej funkcji trygonomicznej, aby rozwiązać ten problem.
redaktor
Wysłałem odpowiedź pokazującą, jak to zrobić.
William Mariager,
3
To, co naprawdę masz tutaj, to kąt między dwoma wektorami . Oba pochodzą ze środka koła i mają tę samą wielkość (promień koła).
MichaelHouse
Oto matematyka: odwrotne funkcje trygonometryczne . atanjest skrótem od arctani atan2jest tylko funkcją, która akceptuje poszczególne argumenty i dokonuje podziału za ciebie.
voithos

Odpowiedzi:

25

Sprawdź atan2 .

Daje ci kąt pomiędzy (0, 0) a (x, y), x i yjest argumentem funkcji.

Edit: jeśli środek okręgu nie jest (0, 0), bez względu na to, po prostu to zrobić: atan2(y - cy, x - cx).

jcora
źródło
Czy to ma znaczenie, jeśli środek mojego koła nie znajduje się w (0,0)? Zgaduję, że właśnie przesunąłem argumenty, atan2jak pokazano poniżej przez @Luis?
redaktor
Po prostu przetłumacz, odejmując. Zobacz edycję.
jcora,
3
-1: Pierwszy parametr dla atan2 toy
Luis Estrada
2
Dzięki @LuisEstrada, właśnie to poprawiłem. (Mam nadzieję, że zrobisz to +1. :))
jcora,
+ Luis Estrada Przepraszam, że nnecro-bump to, ale musiałem ci podziękować. Próbuję debugować mój program od półtora dnia. Okazuje się, że argumenty atan2były zacofane!
Carcigenicate
8

Potrzebny jest środek gałki i punkt kursora wraz z funkcją atan2 . Następnie użyj go w następujący sposób:

 angle = atan2(mouseY - knobCenterY, mouseX - knobCenterX)
William Mariager
źródło