moab
ScdVertexData.hpp
Go to the documentation of this file.
00001 
00016 #ifndef SCD_VERTEX_DATA_HPP
00017 #define SCD_VERTEX_DATA_HPP
00018 
00019 //
00020 // Class: ScdVertexData
00021 //
00022 // Purpose: represent a rectangular vertex block of mesh
00023 //
00024 // A ScdVertex represents a rectangular vertex block of mesh, including both vertices and
00025 // the parametric space used to address those vertices.
00026 
00027 #include "SequenceData.hpp"
00028 #include "moab/HomXform.hpp"
00029 
00030 namespace moab {
00031 
00032 class ScdVertexData : public SequenceData
00033 {
00034 
00035 private:
00036 
00038   HomCoord vertexParams[3];
00039 
00042   int dIJK[3];
00043   
00046   int dIJKm1[3];
00047 
00048 public:
00049 
00051   ScdVertexData(const EntityHandle start_vertex, 
00052                 const int imin, const int jmin, const int kmin,
00053                 const int imax, const int jmax, const int kmax) ;
00054   
00055   virtual ~ScdVertexData() {}
00056 
00058   EntityHandle get_vertex(const int i, const int j, const int k) const;
00059 
00061   EntityHandle get_vertex(const HomCoord &coords) const;
00062 
00065   ErrorCode get_params(const EntityHandle vhandle,
00066                           int &i, int &j, int &k) const;
00067   
00069   void min_params(int &i, int &j, int &k) const;
00070   
00072   void max_params(int &i, int &j, int &k) const;
00073 
00075   const HomCoord &min_params() const;
00076 
00078   const HomCoord &max_params() const;
00079   
00081   void param_extents(int &di, int &dj, int &dk) const;
00082 
00084   int i_min() const {return vertexParams[0].hom_coord()[0];}
00085   int j_min() const {return vertexParams[0].hom_coord()[1];}
00086   int k_min() const {return vertexParams[0].hom_coord()[2];}
00087   int i_max() const {return vertexParams[1].hom_coord()[0];}
00088   int j_max() const {return vertexParams[1].hom_coord()[1];}
00089   int k_max() const {return vertexParams[1].hom_coord()[2];}
00090 
00092   bool contains(const HomCoord &coords) const;
00093   bool contains(const int i, const int j, const int k) const;
00094 
00095   SequenceData* subset( EntityHandle start, 
00096                         EntityHandle end,
00097                         const int* sequence_data_sizes,
00098                         const int* tag_data_sizes ) const;
00099 };
00100 
00101 inline EntityHandle ScdVertexData::get_vertex(const int i, const int j, 
00102                                                 const int k) const
00103 {
00104   return start_handle() + (i-i_min()) + (j-j_min())*dIJK[0] + 
00105     (k-k_min())*dIJK[0]*dIJK[1];
00106 }
00107 
00108 inline EntityHandle ScdVertexData::get_vertex(const HomCoord &coords) const
00109 {
00110   return get_vertex(coords.hom_coord()[0], coords.hom_coord()[1], coords.hom_coord()[2]);
00111 }
00112 
00113 inline ErrorCode ScdVertexData::get_params(const EntityHandle vhandle,
00114                                              int &i, int &j, int &k) const
00115 {
00116   if (TYPE_FROM_HANDLE(vhandle) != MBVERTEX) return MB_FAILURE;
00117 
00118   int hdiff = vhandle - start_handle();
00119 
00120   k = hdiff / (dIJK[0]*dIJK[1]);
00121   j = (hdiff - (k*dIJK[0]*dIJK[1])) / dIJK[0];
00122   i = hdiff % dIJK[0];
00123 
00124   k += vertexParams[0].k();
00125   j += vertexParams[0].j();
00126   i += vertexParams[0].i();
00127 
00128   return (vhandle >= start_handle() &&
00129           i >= i_min() && i <= i_max() &&
00130           j >= j_min() && j <= j_max() &&
00131           k >= k_min() && k <= k_max()) ? MB_SUCCESS : MB_FAILURE;
00132 }
00133   
00135 inline void ScdVertexData::min_params(int &i, int &j, int &k) const
00136 {
00137   i = i_min();
00138   j = j_min();
00139   k = k_min();
00140 }
00141 
00143 inline void ScdVertexData::max_params(int &i, int &j, int &k) const
00144 {
00145   i = i_max();
00146   j = j_max();
00147   k = k_max();
00148 }
00149 
00150 inline const HomCoord &ScdVertexData::min_params() const 
00151 {
00152   return vertexParams[0];
00153 }
00154 
00155 inline const HomCoord &ScdVertexData::max_params() const 
00156 {
00157   return vertexParams[1];
00158 }
00159 
00161 inline void ScdVertexData::param_extents(int &di, int &dj, int &dk) const
00162 {
00163   di = dIJK[0];
00164   dj = dIJK[1];
00165   dk = dIJK[2];
00166 }
00167 
00168 inline bool ScdVertexData::contains(const HomCoord &coords) const
00169 {
00170   return (coords >= vertexParams[0] && coords <= vertexParams[1]) ? true : false;
00171 }
00172 
00173 inline bool ScdVertexData::contains(const int i, const int j, const int k) const
00174 {
00175   return contains(HomCoord(i, j, k));
00176 }
00177   
00178 } // namespace moab
00179 
00180 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines