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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: matrix3.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:48:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_MATH___MATRIX3___HPP
  10. #define GUI_MATH___MATRIX3___HPP
  11. /*  $Id: matrix3.hpp,v 1000.2 2004/06/01 19:48:52 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. /** @addtogroup GUI_MATH
  43.  *
  44.  * @{
  45.  */
  46. BEGIN_NCBI_SCOPE
  47. template <class T>
  48. class CMatrix3
  49. {
  50. public:
  51.     // ctors
  52.     CMatrix3();
  53.     CMatrix3 (T,T,T, T,T,T, T,T,T);
  54.     CMatrix3 (const T[9]);
  55.     CMatrix3 (const T[3][3]);
  56.     //
  57.     // operators
  58.     //
  59.     // operator: index with bounds checking
  60.     T           operator() (int i, int j) const { return m_Data[i * 3+j]; }
  61.     T&          operator() (int i, int j)       { return m_Data[i * 3+j]; }
  62.     // operator: index with no bounds checking
  63.     T           operator[] (int i) const    { return m_Data[i]; }
  64.     T&          operator[] (int i)          { return m_Data[i]; }
  65.     // operator: addition
  66.     CMatrix3<T>& operator+= (T);
  67.     CMatrix3<T>& operator+= (const CMatrix3<T>&);
  68.     // operator: subtraction
  69.     CMatrix3<T>& operator-= (T);
  70.     CMatrix3<T>& operator-= (const CMatrix3<T>&);
  71.     // operator: multiplication
  72.     CMatrix3<T>& operator*= (T);
  73.     CMatrix3<T>& operator*= (const CMatrix3<T>&);
  74.     // operator: division
  75.     CMatrix3<T>& operator/= (T);
  76.     //
  77.     // named functions
  78.     // transpose the current matrix
  79.     void        Transpose();
  80.     // make the current matrix an identity matrix
  81.     void        Identity();
  82.     // clear the current matrix to a given value
  83.     void        Clear(T x = (T)0);
  84.     // return the determinant of the current matrix
  85.     T           Determinant() const;
  86.     // data accessor
  87.     const T*    GetData() const    { return m_Data; }
  88.     // return a vector representing a row
  89.     CVect3<T>   Row(int r) const;
  90.     // return a vector representing a column
  91.     CVect3<T>   Column(int c) const;
  92. private:
  93.     T m_Data[9];
  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. CMatrix3<T>::CMatrix3()
  106. {
  107.     clear(T(0));
  108. }
  109. //
  110. // conversion ctors
  111. //
  112. template <class T> inline
  113. CMatrix3<T>::CMatrix3 (T m1, T m2, T m3,  T m4, T m5, T m6,  T m7, T m8, T m9)
  114. {
  115.     m_Data[0] = m1; m_Data[1] = m2; m_Data[2] = m3;
  116.     m_Data[3] = m4; m_Data[4] = m5; m_Data[5] = m6;
  117.     m_Data[6] = m7; m_Data[7] = m8; m_Data[8] = m9;
  118. }
  119. template <class T> inline
  120. CMatrix3<T>::CMatrix3(const T m[9])
  121. {
  122.     for (int i = 0;  i < 9;  ++i) {
  123.         m_Data[i] = m[i];
  124.     }
  125. }
  126. template <class T> inline
  127. CMatrix3<T>::CMatrix3(const T m[3][3])
  128. {
  129.     m_Data[0] = m[0][0];
  130.     m_Data[1] = m[0][1];
  131.     m_Data[2] = m[0][2];
  132.     m_Data[3] = m[1][0];
  133.     m_Data[4] = m[1][1];
  134.     m_Data[5] = m[1][2];
  135.     m_Data[6] = m[2][0];
  136.     m_Data[7] = m[2][1];
  137.     m_Data[8] = m[2][2];
  138. }
  139. //
  140. // addition: matrix
  141. template <class T> inline CMatrix3<T>&
  142. CMatrix3<T>::operator+= (const CMatrix3<T>& m)
  143. {
  144.     for (int i = 0;  i < 9;  ++i) {
  145.         m_Data[i] += m[i];
  146.     }
  147.     return *this;
  148. }
  149. //
  150. // Addition: scalar
  151. template <class T> inline CMatrix3<T>&
  152. CMatrix3<T>::operator+= (T scalar)
  153. {
  154.     for (int i = 0;  i < 9;  ++i) {
  155.         m_Data[i] += scalar;
  156.     }
  157.     return *this;
  158. }
  159. //
  160. // subtraction: matrix
  161. template <class T> inline CMatrix3<T>&
  162. CMatrix3<T>::operator-= (const CMatrix3<T>& m)
  163. {
  164.     for (int i = 0;  i < 9;  ++i) {
  165.         m_Data[i] -= m[i];
  166.     }
  167.     return *this;
  168. }
  169. //
  170. // Subtraction: scalar
  171. template <class T> inline CMatrix3<T>&
  172. CMatrix3<T>::operator-= (T scalar)
  173. {
  174.     for (int i = 0;  i < 9;  ++i) {
  175.         m_Data[i] -= scalar;
  176.     }
  177.     return *this;
  178. }
  179. //
  180. // multiplication: scalar
  181. template <class T> inline CMatrix3<T>&
  182. CMatrix3<T>::operator*= (T scalar)
  183. {
  184.     for (int i = 0;  i < 9;  ++i) {
  185.         m_Data[i] *= scalar;
  186.     }
  187.     return *this;
  188. }
  189. //
  190. // multiplication: matrix
  191. template <class T> inline CMatrix3<T>&
  192. CMatrix3<T>::operator*= (const CMatrix3<T>& m)
  193. {
  194.     // given
  195.     //
  196.     // a b c   1 2 3
  197.     // d e f   4 5 6
  198.     // g h i   7 8 9
  199.     // 
  200.     // result is:
  201.     //  (a1 + b4 + c7)  (a2 + b5 + c8)  (a3 + b6 + c9)
  202.     //  (d1 + e4 + f7)  (d2 + e5 + f8)  (d3 + e6 + f9)
  203.     //  (g1 + h4 + i7)  (g2 + h5 + i8)  (g3 + h6 + i9)
  204.     //
  205.     T f1, f2, f3;
  206.     f1 = m_Data[0]*m[0] + m_Data[1]*m[3] + m_Data[2]*m[6];
  207.     f2 = m_Data[0]*m[1] + m_Data[1]*m[4] + m_Data[2]*m[7];
  208.     f3 = m_Data[0]*m[2] + m_Data[1]*m[5] + m_Data[2]*m[8];
  209.     m_Data[0] = f1;
  210.     m_Data[1] = f2;
  211.     m_Data[2] = f3;
  212.     f1 = m_Data[3]*m[0] + m_Data[4]*m[3] + m_Data[5]*m[6];
  213.     f2 = m_Data[3]*m[1] + m_Data[4]*m[4] + m_Data[5]*m[7];
  214.     f3 = m_Data[3]*m[2] + m_Data[4]*m[5] + m_Data[5]*m[8];
  215.     m_Data[3] = f1;
  216.     m_Data[4] = f2;
  217.     m_Data[5] = f3;
  218.     f1 = m_Data[6]*m[0] + m_Data[7]*m[3] + m_Data[8]*m[6];
  219.     f2 = m_Data[6]*m[1] + m_Data[7]*m[4] + m_Data[8]*m[7];
  220.     f3 = m_Data[6]*m[2] + m_Data[7]*m[5] + m_Data[8]*m[8];
  221.     m_Data[6] = f1;
  222.     m_Data[7] = f2;
  223.     m_Data[8] = f3;
  224.     return *this;
  225. }
  226. //
  227. // division: scalar
  228. //
  229. template <class T> inline CMatrix3<T>&
  230. CMatrix3<T>::operator/= (T scalar)
  231. {
  232.     scalar = T(1) / scalar;
  233.     for (int i = 0;  i < 9;  ++i) {
  234.         m_Data[i] *= scalar;
  235.     }
  236.     return *this;
  237. }
  238. //
  239. // transpose a matrix
  240. //
  241. template <class T> inline void
  242. CMatrix3<T>::Transpose()
  243. {
  244.     // given
  245.     //   a b c
  246.     //   d e f
  247.     //   g h i
  248.     //   
  249.     // result is
  250.     //   a d g
  251.     //   b e h
  252.     //   c f i
  253.     //
  254.     std::swap(m_Data[3], m_Data[1]);
  255.     std::swap(m_Data[6], m_Data[2]);
  256.     std::swap(m_Data[7], m_Data[5]);
  257. }
  258. //
  259. // create an identity matrix
  260. //
  261. template <class T> inline void
  262. CMatrix3<T>::Identity()
  263. {
  264.     m_Data[0] = (T)1;
  265.     m_Data[1] = (T)0;
  266.     m_Data[2] = (T)0;
  267.     m_Data[3] = (T)0;
  268.     m_Data[4] = (T)1;
  269.     m_Data[5] = (T)0;
  270.     m_Data[6] = (T)0;
  271.     m_Data[7] = (T)0;
  272.     m_Data[8] = (T)1;
  273. }
  274. //
  275. // clear a matrix so that all its values are the passed value
  276. //
  277. template <class T> inline void
  278. CMatrix3<T>::Clear(T value)
  279. {
  280.     for (int i = 0;  i < 9;  ++i) {
  281.         m_Data[i] = value;
  282.     }
  283. }
  284. //
  285. // return a row as a vector
  286. //
  287. template <class T> inline CVect3<T>
  288. CMatrix3<T>::Row(int i) const
  289. {
  290.     return CVect3<T> (m_Data[i * 3], m_Data[i * 3 + 1], m_Data[i * 3 + 2]);
  291. }
  292. //
  293. // return a column as a vector
  294. //
  295. template <class T> inline CVect3<T>
  296. CMatrix3<T>::Column(int j) const
  297. {
  298.     return CVect3<T> (m_Data[j], m_Data[3 + j], m_Data[6 + j]);
  299. }
  300. //
  301. // return the determinant of a 3x3 matrix
  302. //
  303. template <class T> inline T
  304. CMatrix3<T>::Determinant() const
  305. {
  306.     // given
  307.     //   a b c
  308.     //   d e f
  309.     //   g h i
  310.     //   
  311.     // the determinant is
  312.     //     a(ei - hf) + b(di - fg) + c(dh - eg)
  313.     //
  314.     return (m_Data[0] * (m_Data[4]*m_Data[8] - m_Data[5]*m_Data[7]) +
  315.             m_Data[1] * (m_Data[3]*m_Data[8] - m_Data[5]*m_Data[6]) +
  316.             m_Data[2] * (m_Data[3]*m_Data[7] - m_Data[4]*m_Data[6]));
  317. }
  318. END_NCBI_SCOPE
  319. /* @} */
  320. /*
  321.  * ===========================================================================
  322.  * $Log: matrix3.hpp,v $
  323.  * Revision 1000.2  2004/06/01 19:48:52  gouriano
  324.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  325.  *
  326.  * Revision 1.6  2004/05/11 18:53:50  dicuccio
  327.  * Added doxygen modules info
  328.  *
  329.  * Revision 1.5  2004/05/03 13:10:01  dicuccio
  330.  * Removed gui/gui.hpp --> not necessary for math projects
  331.  *
  332.  * Revision 1.4  2004/05/03 12:43:35  dicuccio
  333.  * Added #include for gui/gui.hpp
  334.  *
  335.  * Revision 1.3  2004/04/26 17:27:04  ucko
  336.  * Correct case of std::swap in Transpose.
  337.  *
  338.  * Revision 1.2  2004/03/11 17:17:07  dicuccio
  339.  * FIxed include guards
  340.  *
  341.  * Revision 1.1  2003/06/09 19:30:50  dicuccio
  342.  * Initial revision
  343.  *
  344.  * ===========================================================================
  345.  */
  346. #endif // GUI_MATH___MATRIX3___HPP