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 _PB_VOXELCELL_
00025 #define _PB_VOXELCELL_
00026
00027 #include <MeshViz/3Ddata/PbCell.h>
00028 #include <MeshViz/3Ddata/PbHexahedronCell.h>
00029
00030 class PbMesh;
00031 class PiMarchingCase;
00032
00063 class PbVoxelCell : public PbCell {
00064
00065
00066 public:
00067
00071 PbVoxelCell(const PbMesh *owner_mesh) ;
00072
00076 PbVoxelCell(const PbVoxelCell &cell);
00077
00081 ~PbVoxelCell() ;
00082
00086 PbVoxelCell& operator=(const PbVoxelCell &cell) ;
00087
00091 virtual float getLongestEdgeLength() const;
00092
00096 virtual SbBox3f getBoundingBox() const;
00097
00102 void getBounds(float &xmin,float &ymin, float &zmin,
00103 float &xmax,float &ymax, float &zmax) const;
00104
00108 virtual SbVec3f getCenter() const;
00109
00113 virtual float getVolume() const { return m_dx * m_dy * m_dz;}
00114
00118 virtual float getArea() const { return 0.0;}
00119
00124 virtual void getNodesIndexOfEdge (int edge, PbArrayOfInt &nodes_index) const;
00125
00130 virtual void getNodesIndexOfFacet (int facet, PbArrayOfInt &nodes_index) const;
00131
00137 virtual void getNodesLocalIndexOfEdge (int edge, PbArrayOfInt &nodes_index) const;
00138
00144 virtual void getNodesLocalIndexOfFacet (int facet, PbArrayOfInt &nodes_index) const;
00145
00150 virtual int locatePoint(const SbVec3f &coord, float tolerance, SbVec3f &pcoord) const;
00151
00155 virtual void getWeight(const SbVec3f &pcoord, float *weight) const;
00156
00164 virtual float getValue(const SbVec3f &pcoord, const float *s) const;
00165
00173 virtual SbVec3f getValue(const SbVec3f &pcoord, const SbVec3f *v) const;
00174
00175
00176 private:
00180 SbBool set(int index, int *node_ids,
00181 float x_min, float y_min, float z_min,
00182 float x_max, float y_max, float z_max);
00183
00184 virtual const int* getNodesLocalIndexOfEdge(int edge) const {
00185 return c_edgeNodes[edge];
00186 }
00187
00188 void print(FILE *fp) const;
00189
00190
00191 PiMarchingCase* getMCcase(unsigned char mc_case) const {
00192 return PbHexahedronCell::c_MarchingLookup[mc_case];
00193 }
00194
00195
00196 private:
00197 virtual unsigned char getIsosurfCaseId(SbBoolVector &nodes_sign) const;
00198
00199 private:
00200
00201 void copy(const PbVoxelCell &cell) ;
00202 void destroy();
00203
00204 float m_xmin,m_ymin,m_zmin, m_xmax,m_ymax,m_zmax, m_dx,m_dy,m_dz;
00205 static int c_edgeNodes[12][2];
00206 };
00207
00208
00209
00210 #endif
00211
00212
00213
00214
00215
00216
00217
00218