00001
00008 #if !defined(VEC3D_H)
00009 #define VEC3D_H
00010
00011 enum CoordUnits{ BOHR_U, ANGSTROM_U };
00012
00013 #include "haio.h"
00014 #include "hastl.h"
00015
00016 #include "types.h"
00017
00018 class HaMat_double;
00019 class HaVec_double;
00020
00022 class Vec3D : public Location
00023 {
00024 protected:
00025
00026 public:
00027 Vec3D();
00028 virtual ~Vec3D();
00029
00030 inline double GetX() const { return pos[0]; }
00031 inline double GetY() const { return pos[1]; }
00032 inline double GetZ() const { return pos[2]; }
00033
00034 Vec3D& operator=(const Vec3D& ref_vec);
00035
00036 double& operator[](int i) { return pos[i];}
00037 const double& operator[](int i) const { return pos[i];}
00038
00039 friend Vec3D operator+(const Vec3D& v1,const Vec3D& v2);
00040 friend Vec3D operator-(const Vec3D& v1,const Vec3D& v2);
00041 friend Vec3D operator*(const double factor,const Vec3D& v);
00042
00043 double length() const;
00044 double length2() const;
00045
00046 void SetX(const double x_new);
00047 void SetY(const double y_new);
00048 void SetZ(const double z_new);
00049
00050 int SetFromStr( const char* str);
00051
00052 void ScaleCoord(double scale );
00053 int normalize();
00054
00055 int RotatePt(Vec3D& still_pt,Vec3D& n, double cosa, double sina);
00056 int Rotate(Vec3D& n, double cosa, double sina);
00057
00058
00059
00060 static double CalcTorsion( const Vec3D* atm1, const Vec3D* atm2,
00061 const Vec3D* atm3, const Vec3D* atm4);
00062 static double CalcDihedral( const Vec3D* atm1, const Vec3D* atm2,
00063 const Vec3D* atm3, const Vec3D* atm4);
00064 static double CalcAngle( const Vec3D* atm1, const Vec3D* atm2, const Vec3D* atm3);
00065 static double CalcDistance( const Vec3D* atm1, const Vec3D* atm2,
00066 const CoordUnits units = BOHR_U);
00067
00068 static int VecProduct( Vec3D& vprod, const Vec3D& vec1, const Vec3D& vec2);
00069 static double DotProduct( const Vec3D& vec1, const Vec3D& vec2);
00070 static int diff(Vec3D& c, const Vec3D& vec1, const Vec3D& vec2);
00071 static int sum (Vec3D& c, const Vec3D& vec1, const Vec3D& vec2);
00072
00073 static int CalcHlxParams(const Vec3D& c0_1, const Vec3D& v1_1, const Vec3D& v2_1, const Vec3D& v3_1,
00074 const Vec3D& c0_2, const Vec3D& v1_2, const Vec3D& v2_2, const Vec3D& v3_2,
00075 double& shift, double& slide, double& rise,
00076 double& tilt, double& roll,double& twist,
00077 int idir=1);
00078
00079
00080
00081
00082 static int SetAtomPos( Vec3D* pptr, const Vec3D* ptr1, const Vec3D* pptr2, const Vec3D* pptr3,
00083 double dist, double val_angle, double dih_angle);
00084
00085 };
00086
00087 typedef Vec3D Point3D;
00088 typedef vector<Vec3D> Vec3D_arr;
00089
00090 class PointIterator
00092 {
00093 public:
00094
00095 virtual Vec3D* GetFirstPt() = 0;
00096 virtual Vec3D* GetNextPt() = 0;
00097
00098
00099
00100 };
00101
00102
00103 class PointCollection
00105 {
00106 public:
00107 virtual PointIterator* GetPointIterator() = 0;
00108 virtual int GetPtNum() = 0;
00109
00110
00111
00112
00113 int IsWithinRadius(Vec3D* pptr, double limit );
00114
00115 static int Superimpose( PointCollection& grp1, PointCollection& grp2,
00116 HaMat_double& rot_mat, HaVec_double& transl_vec, double& eps);
00117
00118
00119 };
00120
00121
00122 extern "C" int rot_mat_to_euler(const HaMat_double& rmat, double& phi, double& cos_theta, double& psi);
00123 extern "C" int euler_to_rot_mat(const double phi, const double cos_theta, const double psi, HaMat_double& rmat);
00124
00125
00126 #endif