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

生物技术

开发平台:

C/C++

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