moab
|
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