Учитывая 2 угла в диапазоне -PI -> PI вокруг координаты, каково значение наименьшего из 2 углов между ними?
Принимая во внимание, что разница между PI и -PI составляет не 2 PI, а ноль.
Пример:
Представьте себе круг с двумя линиями, выходящими из центра, между этими линиями есть 2 угла: угол, который они образуют внутри, то есть меньший угол , и угол, который они образуют снаружи, то есть больший угол. Оба угла при сложении образуют полный круг. Учитывая, что каждый угол может соответствовать определенному диапазону, какова величина меньших углов, принимая во внимание опрокидывание
language-agnostic
geometry
angle
Том Дж Новелл
источник
источник
Ответы:
Это дает знаковый угол для любых углов:
Остерегайтесь, что во многих языках
modulo
операция возвращает значение с тем же знаком, что и дивиденд (например, C, C ++, C #, JavaScript, полный список здесь ). Это требует специальнойmod
функции, например:Или так:
Если углы находятся в пределах [-180, 180], это также работает:
Более многословно:
источник
a -= 360*sgn(a)*(abs(a) > 180)
. (Если подумать, если у вас есть реализации без ветвейsgn
иabs
, тогда эта характеристика может фактически начать компенсировать необходимость в двух умножениях.)double targetA = 2; double sourceA = 359;
«а» будет равно -357,0 вместо 3,0х - целевой угол. у - исходный или начальный угол:
Возвращает подписанный дельта-угол. Обратите внимание, что в зависимости от вашего API порядок параметров для функции atan2 () может отличаться.
источник
x-y
дает вам разницу в углах, но она может выходить за пределы желаемых границ. Подумайте об этом угле, определяющем точку на круге единицы. Координаты этой точки являются(cos(x-y), sin(x-y))
.atan2
возвращает угол для этой точки (что эквивалентноx-y
), за исключением того, что ее диапазон равен [-PI, PI].Если ваши два угла равны x и y, то один из углов между ними - abs (x - y). Другой угол (2 * PI) - абс (x - y). Таким образом, значение наименьшего из 2 углов:
Это дает вам абсолютное значение угла и предполагает, что входные данные нормализованы (то есть: в пределах диапазона
[0, 2π)
).Если вы хотите сохранить знак (то есть: направление) угла, а также принять углы вне диапазона,
[0, 2π)
вы можете обобщить вышеприведенное. Вот код Python для обобщенной версии:Обратите внимание, что
%
оператор не ведет себя одинаково на всех языках, особенно когда задействованы отрицательные значения, поэтому при переносе могут потребоваться некоторые корректировки знака.источник
from math import tau
.Я подхожу к задаче предоставления подписанного ответа:
источник
Для пользователей UnityEngine самый простой способ - использовать Mathf.DeltaAngle .
источник
Арифметическое (в отличие от алгоритмического) решение:
источник
Эффективный код на C ++, который работает для любого угла и в радианах и градусах:
источник
Нет необходимости вычислять тригонометрические функции. Простой код на языке Си:
пусть dif = a - b, в радианах
пусть dif = a - b, в градусах
Нет греха, нет, потому что нет, загар, .... только геометрия !!!!
источник
arg = arg - PIV2;
расширяетсяarg = arg - M_PI + M_PI
и ничего не делает.