Angular math helpers for normalized astrological longitudes.
Summary
Functions
Converts degrees to radians.
Returns the absolute angular distance between two angles in degrees.
Decomposes an angle into degrees, minutes, and seconds.
Normalizes an angle to the range [0.0, 360.0).
Converts radians to degrees.
Returns the shortest signed angular distance from a to b in degrees.
Types
Functions
@spec deg_to_rad(number()) :: float()
@spec deg_to_rad(term()) :: angle_error()
Converts degrees to radians.
Returns {:error, :invalid_angle} when the value is not a number.
Examples
iex> Angelus.Angle.deg_to_rad(180.0)
:math.pi()
Returns the absolute angular distance between two angles in degrees.
The result is always in [0.0, 180.0]. Returns {:error, :invalid_angle}
if either argument is not a number.
Examples
iex> Angelus.Angle.distance(10.0, 350.0)
20.0
@spec dms(number()) :: {non_neg_integer(), non_neg_integer(), float()}
@spec dms(term()) :: angle_error()
Decomposes an angle into degrees, minutes, and seconds.
The input is first normalized to [0.0, 360.0) before decomposition.
Returns {:error, :invalid_angle} when the value is not a number.
Examples
iex> Angelus.Angle.dms(90.5)
{90, 30, 0.0}
@spec normalize(number()) :: float()
@spec normalize(term()) :: angle_error()
Normalizes an angle to the range [0.0, 360.0).
Returns {:error, :invalid_angle} when the value is not a number.
Examples
iex> Angelus.Angle.normalize(370.0)
10.0
iex> Angelus.Angle.normalize(-10.0)
350.0
@spec rad_to_deg(number()) :: float()
@spec rad_to_deg(term()) :: angle_error()
Converts radians to degrees.
Returns {:error, :invalid_angle} when the value is not a number.
Examples
iex> Angelus.Angle.rad_to_deg(:math.pi())
180.0
@spec signed_distance(number(), number()) :: float()
@spec signed_distance(term(), term()) :: angle_error()
Returns the shortest signed angular distance from a to b in degrees.
The result is in (-180.0, 180.0]. A positive value means b is ahead of
a in the counter-clockwise direction. Returns {:error, :invalid_angle} if
either argument is not a number.
Examples
iex> Angelus.Angle.signed_distance(10.0, 350.0)
-20.0
iex> Angelus.Angle.signed_distance(350.0, 10.0)
20.0