Получить угол в радианах с учетом точки на окружности

14

Я работаю над циферблатом, который вращается по кругу.

до нажатия

Этот циферблат позволяет перемещать мышь в любом месте круга, чтобы отрегулировать положение циферблата в точке на круге с тем же углом, что и щелчок. Например, на циферблате выше, если вы щелкнете по точке, показанной розовым цветом ниже, я бы переместил циферблат выше этой точки, но по кругу.

после клика (розовый)

Я знаю, как получить положение точки на окружности с учетом радиуса и угла (в радианах). Вот эта формула :

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

Тем не менее, я пытаюсь сделать что-то противоположное - у меня есть точка щелчка, которую я хочу превратить в точку на круге (куда идет ручка управления). Я пытаюсь использовать эту точку (и данный радиус), чтобы вычислить для нее угол в радианах, чтобы я мог поместить ручку управления на круг под тем же углом.

Есть ли удобная формула, которую я могу использовать для достижения этой цели?

редактор
источник
Вы ищете формулу, чтобы получить угол между точками?
Уильям Мариажер
Можете ли вы получить угол между двумя точками? Я могу рассчитать наклон, но я предположил, что мне нужна третья точка для создания треугольника и использования обратной тригономической функции для решения этой проблемы.
редактор
Я разместил ответ, показывающий, как это сделать.
Уильям Маригер
3
Здесь у вас есть угол между двумя векторами . Они оба происходят из центра круга и имеют одинаковую величину (радиус круга).
MichaelHouse
Вот математика, стоящая за этим: обратные функции триггера . atanэто сокращение от arctan, и atan2это просто функция, которая принимает отдельные аргументы, и делает разделение для вас.
voithos

Ответы:

25

Проверьте функцию atan2 .

Он дает вам угол между (0, 0) и (x, y) xи yявляется аргументом функции.

Edit: если центр окружности не является (0, 0), независимо от того, просто сделать это: atan2(y - cy, x - cx).

jcora
источник
Имеет ли значение, если центр моего круга не находится в (0,0)? Я предполагаю, что просто atan2сместил аргументы, как показано @Luis ниже?
редактор
Просто переведите путем вычитания. Смотрите редактирование.
Jcora
3
-1: первый параметр для atan2y
Луис Эстрада
2
Спасибо @LuisEstrada, я только исправил это. (Надеюсь, вы сделаете это +1. :))
jcora
+ Луис Эстрада Извините, но я не поболтал, но я должен был поблагодарить вас. Я пытался отлаживать свою программу уже полтора дня. Оказывается, аргументы atan2были задом наперед!
Carcigenicate
8

Вам нужен центр ручки и точка курсора вместе с функцией atan2 . Затем вы используете это так:

 angle = atan2(mouseY - knobCenterY, mouseX - knobCenterX)
Уильям Мариажер
источник