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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glcurve.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:49:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_OPENGL___GLCURVE__HPP
  10. #define GUI_OPENGL___GLCURVE__HPP
  11. /*  $Id: glcurve.hpp,v 1000.1 2004/06/01 19:49:46 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:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <gui/math/vect3.hpp>
  43. #include <gui/math/curve.hpp>
  44. /** @addtogroup GUI_OPENGL
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. ///
  50. /// class ICurve defines a basic interface for all curves.  This representation
  51. /// is independent of rendering
  52. ///
  53. template <class Curve>
  54. class CGlCurve
  55. {
  56. public:
  57.     typedef ICurve::TPoint TPoint;
  58.     enum ERenderMode {
  59.         eRender_Points,
  60.         eRender_Lines,
  61.         eRender_Default = eRender_Lines
  62.     };
  63.     virtual ~CGlCurve() { }
  64.     /// draw!
  65.     void Draw(ERenderMode mode = eRender_Default) const;
  66.     /// draw a curve with a given error limit, with a minimum number of segs
  67.     void Draw(float error, size_t min_segs,
  68.               ERenderMode mode = eRender_Default) const;
  69.     /// recalculate the curve (curve-specific)
  70.     void Recalc();
  71.     /// access control points of the curve
  72.     const TPoint& GetPoint(size_t i) const;
  73.     TPoint&       SetPoint(size_t i);
  74.     void          SetPoint(size_t i, const TPoint& );
  75.     //// evaluate the current curve at a given value [0, 1]
  76.     TPoint EvalPos  (float u) const;
  77.     TPoint EvalTan  (float u) const;
  78.     TPoint EvalCurve(float u) const;
  79.     /// access the level of detail
  80.     float GetError() const;
  81.     void  SetError(float f);
  82. private:
  83.     // the curve we render
  84.     Curve m_Curve;
  85.     void x_DrawRecursive(float u_lo, const TPoint& pos_lo,
  86.                          float u_hi, const TPoint& pos_hi,
  87.                          float error) const;
  88. };
  89. template <class Curve>
  90. inline void
  91. CGlCurve<Curve>::Draw(ERenderMode mode) const
  92. {
  93.     Draw(GetError(), 2, mode);
  94. }
  95. template <class Curve>
  96. inline void
  97. CGlCurve<Curve>::Draw(float error, size_t min_segs, ERenderMode mode) const
  98. {
  99.     float u_step = 1.0f / min_segs;
  100.     float u;
  101.     TPoint pos0 = EvalPos(0.0f);
  102.     static const GLenum modes[] ={
  103.         GL_POINTS,
  104.         GL_LINE_STRIP
  105.     };
  106.     glBegin(modes[mode]);
  107.     glVertex3fv(pos0.GetData());
  108.     for (u = 0;  u < 1.0f;  u += u_step) {
  109.         TPoint pos1 = EvalPos(u + u_step);
  110.         x_DrawRecursive(u, pos0, u+u_step, pos1, error);
  111.         pos0 = pos1;
  112.     }
  113.     glEnd();
  114. }
  115. ///
  116. /// internal (recursive) draw function
  117. /// this implements a subdivision with an error level
  118. ///
  119. template <class Curve>
  120. inline void
  121. CGlCurve<Curve>::x_DrawRecursive(float u_lo, const TPoint& pos_lo,
  122.                                  float u_hi, const TPoint& pos_hi,
  123.                                  float error) const
  124. {
  125.     /// find the midpoint of the current seg
  126.     float u_mid = (u_lo + u_hi) * 0.5f;
  127.     TPoint pos_mid = EvalPos(u_mid);
  128.     /// find the error associated with this point
  129.     float len0 = (pos_lo - pos_hi).Length();
  130.     float len1 = (pos_mid - pos_lo).Length() + (pos_hi - pos_mid).Length();
  131.     if ((len1 - len0) / len0 > error) {
  132.         /// subdivide!
  133.         x_DrawRecursive(u_lo,  pos_lo,  u_mid, pos_mid, error);
  134.         x_DrawRecursive(u_mid, pos_mid, u_hi,  pos_hi,  error);
  135.     } else {
  136.         /// render!
  137.         glVertex3fv(pos_mid.GetData());
  138.         glVertex3fv(pos_hi.GetData());
  139.     }
  140. }
  141. template <class Curve>
  142. inline void
  143. CGlCurve<Curve>::Recalc()
  144. {
  145.     m_Curve.Recalc();
  146. }
  147. template <class Curve>
  148. inline float
  149. CGlCurve<Curve>::GetError() const
  150. {
  151.     return m_Curve.GetError();
  152. }
  153. template <class Curve>
  154. inline void
  155. CGlCurve<Curve>::SetError(float f)
  156. {
  157.     m_Curve.SetError(f);
  158. }
  159. template <class Curve>
  160. inline const typename CGlCurve<Curve>::TPoint&
  161. CGlCurve<Curve>::GetPoint(size_t i) const
  162. {
  163.     return m_Curve.GetPoint(i);
  164. }
  165. template <class Curve>
  166. inline typename CGlCurve<Curve>::TPoint&
  167. CGlCurve<Curve>::SetPoint(size_t i)
  168. {
  169.     return m_Curve.SetPoint(i);
  170. }
  171. template <class Curve>
  172. inline void
  173. CGlCurve<Curve>::SetPoint(size_t i, const TPoint& point)
  174. {
  175.     m_Curve.SetPoint(i, point);
  176. }
  177. template <class Curve>
  178. inline typename CGlCurve<Curve>::TPoint
  179. CGlCurve<Curve>::EvalPos(float u) const
  180. {
  181.     return m_Curve.EvalPos(u);
  182. }
  183. template <class Curve>
  184. inline typename CGlCurve<Curve>::TPoint
  185. CGlCurve<Curve>::EvalTan(float u) const
  186. {
  187.     return m_Curve.EvalTan(u);
  188. }
  189. template <class Curve>
  190. inline typename CGlCurve<Curve>::TPoint
  191. CGlCurve<Curve>::EvalCurve(float u) const
  192. {
  193.     return m_Curve.EvalCurve(u);
  194. }
  195. END_NCBI_SCOPE
  196. /* @} */
  197. /*
  198.  * ===========================================================================
  199.  * $Log: glcurve.hpp,v $
  200.  * Revision 1000.1  2004/06/01 19:49:46  gouriano
  201.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  202.  *
  203.  * Revision 1.3  2004/05/11 18:54:22  dicuccio
  204.  * Added doxygne modules info
  205.  *
  206.  * Revision 1.2  2004/03/11 20:08:05  dicuccio
  207.  * Corrected include paths
  208.  *
  209.  * Revision 1.1  2004/03/10 14:03:52  dicuccio
  210.  * Initial revision
  211.  *
  212.  * ===========================================================================
  213.  */
  214. #endif  // GUI_OPENGL___GLCURVE__HPP