![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef MB_CART_VECT_HPP
00002 #define MB_CART_VECT_HPP
00003
00004 #include
00005 #include
00006 #include
00007
00008 namespace moab
00009 {
00010
00011 /**
00012 * \brief Cartesian Vector
00013 */
00014 class CartVect
00015 {
00016 private:
00017 double d[3];
00018
00019 public:
00020 inline CartVect() {}
00021 /**Initialze all three values to same scalar (typically zero)*/
00022 explicit inline CartVect( double v )
00023 {
00024 d[0] = d[1] = d[2] = v;
00025 }
00026 inline CartVect( double i, double j, double k )
00027 {
00028 d[0] = i;
00029 d[1] = j;
00030 d[2] = k;
00031 }
00032 /**Initialze from array*/
00033 explicit inline CartVect( const double a[3] )
00034 {
00035 d[0] = a[0];
00036 d[1] = a[1];
00037 d[2] = a[2];
00038 }
00039 inline CartVect& operator=( const double v[3] )
00040 {
00041 d[0] = v[0];
00042 d[1] = v[1];
00043 d[2] = v[2];
00044 return *this;
00045 }
00046
00047 inline double& operator[]( unsigned i )
00048 {
00049 return d[i];
00050 }
00051 inline double operator[]( unsigned i ) const
00052 {
00053 return d[i];
00054 }
00055
00056 inline CartVect& operator+=( const CartVect& v )
00057 {
00058 d[0] += v.d[0];
00059 d[1] += v.d[1];
00060 d[2] += v.d[2];
00061 return *this;
00062 }
00063 inline CartVect& operator-=( const CartVect& v )
00064 {
00065 d[0] -= v.d[0];
00066 d[1] -= v.d[1];
00067 d[2] -= v.d[2];
00068 return *this;
00069 }
00070 /** Assign cross product to this */
00071 inline CartVect& operator*=( const CartVect& v );
00072
00073 inline CartVect& operator+=( double s )
00074 {
00075 d[0] += s;
00076 d[1] += s;
00077 d[2] += s;
00078 return *this;
00079 }
00080 inline CartVect& operator-=( double s )
00081 {
00082 d[0] -= s;
00083 d[1] -= s;
00084 d[2] -= s;
00085 return *this;
00086 }
00087 inline CartVect& operator*=( double s )
00088 {
00089 d[0] *= s;
00090 d[1] *= s;
00091 d[2] *= s;
00092 return *this;
00093 }
00094 inline CartVect& operator/=( double s )
00095 {
00096 d[0] /= s;
00097 d[1] /= s;
00098 d[2] /= s;
00099 return *this;
00100 }
00101 inline bool operator==( const CartVect& v ) const
00102 {
00103 return d[0] == v[0] && d[1] == v[1] && d[2] == v[2];
00104 }
00105 inline bool operator==( double val ) const
00106 {
00107 return d[0] == val && d[1] == val && d[2] == val;
00108 }
00109
00110 inline double length() const; //!< vector length
00111
00112 inline double length_squared() const;
00113
00114 inline void normalize(); //!< make unit length, or 0 if length < DBL_MIN
00115
00116 inline void flip(); //!< flip direction
00117
00118 /** per-element scalar multiply (this[0] *= v[0], this[1] *= v[1], ...) */
00119 inline void scale( const CartVect& v )
00120 {
00121 d[0] *= v.d[0];
00122 d[1] *= v.d[1];
00123 d[2] *= v.d[2];
00124 }
00125
00126 // get pointer to array of three doubles
00127 inline double* array()
00128 {
00129 return d;
00130 }
00131 inline const double* array() const
00132 {
00133 return d;
00134 }
00135
00136 /** initialize double array from this */
00137 inline void get( double v[3] ) const
00138 {
00139 v[0] = d[0];
00140 v[1] = d[1];
00141 v[2] = d[2];
00142 }
00143
00144 /** initialize float array from this */
00145 inline void get( float v[3] ) const
00146 {
00147 v[0] = static_cast< float >( d[0] );
00148 v[1] = static_cast< float >( d[1] );
00149 v[2] = static_cast< float >( d[2] );
00150 }
00151 };
00152
00153 inline CartVect operator+( const CartVect& u, const CartVect& v )
00154 {
00155 return CartVect( u[0] + v[0], u[1] + v[1], u[2] + v[2] );
00156 }
00157
00158 inline CartVect operator-( const CartVect& u, const CartVect& v )
00159 {
00160 return CartVect( u[0] - v[0], u[1] - v[1], u[2] - v[2] );
00161 }
00162
00163 /** cross product */
00164 inline CartVect operator*( const CartVect& u, const CartVect& v )
00165 {
00166 return CartVect( u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0] );
00167 }
00168
00169 //! Dot product
00170 inline double operator%( const CartVect& u, const CartVect& v )
00171 {
00172 return u[0] * v[0] + u[1] * v[1] + u[2] * v[2];
00173 }
00174
00175 inline CartVect& CartVect::operator*=( const CartVect& v )
00176 {
00177 return *this = *this * v;
00178 }
00179
00180 inline double CartVect::length() const
00181 {
00182 return std::sqrt( *this % *this );
00183 }
00184
00185 inline double CartVect::length_squared() const
00186 {
00187 return d[0] * d[0] + d[1] * d[1] + d[2] * d[2];
00188 }
00189
00190 inline void CartVect::normalize()
00191 {
00192 double tmp = length();
00193 if( tmp < DBL_MIN )
00194 d[0] = d[1] = d[2] = 0;
00195 else
00196 *this /= tmp;
00197 }
00198
00199 inline void CartVect::flip()
00200 {
00201 d[0] = -d[0];
00202 d[1] = -d[1];
00203 d[2] = -d[2];
00204 }
00205
00206 //! Interior angle between two vectors
00207 inline double angle( const CartVect& u, const CartVect& v )
00208 {
00209 double tmp = ( u % v ) / std::sqrt( ( u % u ) * ( v % v ) );
00210 if( tmp > 1. ) tmp = 1.;
00211 if( tmp < -1. ) tmp = -1.;
00212 return std::acos( tmp );
00213 }
00214
00215 inline CartVect operator-( const CartVect& v )
00216 {
00217 return CartVect( -v[0], -v[1], -v[2] );
00218 }
00219 inline CartVect operator+( const CartVect& v, double s )
00220 {
00221 return CartVect( v[0] + s, v[1] + s, v[2] + s );
00222 }
00223 inline CartVect operator-( const CartVect& v, double s )
00224 {
00225 return CartVect( v[0] - s, v[1] - s, v[2] - s );
00226 }
00227 inline CartVect operator*( const CartVect& v, double s )
00228 {
00229 return CartVect( v[0] * s, v[1] * s, v[2] * s );
00230 }
00231 inline CartVect operator/( const CartVect& v, double s )
00232 {
00233 return CartVect( v[0] / s, v[1] / s, v[2] / s );
00234 }
00235 inline CartVect operator+( double s, const CartVect& v )
00236 {
00237 return CartVect( v[0] + s, v[1] + s, v[2] + s );
00238 }
00239 inline CartVect operator-( double s, const CartVect& v )
00240 {
00241 return CartVect( v[0] - s, v[1] - s, v[2] - s );
00242 }
00243 inline CartVect operator*( double s, const CartVect& v )
00244 {
00245 return CartVect( v[0] * s, v[1] * s, v[2] * s );
00246 }
00247
00248 //! Get unit vector in same direction
00249 inline CartVect unit( const CartVect& v )
00250 {
00251 const double len = v.length();
00252 return CartVect( v[0] / len, v[1] / len, v[2] / len );
00253 }
00254
00255 std::ostream& operator<<( std::ostream& s, const CartVect& v );
00256
00257 } // namespace moab
00258
00259 #endif