00001 #ifndef OPENMM_VEC3_H_
00002 #define OPENMM_VEC3_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <cassert>
00036 #include <iosfwd>
00037
00038 namespace OpenMM {
00039
00045 class Vec3 {
00046 public:
00050 Vec3() {
00051 data[0] = data[1] = data[2] = 0.0;
00052 }
00056 Vec3(double x, double y, double z) {
00057 data[0] = x;
00058 data[1] = y;
00059 data[2] = z;
00060 }
00061 double operator[](int index) const {
00062 assert(index >= 0 && index < 3);
00063 return data[index];
00064 }
00065 double& operator[](int index) {
00066 assert(index >= 0 && index < 3);
00067 return data[index];
00068 }
00069
00070 bool operator==(const Vec3& rhs) const {
00071 return (data[0] == rhs[0] && data[1] == rhs[1] && data[2] == rhs[2]);
00072 }
00073
00074 bool operator!=(const Vec3& rhs) const {
00075 return (data[0] != rhs[0] || data[1] != rhs[1] || data[2] != rhs[2]);
00076 }
00077
00078
00079
00080
00081 Vec3 operator+() const {
00082 return Vec3(*this);
00083 }
00084
00085
00086 Vec3 operator+(const Vec3& rhs) const {
00087 const Vec3& lhs = *this;
00088 return Vec3(lhs[0] + rhs[0], lhs[1] + rhs[1], lhs[2] + rhs[2]);
00089 }
00090
00091 Vec3& operator+=(const Vec3& rhs) {
00092 data[0] += rhs[0];
00093 data[1] += rhs[1];
00094 data[2] += rhs[2];
00095 return *this;
00096 }
00097
00098
00099 Vec3 operator-() const {
00100 const Vec3& lhs = *this;
00101 return Vec3(-lhs[0], -lhs[1], -lhs[2]);
00102 }
00103
00104
00105 Vec3 operator-(const Vec3& rhs) const {
00106 const Vec3& lhs = *this;
00107 return Vec3(lhs[0] - rhs[0], lhs[1] - rhs[1], lhs[2] - rhs[2]);
00108 }
00109
00110 Vec3& operator-=(const Vec3& rhs) {
00111 data[0] -= rhs[0];
00112 data[1] -= rhs[1];
00113 data[2] -= rhs[2];
00114 return *this;
00115 }
00116
00117
00118 Vec3 operator*(double rhs) const {
00119 const Vec3& lhs = *this;
00120 return Vec3(lhs[0]*rhs, lhs[1]*rhs, lhs[2]*rhs);
00121 }
00122
00123 Vec3& operator*=(double rhs) {
00124 data[0] *= rhs;
00125 data[1] *= rhs;
00126 data[2] *= rhs;
00127 return *this;
00128 }
00129
00130
00131 double dot(const Vec3& rhs) const {
00132 const Vec3& lhs = *this;
00133 return lhs[0]*rhs[0] + lhs[1]*rhs[1] + lhs[2]*rhs[2];
00134 }
00135
00136
00137 Vec3 cross(const Vec3& rhs) const {
00138 return Vec3(data[1]*rhs[2]-data[2]*rhs[1], data[2]*rhs[0]-data[0]*rhs[2], data[0]*rhs[1]-data[1]*rhs[0]);
00139 }
00140
00141 private:
00142 double data[3];
00143 };
00144
00145 template <class CHAR, class TRAITS>
00146 std::basic_ostream<CHAR,TRAITS>& operator<<(std::basic_ostream<CHAR,TRAITS>& o, const Vec3& v) {
00147 o<<'['<<v[0]<<", "<<v[1]<<", "<<v[2]<<']';
00148 return o;
00149 }
00150
00151 }
00152
00153 #endif