Математический форум Math Help Planet
Обсуждение и решение задач по математике, физике, химии, экономике Теоретический раздел |
Часовой пояс: UTC + 3 часа [ Летнее время ] |
новый онлайн-сервис число, сумма и дата прописью |
|
Часовой пояс: UTC + 3 часа [ Летнее время ] |
Страница 1 из 1 |
[ Сообщений: 9 ] |
|
Автор | Сообщение | |
---|---|---|
LndBochkarev |
|
|
Есть точка n1(х1, у1). Объект перемещается в точку n2(х2 у2). Нужно вычислить угол вектора из точки n1 в n2 относительно оси y где север = 0/360 градусов, восток - 90, юг - 180 запад - 270. Вычислять этот угол мне требуется программно. Я без проблем могу написать код для четырёх частных случаев и, вероятно, так по-быстрому и сделаю в виде вычисления тангенса, определения четверти(юго-запад и т.д.), перевода тангенса в градусы, прибавки четвертей(90 градусов) с нулевой позиции. Вопрос, может ли кто-то подсказать более эффективный способ вычисления направления вектора в моём случае? |
||
Вернуться к началу | ||
atlakatl |
|
|
Вернуться к началу | ||
searcher |
|
|
atlakatl
И какова область значения арктангенса? Чуток формулу подправить надо. |
||
Вернуться к началу | ||
atlakatl |
|
|
searcher
Если проекции x1 и x2 на стрелку совпадают, то функция значения не имеет. Но это же значит, что [math]\alpha =\frac{ \pi }{ 2 }[/math] |
||
Вернуться к началу | ||
LndBochkarev |
|
|
atlakatl писал(а): xDiff = x - xPrev; yDiff = y - yPrev; radians = Math.Atan(yDiff / xDiff); degrees = radians * (180 / Math.PI); Получаю при этом: north = 90, south = -90, east = west = 0. NE = SW = 45, NW = SE = -45. Не совсем понимаю как я могу данную формулу использовать, так как я не получаю ни ожидаемого результата, ни возможности как-то преобразовать данный результат в желаемый. Должно быть как сейчас у меня с обработкой частных случаев работает: N = 0, NE = 45, E = 90, SE = 135 и так до 359,(9). К примеру частный случай на x > 0, y <= 0: radians = Math.Abs(Math.Atan2(yDiff, xDiff)); degrees = (radians * (180 / Math.PI)) + 90; |
||
Вернуться к началу | ||
Booker48 |
|
|
Я правильно понимаю, что углы у вас отсчитываются в направлении, обратном общепринятому? Т.е. если встать лицом на север, то восток у вас слева, а не справа? А север совпадает с направлением роста координат на оси абсцисс?
|
||
Вернуться к началу | ||
Booker48 |
|
|
Короче, если это так, то можно результирующий угол записать одной формулой. Не уверен, правда, что в вычислительном смысле это будет экономней.
[math]\alpha = \frac{180}{\pi} \operatorname{arctg}{\frac{y_2-y_1}{x_2-x_1}} + 90 (3 +\operatorname{sgn}(x_2-x_1)) \pmod{360}[/math] По модулю берётся всё, что справа от знака равенства. Модуль нужен, чтобы загнать угол в пределы [math]0^{\circ} - 360^{\circ}[/math]. Направление на чистый восток-запад формула, естественно, не даёт (деление на 0 и всё такое), это нужно отдельно считать. |
||
Вернуться к началу | ||
За это сообщение пользователю Booker48 "Спасибо" сказали: LndBochkarev |
||
LndBochkarev |
|
|
Booker48
Записал данную формулу как: xDiff = x - xPrev; yDiff = y - yPrev; degrees = (180 / Math.PI * Math.Atan(yDiff / xDiff) + 90 * (3 + Math.Sign(xDiff))) % 360; Получаю такие результаты: north = 0, south = 180, east = 180, west = 0. NE = 45, SE = 315, SW = 225, NW = 135. Функция выполняет вычисление всех значений, кроме сторон с 90 и 270 градусами. Может помочь мне в будущем сократить мою серию if/else выражений. Спасибо. Не понял комментария про направление отсчёта и стороны света. Не знаю ничего про общепринятое направление отсчёта, но мне было бы удобно вести отсчёт с севера и по часовой стрелке. В целом это не особо важно, лишь бы можно было направление определить. Стороны света я указываю как на компасе: https://upload.wikimedia.org/wikipedia/ ... st.svg.png |
||
Вернуться к началу | ||
Booker48 |
|
|
LndBochkarev писал(а): Функция выполняет вычисление всех значений, кроме сторон с 90 и 270 градусами. Ну да, я об этом и предупредил в последней фразе. Даже странно, что программа что-то выдала для точек с равными абсциссами, по идее должно быть какая-нибудь divide-by-zero error. LndBochkarev писал(а): Не знаю ничего про общепринятое направление отсчёта, но мне было бы удобно вести отсчёт с севера и по часовой стрелке. Север принято указывать вверху, восток справа (см. глобус ). Но в прямоугольной системе координат вышеуказанными (не только мной, но и другими участниками темы) формулами задаётся угол наклона прямой (ну, или вектора в вашем случае) к оси абсцисс. Т.е. [math]0^{\circ}[/math] — это справа, а не вверху. И увеличение угла идёт не по, а против часовой стрелки. Так что если вам надо указывать углы как на приведённой вами картинке компаса, то вам надо а) изменить условие поставленной вами задачи (у вас не как на компасе, почему я и переспросил); б) поправить формулу так, чтобы она ему соответствовала. |
||
Вернуться к началу | ||
[ Сообщений: 9 ] |
Часовой пояс: UTC + 3 часа [ Летнее время ] |
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |