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

生物技术

开发平台:

C/C++

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