QP  0.7-SNAPSHOT
Control software for the ??SRT telescope
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
Public Types | Public Member Functions | Static Public Member Functions | List of all members
Position Class Reference

The Position class allows us to represent positions on the celestial sphere (or on Earth, at a push). More...

#include <position.h>

Public Types

enum  System {
  _Natural, TopoPolar, AzAlt, EqPolar,
  HADec, RADec, Geog, Velocity,
  _Null
}
 The known coordinate systems. More...
 

Public Member Functions

 Position (double lon, double lat, System system, System into_system=_Natural)
 Create a new pair of angles. More...
 
double lon (void) const
 The azimuthal coordinate. More...
 
double lat (void) const
 The latitudinal coordinate.
 
System system (void) const
 The coordinate system in which this position is expressed.
 
bool is_null_p (void) const
 Test if the Position is a 'null' one.
 
void set_observatory (const Position &)
 Set the observatory position, for a subsequent call to to_system. More...
 
void set_reftime (const AstroTime &)
 Set the reference time, for a subsequent call to to_system. More...
 
Position to_system (System into_system) const
 Return another Position, in the given system. More...
 

Static Public Member Functions

static Position get_null (void)
 Return a 'null' Position, which can be used as a sentinel value.
 

Detailed Description

The Position class allows us to represent positions on the celestial sphere (or on Earth, at a push).

We're able to support a subset of coordinate conversions.

Member Enumeration Documentation

The known coordinate systems.

enum explanation
TopoPolar horizontal coordinate system: longitude is azimuthal coordinate of spherical polar coordinates (east of south, in range [0,2pi]); latitude is north of horizontal
AzAlt horizontal coordinate system: azimuth (azimuth is east of north, in range [0,2pi]) and altitude (north of horizontal)
HADec equatorial: LHA (west-positive) and Declination
EqPolar equatorial: same as HADec, but longitude is negative HA, thus the azimuthal coordinate of spherical polars, but in a right-handed equatorial frame with zero longitude on the meridian
RADec equatorial: Right Ascension and Declination
Geog geographic: latitude and east longitude
Velocity the coordinates are velocities in a right-handed system, in rad/sec

(the _Natural and _Null systems are placemarkers, and should not be used externally to this class implementation).

Constructor & Destructor Documentation

Position::Position ( double  lon,
double  lat,
System  system,
System  into_system = _Natural 
)

Create a new pair of angles.

The lon and lat attributes are a pair of angles giving longitude and latitude, in radians.

There is limited support for converting between systems, the set of possible 'conversions' is rather ad-hoc, and any impermissible ones call fatal().

The system argument to this constructor indicates the coordinate system in which the two angle arguments are expressed, and the into_system argument indicates the system of the resulting object. If the into_system argument is not provided, then both TopoPolar and AzAlt coordinates are turned into TopoPolar, and both HADec and EqPolar arguments into HADec. If the fourth argument is present, then TopoPolar and AzAlt coordinates are interconvertible, as are HADec and EqPolar. For conversions between those pairs, see to_system.

After these conversions, the .lon and .lat values are initialised in their appropriately adjusted form. Thus (writing degrees instead of radians, for convenience): after Position(10, 30, AzAlt), the .lon is +170 and .lat is +30; after Position(200, 30, AzAlt), the .lon is +340; after Position(-10, 30), the .lon is +350; after Position(10, 30, HADec), the .lon is +350 and .lat is +30.

In all cases, the longitude is normalised into [0,2pi), and the latitude is forced to be in [-pi/2,pi/2].

FIXME: Tidyups/refactoring: the Position class is now over-complicated, with far too much fiddly branching. Or is it? Things like TrackingSchedule need specific documentation concerning which coordinate system the arguments are in, with the result that rotation-by-colatitude happens in multiple places (and I always get the signs wrong first time). I can't help feeling these should be in a single place, but every time I conclude that single place is 'in the Position class', I end up with a mess in here.

Parameters
lonthe longitudinal angle in the specified system
latthe latitudinal angle in the specified system
systemthe system in which the above two arguments are expressed
into_systemthe system in which the resulting Position object holds its coordinates

Member Function Documentation

double Position::lon ( void  ) const
inline

The azimuthal coordinate.

This is east-positive, from the reference position, which has zero degrees at south.

void Position::set_observatory ( const Position obs)

Set the observatory position, for a subsequent call to to_system.

It is a fatal error if this is not set before a subsequent conversion to AzAlt coordinates.

The position must be in the Geog system.

See also
Position::System
void Position::set_reftime ( const AstroTime t)

Set the reference time, for a subsequent call to to_system.

It is a fatal error if this is not set before a subsequent conversion from RA-Dec coordinates.

Position Position::to_system ( Position::System  into_system) const

Return another Position, in the given system.

Depending on the conversion, it may be necessary to have called set_reftime (for conversions involving the RADec system) or set_observatory (for conversion to equatorial systems). If such required information is needed but has not been set, this results in a fatal error.


The documentation for this class was generated from the following files: