00001
00002
00003
00005
00006 #ifndef __vector3_h
00007 #define __vector3_h
00008 #define REAL_TYPE double
00009
00010 #include <math.h>
00011
00012 class vector3 {
00013 private:
00014 REAL_TYPE m[3];
00015
00016 public:
00017 vector3(REAL_TYPE a=0,REAL_TYPE b=0,REAL_TYPE c=0) {m[0]=a;m[1]=b;m[2]=c;}
00018
00019 void set(REAL_TYPE a=0,REAL_TYPE b=0,REAL_TYPE c=0) {m[0]=a;m[1]=b;m[2]=c;}
00020
00021 REAL_TYPE x() {return m[0];}
00022 REAL_TYPE y() {return m[1];}
00023 REAL_TYPE z() {return m[2];}
00024
00025
00026 REAL_TYPE &operator [](int i) {return m[i];}
00027 const REAL_TYPE &operator [](int i) const {return m[i];}
00028
00029
00030 operator const REAL_TYPE* const() const {return &m[0];}
00031
00032 bool operator ==(const vector3 &p) const {return ((m[0]==p.m[0])&&(m[1]==p.m[1])&&(m[2]==p.m[2]));}
00033 bool operator !=(const vector3 &p) const {return !((*this)==p);}
00034
00035 vector3 &operator+=(const vector3 &p) {m[0]+=p.m[0];m[1]+=p.m[1];m[2]+=p.m[2];return *this;}
00036 vector3 operator + (const vector3 &p) const {return vector3(m[0]+p.m[0],m[1]+p.m[1],m[2]+p.m[2]);}
00037
00038 vector3 &operator-=(const vector3 &p) {m[0]-=p.m[0];m[1]-=p.m[1];m[2]-=p.m[2];return *this;}
00039 vector3 operator - (const vector3 &p) const {return vector3(m[0]-p.m[0],m[1]-p.m[1],m[2]-p.m[2]);}
00040 vector3 operator - () const {return vector3(-m[0],-m[1],-m[2]);}
00041
00042 vector3 &operator*=(REAL_TYPE f) {m[0]*=f;m[1]*=f;m[2]*=f;return *this;}
00043 vector3 operator * (REAL_TYPE f) const {return vector3(m[0]*f,m[1]*f,m[2]*f);}
00044
00045 vector3 &operator/=(REAL_TYPE f) {m[0]/=f;m[1]/=f;m[2]/=f;return *this;}
00046 vector3 operator / (REAL_TYPE f) const {return vector3(m[0]/f,m[1]/f,m[2]/f);}
00047
00048 vector3 &operator= (const vector3 &V) {if (this == &V) return *this;
00049 m[0] = V.m[0]; m[1] = V.m[1]; m[2] = V.m[2]; return *this;}
00050
00051
00052 REAL_TYPE operator * (const vector3 &v2) const {return m[0]*v2.m[0]+m[1]*v2.m[1]+m[2]*v2.m[2];}
00053
00054
00055 vector3 operator ^ (const vector3 &v2) const {
00056 vector3 tmp;
00057 tmp.m[0]=m[1]*v2.m[2]-m[2]*v2.m[1];
00058 tmp.m[1]=m[2]*v2.m[0]-m[0]*v2.m[2];
00059 tmp.m[2]=m[0]*v2.m[1]-m[1]*v2.m[0];
00060 return tmp;
00061 }
00062
00063
00064 REAL_TYPE abs() const {return sqrt((*this)*(*this));}
00065
00066
00067 vector3 &normalize() {return (*this)/=abs();}
00068
00069
00070 char* str(char* s) const {sprintf(s,"%4.1f,%4.1f,%4.1f",m[0],m[1],m[2]);return s;}
00071 };
00072
00073
00074 inline REAL_TYPE Angle(vector3 &a, vector3 &b)
00075 {
00076 REAL_TYPE r = (a*b)/(a.abs()*b.abs());
00077 if ( r >= 1.0 ) { return 0.0; }
00078 else if ( r <= -1.0 ) { return 3.14159265; }
00079 else { return acos(r); }
00080 }
00081
00082
00083 #endif //__vector3_h
00084
00086