00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _MBVEC3SETIJK_H
00025 #define _MBVEC3SETIJK_H
00026
00027 #ifdef _WIN32
00028 # pragma warning( push )
00029 # pragma warning(disable:4250)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/data/MiDataSetIjk.h>
00033 #include <MeshVizXLM/MbVec3.h>
00034
00035 #include <data/MbDataSet.h>
00036 #include <MbIjkToI.h>
00037 #include <MbMeshVizImpl.h>
00038
00039 #include <Inventor/STL/vector>
00040 #include <Inventor/STL/iostream>
00041 #include <Inventor/STL/sstream>
00042
00052 template <typename _Vec3T=MbVec3d, MiMeshIjk::StorageLayout _Layout = MiMeshIjk::LAYOUT_KJI>
00053 class MbVec3SetIjk : virtual public MiVec3dSetIjk, public MbVec3dSet, private MbIjkToI<_Layout>
00054 {
00055 public:
00057
00062 MbVec3SetIjk();
00063 MbVec3SetIjk(size_t numI, size_t numJ, size_t numK);
00064
00065 MbVec3SetIjk(size_t numI, size_t numJ, size_t numK,
00066 const std::string& name, DataBinding binding=PER_NODE);
00068
00072 MbVec3d get(size_t i, size_t j, size_t k) const;
00073
00077 void set(size_t i, size_t j, size_t k, const _Vec3T& data);
00078
00082 virtual void getSize(size_t& sizeI, size_t& sizeJ, size_t& sizeK) const;
00086 virtual void setSize(size_t sizeI, size_t sizeJ, size_t sizeK);
00087
00088 MiMeshIjk::StorageLayout getStorageLayout() const { return _Layout; }
00089
00093 virtual MbVec3d getMin() const;
00097 virtual MbVec3d getMax() const;
00098
00099 private:
00103 virtual std::ostream& toStream(std::ostream& s) const;
00104
00105 std::vector<_Vec3T> m_coords;
00106
00107 static size_t s_numInstance;
00108 };
00109
00110 typedef MbVec3SetIjk<MbVec3d> MbVec3dSetIjk;
00111
00112 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00113 size_t MbVec3SetIjk<_Vec3T,_Layout>::s_numInstance = 0;
00114
00115
00116 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00117 inline
00118 MbVec3SetIjk<_Vec3T,_Layout>::MbVec3SetIjk():
00119 MbIjkToI<_Layout>(0,0,0)
00120 {
00121 std::ostringstream defName;
00122 defName << "MbVec3Set_#" << s_numInstance++;
00123 m_name = defName.str();
00124 }
00125
00126
00127 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00128 inline
00129 MbVec3SetIjk<_Vec3T,_Layout>::MbVec3SetIjk(size_t numI, size_t numJ, size_t numK):
00130 MbIjkToI<_Layout>(numI,numJ,numK)
00131 {
00132 std::ostringstream defName;
00133 defName << "MbVec3Set_#" << s_numInstance++;
00134 m_name = defName.str();
00135 m_coords.resize(this->m_numI*this->m_numJ*this->m_numK);
00136 }
00137
00138
00139 template <typename _T, MiMeshIjk::StorageLayout _Layout>
00140 inline
00141 MbVec3SetIjk<_T,_Layout>::MbVec3SetIjk(size_t numI, size_t numJ, size_t numK,
00142 const std::string& name,
00143 DataBinding binding)
00144 : MbVec3dSet(name,binding), MbIjkToI<_Layout>(numI,numJ,numK)
00145 {
00146 m_coords.resize(this->m_numI*this->m_numJ*this->m_numK);
00147 s_numInstance++;
00148 }
00149
00150
00151 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00152 MbVec3d
00153 MbVec3SetIjk<_Vec3T,_Layout>::get(size_t i, size_t j, size_t k) const
00154 {
00155 return (MbVec3d)m_coords[this->getI(i,j,k)];
00156 }
00157
00158 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00159 void
00160 MbVec3SetIjk<_Vec3T,_Layout>::set(size_t i, size_t j, size_t k, const _Vec3T& data)
00161 {
00162 if (i<this->m_numI && j<this->m_numJ && k<this->m_numK)
00163 {
00164 m_coords[this->getI(i,j,k)] = data;
00165 m_timeStamp = MxTimeStamp::getTimeStamp();
00166 }
00167 }
00168
00169
00170 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00171 void
00172 MbVec3SetIjk<_Vec3T,_Layout>::getSize(size_t& i, size_t& j, size_t& k) const
00173 {
00174 i = this->m_numI;
00175 j = this->m_numJ;
00176 k = this->m_numK;
00177 }
00178
00179 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00180 void
00181 MbVec3SetIjk<_Vec3T,_Layout>::setSize(size_t i, size_t j, size_t k)
00182 {
00183 this->m_numI = i;
00184 this->m_numJ = j;
00185 this->m_numK = k;
00186 m_coords.resize(i*j*this->m_numK);
00187 m_timeStamp = MxTimeStamp::getTimeStamp();
00188 }
00189
00190
00191 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00192 inline MbVec3d
00193 MbVec3SetIjk<_Vec3T,_Layout>::getMin() const
00194 {
00195 size_t minvecId = 0;
00196 double minvecLn = m_coords[0].length();
00197
00198 for (size_t i=1; i<m_coords.size(); ++i)
00199 {
00200 double vecLn = m_coords[i].length();
00201 if (vecLn < minvecLn)
00202 {
00203 minvecLn = vecLn;
00204 minvecId = i;
00205 }
00206 }
00207 return MbVec3d(m_coords[minvecId]);
00208 }
00209
00210
00211
00212 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00213 inline MbVec3d
00214 MbVec3SetIjk<_Vec3T,_Layout>::getMax() const
00215 {
00216 size_t maxvecId = 0;
00217 double maxvecLn = m_coords[0].length();
00218
00219 for (size_t i=1; i<m_coords.size(); ++i)
00220 {
00221 double vecLn = m_coords[i].length();
00222 if (vecLn > maxvecLn)
00223 {
00224 maxvecLn = vecLn;
00225 maxvecId = i;
00226 }
00227 }
00228 return MbVec3d(m_coords[maxvecId]);
00229 }
00230
00231
00232 template <typename _Vec3T, MiMeshIjk::StorageLayout _Layout>
00233 inline std::ostream&
00234 MbVec3SetIjk<_Vec3T,_Layout>::toStream(std::ostream& s) const
00235 {
00236 s << "# vec3set name" << std::endl;
00237 s << getName() << std::endl;
00238 s << "# vec3set size" << std::endl;
00239 s << this->m_numI << "," << this->m_numJ << "," << this->m_numK << std::endl;
00240 for (size_t i=0; i< this->m_numI; ++i)
00241 for (size_t j=0; j< this->m_numJ; ++j)
00242 for (size_t k=0; k< this->m_numK; ++k)
00243 s << "value(" << i << "," << j << "," << k << ")=" << this->get(i,j,k) << std::endl;
00244
00245 return s;
00246 }
00247
00248 #ifdef _WIN32
00249 # pragma warning( pop )
00250 #endif
00251
00252 #endif
00253
00254
00255
00256
00257
00258
00259
00260
00261