найти точку на круге по градусам?

Допустим, у нас есть система координат 100x100, как показано ниже. 0,0 - его левый верхний угол, 50,50 - его центральная точка, 100,100 - его нижний правый угол и т. Д.

Теперь нам нужно провести линию от центра кнаружи. Мы знаем угол линии, но нам нужно вычислить координаты ее конечной точки. Как вы думаете, как это лучше всего сделать?

Например, если угол линии составляет 45 градусов, координаты конечной точки будут примерно 75,15.

введите описание изображения здесь


person Roger    schedule 08.06.2011    source источник
comment
Появляется дикая тригонометрия! В тригонометрии использовались синус и косинус! Это суперэффективно!   -  person Matt Ball    schedule 08.06.2011
comment
Хотя ваш вопрос довольно простой, вы можете задавать вопросы по математике на сайте www.mathoverflow.com.   -  person Pedery    schedule 08.06.2011
comment
В этом случае получение реализации кода для выполнения математических расчетов может потребовать запроса здесь?   -  person Wouter Simons    schedule 08.06.2011


Ответы (3)


Вам необходимо использовать тригонометрические функции sin и cos.

Что-то вроде этого:

theta = 45
// theta = pi * theta / 180      // convert to radians.
radius = 50
centerX = 50
centerY = 50
p.x = centerX + radius * cos(theta)
p.y = centerY - radius * sin(theta)

Имейте в виду, что большинство реализаций предполагают, что вы работаете с радианами и положительный y указывает вверх.

person aioobe    schedule 08.06.2011
comment
@aioobe Вы отредактировали свой ответ с ошибкой centerY - radius * sin(theta) shoud be centerY + radius * sin(theta) - person thinklinux; 24.03.2016
comment
@aioobe Вы делаете это только для того, чтобы изменить начало координат y, чтобы y начинался сверху, а не из центра. Но это должно быть сделано с переменной centerY, которая предназначена для исходной точки, поэтому вы можете сохранить знак + в уравнении, потому что он правильный, и вместо этого изменить centerY на -50 :) Вы можете увидеть принятый ответ здесь stackoverflow.com/questions/839899/ Если вы оставите это так, то будет непонятно, как изменить происхождение для y. - person thinklinux; 24.03.2016
comment
Я делаю это потому, что ось Y перевернута. Ответ ниже делает то же самое. - person aioobe; 24.03.2016

Используйте единичный круг для вычисления X и Y, но, поскольку ваш радиус равен 50, умножьте его на 50.

http://en.wikipedia.org/wiki/Unit_circle

Добавьте смещение (50,50) и ваш дядя Боб

X = 50 + (cos(45) * 50) ~ 85,36
Y = 50 - (sin(45) * 50) ~ 14,65

Выше было 45 градусов.

РЕДАКТИРОВАТЬ: только что увидел, что ось Y перевернута

person Wouter Simons    schedule 08.06.2011
comment
PS: Я вижу некоторые комментарии относительно радианов в реализациях. Самый простой способ преобразовать градусы в радианы - это поискать макрос или что-то еще в вашей реализации. Часто бывает что-то вроде deg_to_rad или что-то в этом роде. Если нет, используйте математический аргумент: pi * x / 180 или x * (pi/180). - person Wouter Simons; 08.06.2011

Сначала вам нужно вычислить координаты X и Y, как если бы круг был единичным кругом (радиус 1). Координата X данного угла задается как cos(angle), а координата Y задается как sin(angle). Большинство реализаций sin и cos принимают свои входные данные в радианах, поэтому преобразование необходимо (1 градус = 0,0174532925 радиан). Теперь, поскольку ваша система координат на самом деле не является единичным кругом, вам нужно умножить полученные значения на радиус вашего круга. В данном случае вы должны умножить на 50, поскольку ваш круг простирается на 50 единиц в каждом направлении. Наконец, при использовании системы координат единичного круга предполагается, что ваш круг центрирован в начале координат (0,0). Чтобы учесть это, добавьте (или вычтите) смещение вашего центра из рассчитанных вами координат X и Y. В вашем сценарии смещение от (0,0) составляет 50 в положительном направлении X и 50 в отрицательном направлении Y.

Например:

cos(45) = x ~= .707
sin(45) = y ~= .707

.707*50 = 35.35

35.35+50 = 85.35
abs(35.35-50) = 14.65

Таким образом, координаты конечного сегмента будут (85,35, 14,65).

Обратите внимание, что на выбранном вами языке, вероятно, есть встроенная функция преобразования градусов в радианы, я предоставил преобразование единиц для справки.

изменить: ой, сначала использовали градусы

person Ben Siver    schedule 08.06.2011