У меня есть две функции, которые должны содержать углы между (-180,180] и (-π, π]. Цель состоит в том, чтобы при любом угле от -inf до + inf он сохранял эквивалентный угол в указанных интервалах. Например, угол для 1550 ° составляет 110 °.
public double WrapBetween180(double angle)
{
return angle - 360d * Math.Round(angle / 360d, MidpointRounding.AwayFromZero);
}
public double WrapBetweenPI(double angle)
{
const double twopi = 2d * Math.PI;
return angle - twopi * Math.Round(angle / twopi, MidpointRounding.AwayFromZero);
}
, который дает следующие результаты
WrapBetween180(-180) = -180
WrapBetween180( 180) = 180
WrapBetweenPI(-Math.PI) = Math.PI
WrapBetweenPI( Math.PI) = -Math.PI
ничего из того, чего я хочу. То, что я хотел, это:
WrapBetween180(-180) = 180
WrapBetween180( 180) = 180
WrapBetweenPI(-Math.PI) = Math.PI
WrapBetweenPI( Math.PI) = Math.PI
Я попробовал поиграть с методами округления, но все еще не могу получить желаемые результаты. Проблема очевидна, потому что иногда углы, с которыми я имею дело, только приблизительно близки к -π или π, и я получаю разрывы, если мои результаты.
Какие-либо предложения о том, как наилучшим образом реализовать функции обтекания углов с неисключительным нижним пределом и включительно высокими ограничениями?