glrect.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glrect.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:50:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_OPENGL___GLRECT__HPP
  10. #define GUI_OPENGL___GLRECT__HPP
  11. /*  $Id: glrect.hpp,v 1000.3 2004/06/01 19:50:19 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/opengl/glpoint.hpp>
  43. /** @addtogroup GUI_OPENGL
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. /// CGlRect reprsents rectangle in the coordinate system with origin located in 
  49. /// the left bottom corner.
  50. template <class T>  class CGlRect
  51. {
  52. public:    
  53.     // Construction
  54.     CGlRect() 
  55.         : m_Left(0), m_Bottom(0), m_Right(0), m_Top(0)  {}
  56.     CGlRect(T x, T y) 
  57.         : m_Left(x), m_Bottom(y), m_Right(x), m_Top(y)  {}
  58.     CGlRect(T left, T bottom, T right, T top)
  59.         : m_Left(left), m_Bottom(bottom), m_Right(right), m_Top(top) {}
  60.     void    Init() 
  61.     { 
  62.         m_Left = m_Bottom = m_Right = m_Top = 0;  
  63.     }
  64.     
  65.     void    Init(T x, T y)
  66.     {
  67.         m_Left = m_Right = x;
  68.         m_Bottom = m_Top = y;
  69.     }
  70.     void    Init(T left, T bottom, T right, T top)
  71.     {
  72.         m_Left = left;
  73.         m_Bottom = bottom;
  74.         m_Right = right;
  75.         m_Top = top;
  76.     }
  77.     
  78.     T   Left()   const   {   return m_Left;  }
  79.     T   Bottom() const   {   return m_Bottom;  }
  80.     T   Right()  const   {   return m_Right;  }
  81.     T   Top()    const   {   return m_Top;  }
  82.   
  83.     T  Width() const
  84.     {   
  85.         return m_Right - m_Left;    
  86.     }  
  87.     T   Height() const
  88.     {
  89.         return m_Top - m_Bottom;    
  90.     }
  91.     CGlPoint<T>     CenterPoint()
  92.     {
  93.         return CGlPoint<T>( (m_Left + m_Right) / 2, (m_Bottom + m_Top) / 2);
  94.     }
  95.     void    SetLeft(T left)      {   m_Left = left;  }
  96.     void    SetBottom(T bottom)  {   m_Bottom = bottom;  }
  97.     void    SetRight(T right)    {   m_Right = right;  }
  98.     void    SetTop(T top)        {   m_Top = top;  }
  99.     void    SetHorz(T left, T right)
  100.     {
  101.         m_Left = left;
  102.         m_Right = right;
  103.     }
  104.     
  105.     void    SetVert(T bottom, T top)
  106.     {
  107.         m_Bottom = bottom;
  108.         m_Top = top;
  109.     }
  110.     
  111.     void   SetSize(T width, T height)
  112.     {
  113.         m_Right = m_Left + width;
  114.         m_Top = m_Bottom + height;
  115.     }
  116.     void   MoveLeft(T shift)    {   m_Left += shift;    }
  117.     void   MoveRight(T shift)   {   m_Right += shift;    }
  118.     void   MoveBottom(T shift)  {   m_Bottom += shift;    }
  119.     void   MoveTop(T shift)     {   m_Top += shift;    }
  120.     // tests
  121.     bool    operator==(const CGlRect<T>& rc) const
  122.     {
  123.         return m_Left == rc.m_Left && m_Right == rc.m_Right 
  124.                 && m_Bottom == rc.m_Bottom  &&  m_Top == rc.m_Top;
  125.     }
  126.     bool    operator!=(const CGlRect<T>& rc) const
  127.     {
  128.         return ! *this == rc;
  129.     }
  130.     bool    IsEmpty()   const
  131.     {
  132.         return (m_Left == m_Right) || (m_Bottom == m_Top);
  133.     }
  134.     bool    PtInRect(T x, T y)  const
  135.     {
  136.         return (x >= m_Left  &&  x <= m_Right)  &&  (y >= m_Bottom  &&  y <= m_Top);
  137.     }
  138.     bool    PtInRect(const CGlPoint<T>& pt)  const
  139.     {
  140.         return (pt.X() >= m_Left  &&  pt.X() <= m_Right)
  141.                 &&  (pt.Y() >= m_Bottom  && pt.Y() <= m_Top);
  142.     }
  143.     bool    Intersects(const CGlRect& R) const
  144.     {
  145.         return ! ((R.m_Bottom > m_Top) || (R.m_Top < m_Bottom) 
  146.                    || (R.m_Left > m_Right) || (R.m_Right < m_Left));
  147.     }
  148.     
  149.     // operations
  150.     void Inflate(T d_x, T d_y)
  151.     {
  152.         m_Left -= d_x;
  153.         m_Right += d_x;
  154.         m_Bottom -= d_y;
  155.         m_Top += d_y;        
  156.     }
  157.     void    Offset(T d_x, T d_y)
  158.     {
  159.         m_Left += d_x;
  160.         m_Right += d_x;
  161.         m_Bottom += d_y;
  162.         m_Top += d_y;        
  163.     }
  164.     
  165.     CGlRect&    IntersectWith(const CGlRect& r)
  166.     {
  167.         m_Left = max(m_Left, r.m_Left);
  168.         m_Right = min(m_Right, r.m_Right);
  169.         m_Bottom = max(m_Bottom, r.m_Bottom);
  170.         m_Top = min(m_Top, r.m_Top);
  171.         
  172.         // correcting Right and Top if intersection is empty
  173.         m_Right = max(m_Right, m_Left);
  174.         m_Top = max(m_Top, m_Bottom);
  175.         return *this;
  176.     }
  177.     
  178.     CGlRect&    CombineWith(const CGlRect& r)
  179.     {
  180.         m_Left = min(m_Left, r.m_Left);
  181.         m_Right = max(m_Right, r.m_Right);
  182.         m_Bottom = min(m_Bottom, r.m_Bottom);
  183.         m_Top = max(m_Top, r.m_Top);
  184.         return *this;
  185.     }
  186. private:
  187.     T m_Left;
  188.     T m_Bottom;
  189.     T m_Right;
  190.     T m_Top;
  191. };
  192. template<> inline int CGlRect<int>::Width() const
  193.     return m_Right - m_Left + 1;    
  194. }
  195. template<> inline int CGlRect<int>::Height() const
  196.     return m_Top - m_Bottom + 1;    
  197. }
  198. template<> inline void   CGlRect<int>::SetSize(int Width, int Height)
  199. {
  200.     m_Right = m_Left + Width - 1;
  201.     m_Top = m_Bottom + Height - 1;
  202. }
  203. END_NCBI_SCOPE
  204. /* @} */
  205. /*
  206.  * ===========================================================================
  207.  * $Log: glrect.hpp,v $
  208.  * Revision 1000.3  2004/06/01 19:50:19  gouriano
  209.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  210.  *
  211.  * Revision 1.6  2004/05/11 18:54:22  dicuccio
  212.  * Added doxygne modules info
  213.  *
  214.  * Revision 1.5  2004/04/22 16:55:25  yazhuk
  215.  * Cosmetic fixes
  216.  *
  217.  * Revision 1.4  2003/11/17 20:25:59  yazhuk
  218.  * Added operators == and !=
  219.  *
  220.  * Revision 1.3  2003/11/03 16:59:20  yazhuk
  221.  * Added PtInRect(const CGlPoint<>) member function
  222.  *
  223.  * Revision 1.2  2003/10/29 22:22:22  yazhuk
  224.  * Added SetHorz() SetVert() functions, enforced coding policy
  225.  *
  226.  * Revision 1.1  2003/10/08 12:53:02  dicuccio
  227.  * Moved from gui/graph library
  228.  *
  229.  * ===========================================================================
  230.  */
  231. #endif  // GUI_OPENGL___GLRECT__HPP