/***************************************************************************
* GSkyRegionRect.hpp - rectangular sky region class *
* ----------------------------------------------------------------------- *
* copyright (C) 2019-2020 by Andreas Specovius *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file GSkyRegionRect.hpp
* @brief Rectangular sky region class interface definition
* @author Andreas Specovius
*/
#ifndef GSKYREGIONRECT_HPP
#define GSKYREGIONRECT_HPP
/* __ Includes ___________________________________________________________ */
#include
#include
#include "GMath.hpp"
#include "GSkyDir.hpp"
#include "GSkyRegion.hpp"
#include "GTools.hpp"
/***********************************************************************//**
* @class GSkyRegionRect
*
* @brief Interface for the rectangular sky region class
*
* This class provides an implementation for a rectangular sky region. The sky
* region is defined by an array of parameters, the meaning of which is
* specific to the derived class where the region type or shape is defined.
*
* The class holds several properties such as solid angle subtended by the
* region and computed through internal method compute_solid().
*
* The position angle counts counter-clockwise from celestial North and is
* aligned with the height axis of the rectangle.
*
***************************************************************************/
class GSkyRegionRect : public GSkyRegion {
public:
// Constructors and destructors
GSkyRegionRect(void);
GSkyRegionRect(const GSkyDir& centre
,const double& w, const double& h
,const double& posang_deg
);
GSkyRegionRect(const double& ra, const double& dec
,const double& w, const double& h
,const double& posang_deg
);
explicit GSkyRegionRect(const std::string& line);
GSkyRegionRect(const GSkyRegionRect& region);
virtual ~GSkyRegionRect(void);
// Operators
GSkyRegionRect& operator=(const GSkyRegionRect& region);
// Implemented methods
void clear(void);
GSkyRegionRect* clone(void) const;
std::string classname(void) const;
double posang(void) const;
void posang(const double& posang);
double posang_deg(void) const;
void posang_deg(const double& posang);
double width(void) const;
void width(const double& width);
double height(void) const;
void height(const double& height);
const GSkyDir& centre(void) const;
void centre(const GSkyDir& centre);
void centre(const double& ra,const double& dec);
double ra(void) const;
double dec(void) const;
void read(const std::string& line);
std::string write(void) const;
bool contains(const GSkyDir& dir) const;
bool contains_local(const GSkyDir& locdir) const;
bool contains(const GSkyRegion& reg) const;
bool overlaps(const GSkyRegion& reg) const;
std::string print(const GChatter& chatter = NORMAL) const;
GSkyDir transform_to_local(const GSkyDir& skydir) const;
GSkyDir transform_to_global(const GSkyDir& locdir) const;
GSkyDir get_corner(const int& index) const;
protected:
// Protected methods
void init_members(void);
void copy_members(const GSkyRegionRect& region);
void free_members(void);
void compute_solid_angle(void);
void update_cache(void);
// Protected members
GSkyDir m_centre; //!< Centre or reference point of the region
double m_halfwidth; //!< Half width of the region [deg]
double m_halfheight; //!< Half height of the region [deg]
double m_posang; //!< Position angle, counterclockwise from North [radians]
double m_posang_cos; //!< Cache for transform_to_local
double m_posang_sin; //!< Cache for transform_to_local
};
/***********************************************************************//**
* @brief Return class name
*
* @return String containing the class name ("GSkyRegionRect").
***************************************************************************/
inline
std::string GSkyRegionRect::classname(void) const
{
return ("GSkyRegionRect");
}
/***********************************************************************//**
* @brief Return region position angle (in radians)
*
* @return Region position angle [radians].
*
* Returns the region position angle in radians. The position angle is
* counted counterclockwise from North.
***************************************************************************/
inline
double GSkyRegionRect::posang(void) const
{
// Return
return (m_posang);
}
/***********************************************************************//**
* @brief Return region position angle (in degrees)
*
* @return Region position angle [degrees].
*
* Returns the region position angle in degrees. The position angle is
* counted counterclockwise from North.
***************************************************************************/
inline
double GSkyRegionRect::posang_deg(void) const
{
// Return
return (m_posang * gammalib::rad2deg);
}
/***********************************************************************//**
* @brief Return region width extension (in degrees)
*
* @return Region width [deg].
*
* Returns the region width extension in degrees.
***************************************************************************/
inline
double GSkyRegionRect::width(void) const
{
double width = 2*m_halfwidth;
return (width);
}
/***********************************************************************//**
* @brief Return region height extension (in degrees)
*
* @return Region height [deg].
*
* Returns the region height extension in degrees.
***************************************************************************/
inline
double GSkyRegionRect::height(void) const
{
double height = 2*m_halfheight;
return (height);
}
/***********************************************************************//**
* @brief Return rectangular region centre
*
* @return Region centre.
*
* Returns the region centre.
***************************************************************************/
inline
const GSkyDir& GSkyRegionRect::centre(void) const
{
return (m_centre);
}
/***********************************************************************//**
* @brief Set rectangular region centre
*
* @param[in] dir Region centre.
*
* Sets the centre of the rectangular region to the specified sky direction.
***************************************************************************/
inline
void GSkyRegionRect::centre(const GSkyDir& dir)
{
// Set centre
m_centre = dir;
// Return
return;
}
/***********************************************************************//**
* @brief Set rectangular region centre Right Ascension and Declincation
*
* @param[in] ra Right Ascension [deg].
* @param[in] dec Declination [deg].
*
* Sets the centre of the rectangular region to the specified Right Ascension
* and Declination.
***************************************************************************/
inline
void GSkyRegionRect::centre(const double& ra, const double& dec)
{
// Set centre values
m_centre.radec_deg(ra,dec);
// Return
return;
}
/***********************************************************************//**
* @brief Return rectangular region centre Right Ascension
*
* @return Region centre Right Ascension [deg].
*
* Returns the region centre Right Ascension in degrees.
***************************************************************************/
inline
double GSkyRegionRect::ra(void) const
{
return (m_centre.ra_deg());
}
/***********************************************************************//**
* @brief Return rectangular region centre Declination
*
* @return Region centre Declination [deg].
*
* Returns the region centre Declination in degrees.
***************************************************************************/
inline
double GSkyRegionRect::dec(void) const
{
return (m_centre.dec_deg());
}
#endif /* GSKYREGIONRECT_HPP */