У меня есть две функции, которые предназначены для хранения углов между (-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
Я пробовал поиграть с методами округления, но все равно не могу получить желаемый результат. Проблема очевидна, потому что иногда углы, с которыми я имею дело, только приблизительно близки к -π или π, и я получаю разрывы в моих результатах.
Любые предложения о том, как лучше всего реализовать функции обертывания углов с неисключительным нижним пределом и включающим верхним пределом?
x
. - person John Alexiou   schedule 01.09.2011