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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: vector_math.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:34:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: vector_math.hpp,v 1000.1 2004/04/12 17:34:49 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      Vector and Matrix classes to simplify 3-d geometry calculations
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_VECTORMATH__HPP
  42. #define CN3D_VECTORMATH__HPP
  43. #include <math.h>
  44. #include <stddef.h>
  45. #include <corelib/ncbistre.hpp>
  46. #include <corelib/ncbistl.hpp>
  47. #include <corelib/ncbidiag.hpp>
  48. BEGIN_SCOPE(Cn3D)
  49. class Vector {
  50. public:
  51.     double x, y, z;
  52.     Vector(double xi = 0.0, double yi = 0.0, double zi = 0.0)
  53.     {
  54.         x=xi; y=yi; z=zi;
  55.     }
  56.     Vector(const Vector& v)
  57.     {
  58.         x=v.x; y=v.y; z=v.z;
  59.     }
  60.     Vector& operator = (const Vector& v)
  61.     {
  62. x=v.x; y=v.y; z=v.z;
  63.         return *this;
  64.     }
  65.     void Set(double xs, double ys, double zs)
  66.     {
  67.         x=xs; y=ys; z=zs;
  68.     }
  69.     bool operator == (const Vector& other)
  70.     {
  71.         return (x == other.x && y == other.y && z == other.z);
  72.     }
  73.     bool operator != (const Vector& other)
  74.     {
  75.         return !(*this == other);
  76.     }
  77.     double& operator [] (size_t i)
  78.     {
  79. static double err = 0.0;
  80.         if (i == 0) return x;
  81.         else if (i == 1) return y;
  82.         else if (i == 2) return z;
  83.         else ERR_POST(ncbi::Error << "Vector operator [] access out of range : " << i);
  84.         return err;
  85.     }
  86.     double operator [] (size_t i) const
  87.     {
  88.         if (i == 0) return x;
  89.         else if (i == 1) return y;
  90.         else if (i == 2) return z;
  91.         else ERR_POST(ncbi::Error << "Vector operator [] access out of range : " << i);
  92.         return 0.0;
  93.     }
  94.     friend Vector operator - (const Vector& a)
  95.     {
  96.         return Vector(-a.x, -a.y, -a.z);
  97.     }
  98.     friend Vector operator + (const Vector& a, const Vector& b)
  99.     {
  100.         return Vector(a.x+b.x, a.y+b.y, a.z+b.z);
  101.     }
  102.     Vector& operator += (const Vector& v)
  103.     {
  104.         x+=v.x; y+=v.y; z+=v.z;
  105.         return *this;
  106.     }
  107.     friend Vector operator - (const Vector& a, const Vector& b)
  108.     {
  109.         return Vector(a.x-b.x, a.y-b.y, a.z-b.z);
  110.     }
  111.     Vector& operator -= (const Vector& v)
  112.     {
  113.         x-=v.x; y-=v.y; z-=v.z;
  114.         return *this;
  115.     }
  116.     friend Vector operator * (const Vector& v, double f)
  117.     {
  118.         return Vector(v.x*f, v.y*f, v.z*f);
  119.     }
  120.     friend Vector operator * (double f, const Vector& v)
  121.     {
  122.         return Vector(v.x*f, v.y*f, v.z*f);
  123.     }
  124.     Vector& operator *= (double f)
  125.     {
  126.         x*=f; y*=f; z*=f;
  127.         return *this;
  128.     }
  129.     friend Vector operator / (const Vector& v, double f)
  130.     {
  131.         return Vector(v.x/f, v.y/f, v.z/f);
  132.     }
  133.     Vector& operator /= (double f)
  134.     {
  135.         x/=f; y/=f; z/=f;
  136.         return *this;
  137.     }
  138.     double length(void) const
  139.     {
  140.         return sqrt(x*x + y*y + z*z);
  141.     }
  142.     void normalize(void)
  143.     {
  144.         double len=length();
  145.         *this /= len;
  146.     }
  147.     friend double vector_dot(const Vector& a, const Vector& b)
  148.     {
  149.         return (a.x*b.x + a.y*b.y + a.z*b.z);
  150.     }
  151.     friend Vector vector_cross(const Vector& a, const Vector& b)
  152.     {
  153.         return Vector(
  154.             a.y*b.z - a.z*b.y,
  155.             a.z*b.x - a.x*b.z,
  156.             a.x*b.y - a.y*b.x
  157.         );
  158.     }
  159. };
  160. inline ncbi::CNcbiOstream& operator << (ncbi::CNcbiOstream& s, const Vector& v)
  161. {
  162.     return s << '<' << v.x << ',' << v.y << ',' << v.z << '>';
  163. }
  164. class Matrix {
  165. public:
  166.     double m[16];
  167.     Matrix(double m0 =1, double m1 =0, double m2 =0, double m3 =0,
  168.            double m4 =0, double m5 =1, double m6 =0, double m7 =0,
  169.            double m8 =0, double m9 =0, double m10 =1, double m11 =0,
  170.            double m12 =0, double m13 =0, double m14 =0, double m15 =1) {
  171.         m[0]=m0;  m[1]=m1;  m[2]=m2; m[3]=m3;
  172.         m[4]=m4;  m[5]=m5;  m[6]=m6;  m[7]=m7;
  173.         m[8]=m8;  m[9]=m9;  m[10]=m10; m[11]=m11;
  174.         m[12]=m12; m[13]=m13; m[14]=m14; m[15]=m15;
  175.     }
  176.     Matrix(const Matrix& o) {
  177.         for (int i=0; i<16; ++i) m[i]=o.m[i];
  178.     }
  179.     void SetToIdentity(void) {
  180.         m[0] = m[5] = m[10] = m[15] = 1;
  181.         m[1] = m[2] = m[3] = m[4] = m[6] = m[7] =
  182.         m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0;
  183.     }
  184.     Matrix& operator = (const Matrix& o) {
  185.         for (int i=0; i<16; ++i) m[i]=o.m[i];
  186.         return *this;
  187.     }
  188.     double& operator [] (size_t i)
  189.     {
  190. static double err = 0.0;
  191.         if (i > 15 || i < 0) {
  192.             ERR_POST(ncbi::Error << "Matrix operator [] access out of range : " << i);
  193.             return err;
  194.         }
  195.         return m[i];
  196.     }
  197.     double operator [] (size_t i) const
  198.     {
  199.         if (i > 15 || i < 0) {
  200.             ERR_POST(ncbi::Error << "Matrix operator [] access out of range : " << i);
  201.             return 0.0;
  202.         }
  203.         return m[i];
  204.     }
  205. };
  206. void SetTranslationMatrix(Matrix* m, const Vector& v, int n =1);
  207. void SetScaleMatrix(Matrix* m, const Vector& v);
  208. void SetRotationMatrix(Matrix* m, const Vector& v, double rad, int n =1);
  209. void ApplyTransformation(Vector* v, const Matrix& m);
  210. void ComposeInto(Matrix* C, const Matrix& A, const Matrix& B);
  211. void InvertInto(Matrix* I, const Matrix& A);
  212. // Rigid body fit algorithm
  213. void RigidBodyFit(
  214.     int natx, const Vector * const *xref, const Vector * const *xvar, const double *weights,  // inputs
  215.     Vector& cgref, Vector& cgvar, Matrix& rotMat);                                            // outputs
  216. END_SCOPE(Cn3D)
  217. #endif // CN3D_VECTORMATH__HPP
  218. /*
  219. * ---------------------------------------------------------------------------
  220. * $Log: vector_math.hpp,v $
  221. * Revision 1000.1  2004/04/12 17:34:49  gouriano
  222. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.15
  223. *
  224. * Revision 1.15  2004/03/15 17:17:56  thiessen
  225. * prefer prefix vs. postfix ++/-- operators
  226. *
  227. * Revision 1.14  2003/02/03 19:20:08  thiessen
  228. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  229. *
  230. * Revision 1.13  2001/08/15 20:50:31  juran
  231. * Include <stddef.h> for size_t.
  232. * "Alienate" friend operators.
  233. *
  234. * Revision 1.12  2001/05/22 22:35:36  thiessen
  235. * remove SIZE_TYPE
  236. *
  237. * Revision 1.11  2000/11/13 18:05:58  thiessen
  238. * working structure re-superpositioning
  239. *
  240. * Revision 1.10  2000/09/08 20:16:10  thiessen
  241. * working dynamic alignment views
  242. *
  243. * Revision 1.9  2000/08/18 18:57:44  thiessen
  244. * added transparent spheres
  245. *
  246. * Revision 1.8  2000/08/13 02:42:14  thiessen
  247. * added helix and strand objects
  248. *
  249. * Revision 1.7  2000/07/27 13:30:10  thiessen
  250. * remove 'using namespace ...' from all headers
  251. *
  252. * Revision 1.6  2000/07/18 16:49:44  thiessen
  253. * more friendly rotation center setting
  254. *
  255. * Revision 1.5  2000/07/17 22:36:46  thiessen
  256. * fix vector_math typo; correctly set initial view
  257. *
  258. * Revision 1.4  2000/07/12 23:28:28  thiessen
  259. * now draws basic CPK model
  260. *
  261. * Revision 1.3  2000/06/29 19:18:19  thiessen
  262. * improved atom map
  263. *
  264. * Revision 1.2  2000/06/29 16:46:16  thiessen
  265. * use NCBI streams correctly
  266. *
  267. * Revision 1.1  2000/06/27 20:08:15  thiessen
  268. * initial checkin
  269. *
  270. */