/* * Author: Andrey Pokidov * License: Apache-2.0 * Date: 18 Nov 2024 */ namespace BGC { public class RadianFP64 { public const double PI = 3.14159265358979324; public const double TWO_PI = 6.28318530717958648; public const double HALF_OF_PI = 1.57079632679489662; public const double THIRD_OF_PI = 1.04719755119659775; public const double FOURTH_OF_PI = 0.78539816339744831; public const double SIXTH_OF_PI = 0.523598775598298873; public const double DEGREES_IN_RADIAN = 57.2957795130823209; public const double TURNS_IN_RADIAN = 0.159154943091895336; public static double ToDegrees(double radians) { return radians * DEGREES_IN_RADIAN; } public static double ToTurns(double radians) { return radians * TURNS_IN_RADIAN; } public static double ToUnits(double radians, AngleUnit toUnit) { if (toUnit == AngleUnit.DEGREES) { return radians * DEGREES_IN_RADIAN; } if (toUnit == AngleUnit.TURNS) { return radians * TURNS_IN_RADIAN; } return radians; } public static double Normalize(double radians, AngleRange range) { if (range == AngleRange.UNSIGNED_RANGE) { if (0.0 <= radians && radians < TWO_PI) { return radians; } } else { if (-PI < radians && radians <= PI) { return radians; } } double turns = radians * TURNS_IN_RADIAN; turns -= Math.Floor(turns); if (range == AngleRange.SIGNED_RANGE && turns > 0.5) { turns -= 1.0; } return turns * TWO_PI; } } }