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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: vect2.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:49:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_MATH___VECT2___HPP
  10. #define GUI_MATH___VECT2___HPP
  11. /*  $Id: vect2.hpp,v 1000.2 2004/06/01 19:49:04 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/math.hpp>
  43. /** @addtogroup GUI_MATH
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. template <class T>
  49. class CVect2
  50. {
  51. public:
  52.     // ctors
  53.     CVect2();
  54.     CVect2(T val);
  55.     CVect2(T, T);
  56.     //
  57.     //  operators
  58.     // operator: indexing
  59.     T  operator[] (int i) const  { return m_Xy[i]; }
  60.     T& operator[] (int i)        { return m_Xy[i]; }
  61.     // operators: math
  62.     CVect2<T>& operator+= (T);
  63.     CVect2<T>& operator+= (const CVect2<T>&);
  64.     CVect2<T>& operator-= (T);
  65.     CVect2<T>& operator-= (const CVect2<T>&);
  66.     CVect2<T>& operator*= (T);
  67.     CVect2<T>& operator*= (const CVect2<T>&); // cross product!
  68.     CVect2<T>& operator/= (T);
  69.     //
  70.     // named functions
  71.     // return length of vector
  72.     float Length() const;
  73.     // return length of vector squared
  74.     float Length2() const;
  75.     // return true if the length of the vector is 0
  76.     bool Vanishing() const;
  77.     // normalize a vector
  78.     void Normalize();
  79.     // return a unit vector in the direction of the current vector
  80.     CVect2<T> Direction() const;
  81.     // test whether a passed vector is parallel or normal to current
  82.     bool Parallel(const CVect2<T>&) const;
  83.     bool Normal(const CVect2<T>&) const;
  84.     // perform dot product
  85.     T Dot(const CVect2<T>&) const;
  86.     // accessor functions
  87.     T&          X()             { return m_Xy[0]; }
  88.     const T&    X() const       { return m_Xy[0]; }
  89.     T&          Y()             { return m_Xy[1]; }
  90.     const T&    Y() const       { return m_Xy[1]; }
  91.     const T*    GetData() const { return m_Xy; }
  92. protected:
  93.     T m_Xy[2];
  94. };
  95. END_NCBI_SCOPE
  96. //
  97. // global operations
  98. // this is included after the class declaration
  99. #include <gui/math/globals.hpp>
  100. BEGIN_NCBI_SCOPE
  101. //
  102. // default ctor
  103. //
  104. template <class T> inline
  105. CVect2<T>::CVect2()
  106. {
  107.     m_Xy[0] = m_Xy[1] = (T)0;
  108. }
  109. //
  110. // conversion ctors
  111. //
  112. template <class T> inline
  113. CVect2<T>::CVect2 (T val)
  114. {
  115.     m_Xy[0] = m_Xy[1] = val;
  116. }
  117. template <class T> inline
  118. CVect2<T>::CVect2 (T x, T y)
  119. {
  120.     m_Xy[0] = x;
  121.     m_Xy[1] = y;
  122. }
  123. //
  124. // operator+ (scalar)
  125. //
  126. template <class T> inline CVect2<T>&
  127. CVect2<T>::operator+= (T scalar)
  128. {
  129.     X() += scalar;
  130.     Y() += scalar;
  131.     return *this;
  132. }
  133. //
  134. // operator+ (vector)
  135. //
  136. template <class T> inline CVect2<T>&
  137. CVect2<T>::operator+= (const CVect2<T>& v)
  138. {
  139.     X() += v.X();
  140.     Y() += v.Y();
  141.     return *this;
  142. }
  143. //
  144. // operator- (scalar)
  145. //
  146. template <class T> inline CVect2<T>&
  147. CVect2<T>::operator-= (T scalar)
  148. {
  149.     X() -= scalar;
  150.     Y() -= scalar;
  151.     return *this;
  152. }
  153. //
  154. // operator- (vector)
  155. //
  156. template <class T> inline CVect2<T>&
  157. CVect2<T>::operator-= (const CVect2<T>& v)
  158. {
  159.     X() -= v.X();
  160.     Y() -= v.Y();
  161.     return *this;
  162. }
  163. //
  164. // operator*= (scalar)
  165. //
  166. template <class T> inline CVect2<T>&
  167. CVect2<T>::operator*= (T scalar)
  168. {
  169.     X() *= scalar;
  170.     Y() *= scalar;
  171.     return *this;
  172. }
  173. //
  174. // operator* (vector)
  175. //     (cross product!!!)
  176. //
  177. template <class T> inline CVect2<T>&
  178. CVect2<T>::operator*= (const CVect2<T>& v)
  179. {
  180.     *this = Cross(v);
  181.     return *this;
  182. }
  183. //
  184. // dot(vector)
  185. //
  186. template <class T> inline T
  187. CVect2<T>::Dot(const CVect2<T>& v) const
  188. {
  189.     return (T)(X() * v.X() + Y() * v.Y());
  190. }
  191. //
  192. // operator/= (scalar)
  193. //
  194. template <class T> inline CVect2<T>&
  195. CVect2<T>::operator/= (T scalar)
  196. {
  197.     scalar = T(1) / scalar;
  198.     X() *= scalar;
  199.     Y() *= scalar;
  200.     return *this;
  201. }
  202. //
  203. // length()
  204. //     return the length of a vector
  205. //
  206. template <class T> inline float
  207. CVect2<T>::Length() const
  208. {
  209.     return ::sqrt(Length2());
  210. }
  211. template <class T> inline float
  212. CVect2<T>::Length2() const
  213. {
  214.     return (X() * X() + Y() * Y());
  215. }
  216. template <class T> inline bool
  217. CVect2<T>::Vanishing() const
  218. {
  219.     return (Length2() == 0.0);
  220. }
  221. //
  222. // normalize()
  223. //     converts a vector to a unit vector
  224. //
  225. template <class T> inline void
  226. CVect2<T>::Normalize()
  227. {
  228.     typedef NCBI_PROMOTE(T, float) TFloat;
  229.     TFloat f = TFloat(1) / TFloat(Length());
  230.     if (f != TFloat(0)) {
  231.         X() = (X() * f);
  232.         Y() = (Y() * f);
  233.     }
  234. }
  235. //
  236. // direction()
  237. //     returns a unit vector in the direction of the current vector
  238. //
  239. template <class T> inline CVect2<T>
  240. CVect2<T>::Direction() const
  241. {
  242.     return CVect2<T>(*this, true);
  243. }
  244. //
  245. // parallel()
  246. //     tests to see whether the passed vector is parallel to the current vector
  247. //
  248. template <class T> inline bool
  249. CVect2<T>::Parallel(const CVect2<T>& v) const
  250. {
  251.     typedef NCBI_PROMOTE(T, float) TFloat;
  252.     TFloat result = (TFloat)Dot(v);
  253.     TFloat l = Length() * v.Length();
  254.     if (result == l  ||  result == -l) {
  255.         return true;
  256.     }
  257.     return false;
  258. }
  259. //
  260. // normal()
  261. //     tests to see whether the passed vector is nromal to the current vector
  262. //
  263. template <class T> inline bool
  264. CVect2<T>::Normal(const CVect2<T>& v) const
  265. {
  266.     typedef NCBI_PROMOTE(T, float) TFloat;
  267.     TFloat result = (TFloat)Dot(v);
  268.     if (result == TFloat(0)  &&
  269.         Length() != TFloat(0)  &&
  270.         v.Length() != TFloat(0)) {
  271.         return true;
  272.     }
  273.     return false;
  274. }
  275. END_NCBI_SCOPE
  276. /* @} */
  277. /*
  278.  * ===========================================================================
  279.  * $Log: vect2.hpp,v $
  280.  * Revision 1000.2  2004/06/01 19:49:04  gouriano
  281.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  282.  *
  283.  * Revision 1.5  2004/05/11 18:53:50  dicuccio
  284.  * Added doxygen modules info
  285.  *
  286.  * Revision 1.4  2004/05/03 13:10:01  dicuccio
  287.  * Removed gui/gui.hpp --> not necessary for math projects
  288.  *
  289.  * Revision 1.3  2004/05/03 12:43:35  dicuccio
  290.  * Added #include for gui/gui.hpp
  291.  *
  292.  * Revision 1.2  2004/03/11 17:16:56  dicuccio
  293.  * FIxed include guards.  Fixed use of dead functions (upper case first letter)
  294.  *
  295.  * Revision 1.1  2003/06/09 19:30:50  dicuccio
  296.  * Initial revision
  297.  *
  298.  * ===========================================================================
  299.  */
  300. #endif // GUI_MATH___VECT2___HPP///