示例#1
0
/***********************************************************************//**
 * @brief Compute position angle between sky directions in radians
 *
 * @param[in] dir Sky direction.
 *
 * Computes the position angle using
 * \f[PA = \arctan \left( 
 *         \frac{\sin( \alpha_1 - \alpha_0 )}
 *              {\cos \delta_0 \tan \delta_1 -
 *               \sin \delta_0 \cos(\alpha_1 - \alpha_0)} \right)\f]
 * where
 * \f$(\alpha_0,\delta_0)\f$ are the coordinates of the reference point, and
 * \f$(\alpha_1,\delta_1)\f$ are the coordinates of sky direction for which
 * the position angle is to be computed.
 *
 * The position angle is counted counterclockwise from north.
 ***************************************************************************/
double GSkyDir::posang(const GSkyDir& dir) const
{
    // Initialise arguments of arctan
    double arg_1;
    double arg_2;

    // Compute dependent on coordinate system availability. This speeds
    // up things by avoiding unnecessary coordinate transformations.
    if (m_has_lb && dir.m_has_lb) {
        arg_1 = std::sin(dir.m_l - m_l);
        arg_2 = std::cos(m_b)*std::tan(dir.m_b) - std::sin(m_b)*std::cos(dir.m_l - m_l);
    }
    else if (m_has_radec && dir.m_has_radec) {
        arg_1 = std::sin(dir.m_ra - m_ra);
        arg_2 = std::cos(m_dec)*std::tan(dir.m_dec) - std::sin(m_dec)*std::cos(dir.m_ra - m_ra);
    }
    else if (m_has_lb) {
        arg_1 = std::sin(dir.l() - m_l);
        arg_2 = std::cos(m_b)*std::tan(dir.b()) - std::sin(m_b)*std::cos(dir.l() - m_l);
    }
    else if (m_has_radec) {
        arg_1 = std::sin(dir.ra() - m_ra);
        arg_2 = std::cos(m_dec)*std::tan(dir.dec()) - std::sin(m_dec)*std::cos(dir.ra() - m_ra);
    }
    else {
        arg_1 = std::sin(dir.ra() - ra());
        arg_2 = std::cos(dec())*std::tan(dir.dec()) - std::sin(dec())*std::cos(dir.ra() - ra());
    }

    // Compute position angle
    double pa = std::atan2(arg_1, arg_2);

    // Return position angle
    return pa;
}
示例#2
0
/***********************************************************************//**
 * @brief Compute angular distance between sky directions in radians
 *
 * @param[in] dir Sky direction to which distance is to be computed.
 ***************************************************************************/
double GSkyDir::dist(const GSkyDir& dir) const
{
    // Initialise cosine of distance
    double cosdis;

    // Compute dependent on coordinate system availability. This speeds
    // up things by avoiding unnecessary coordinate transformations.
    if (m_has_lb && dir.m_has_lb) {
        cosdis = std::sin(m_b)*std::sin(dir.m_b) +
                 std::cos(m_b)*std::cos(dir.m_b) * std::cos(dir.m_l - m_l);
    }
    else if (m_has_radec && dir.m_has_radec) {
        cosdis = std::sin(m_dec)*std::sin(dir.m_dec) +
                 std::cos(m_dec)*std::cos(dir.m_dec) * std::cos(dir.m_ra - m_ra);
    }
    else if (m_has_lb) {
        cosdis = std::sin(m_b)*std::sin(dir.b()) +
                 std::cos(m_b)*std::cos(dir.b()) * std::cos(dir.l() - m_l);
    }
    else if (m_has_radec) {
        cosdis = sin(m_dec)*sin(dir.dec()) +
                 cos(m_dec)*cos(dir.dec()) * std::cos(dir.ra() - m_ra);
    }
    else {
        cosdis = std::sin(dec())*std::sin(dir.dec()) +
                 std::cos(dec())*std::cos(dir.dec()) * std::cos(dir.ra() - ra());
    }

    // Compute distance (use argument save GTools function)
    double dist = arccos(cosdis);

    // Return distance
    return dist;
}
示例#3
0
/***********************************************************************//**
 * @brief Equality operator
 *
 * @param[in] a First sky direction.
 * @param[in] b Second sky direction.
 *
 * Compare two sky directions. If the coordinate is at the pole, the Right
 * Ascension or Longitude value is irrelevant.
 *
 * Comparisons are done dependent on the available coordinate system. This
 * speeds up things and avoids unnecessary coordinate transformations.
 ***************************************************************************/
bool operator==(const GSkyDir &a, const GSkyDir &b)
{
    // Initialise result
    bool equal = false;

    // Compute dependent on coordinate system availability. This speeds
    // up things by avoiding unnecessary coordinate transformations.
    if (a.m_has_lb && b.m_has_lb) {
        if (std::abs(a.m_b) == 90.0)
            equal = (a.m_b == b.m_b);
        else
            equal = (a.m_b == b.m_b && a.m_l == b.m_l);
    }
    else if (a.m_has_radec && b.m_has_radec) {
        if (std::abs(a.m_dec) == 90.0)
            equal = (a.m_dec == b.m_dec);
        else
            equal = (a.m_dec == b.m_dec && a.m_ra == b.m_ra);
    }
    else if (a.m_has_lb) {
        if (std::abs(a.m_b) == 90.0)
            equal = (a.m_b == b.b());
        else
            equal = (a.m_b == b.b() && a.m_l == b.l());
    }
    else if (a.m_has_radec) {
        if (std::abs(a.m_dec) == 90.0)
            equal = (a.m_dec == b.dec());
        else
            equal = (a.m_dec == b.dec() && a.m_ra == b.ra());
    }
    else {
        if (std::abs(b.dec()) == 90.0)
            equal = (b.dec() == a.dec());
        else
            equal = (b.dec() == a.dec() && b.ra() == a.ra());
    }

    // Return equality
    return equal;
}