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_PYRAMIDCELL_
00025 #define _PB_PYRAMIDCELL_
00026
00027 #include <MeshViz/3Ddata/PbCell.h>
00028
00029 #ifdef USE_IOSTREAM
00030 # include <iostream>
00031 #endif
00032
00033 class PbMesh;
00034 class PiMarchingCase;
00035
00065 class PbPyramidCell : public PbCell {
00066
00067
00068 public:
00069
00073 PbPyramidCell(const PbMesh *owner_mesh) ;
00074
00078 PbPyramidCell(const PbPyramidCell &cell);
00079
00083 ~PbPyramidCell() ;
00084
00088 PbPyramidCell& operator=(const PbPyramidCell &cell) ;
00089
00093 virtual float getLongestEdgeLength() const;
00094
00098 virtual float getVolume() const;
00099
00103 virtual float getArea() const { return 0.0;}
00104
00109 virtual void getNodesIndexOfEdge (int edge, PbArrayOfInt &nodes_index) const;
00110
00115 virtual void getNodesIndexOfFacet (int facet, PbArrayOfInt &nodes_index) const;
00116
00122 virtual void getNodesLocalIndexOfEdge (int edge, PbArrayOfInt &nodes_index) const;
00123
00129 virtual void getNodesLocalIndexOfFacet (int facet, PbArrayOfInt &nodes_index) const;
00130
00135 virtual int locatePoint(const SbVec3f &coord, float tolerance, SbVec3f &pcoord) const;
00136
00140 virtual void getWeight(const SbVec3f &pcoord, float *weight) const;
00141
00146 void getDerivs(const SbVec3f &pcoord, float *weight) const;
00147
00148
00149 private:
00153 SbBool set(int index, int *node_ids, float *x, float *y, float *z);
00154
00155 void print(FILE *fp) const;
00156
00157
00159 virtual int getOrdering() const;
00160
00161 virtual const int* getNodesLocalIndexOfEdge(int edge) const {
00162 return c_edgeNodes[edge];
00163 }
00164
00165
00166 PiMarchingCase* getMCcase(unsigned char mc_case) const {
00167 return c_MarchingLookup[mc_case];
00168 }
00169
00170 #ifdef USE_IOSTREAM
00171 friend std::ostream& operator << (std::ostream& s, PbPyramidCell &cell);
00172 #endif
00173
00174 static SbBool init();
00175 static void finish();
00176
00177
00178
00179 private:
00180 virtual unsigned char getIsosurfCaseId(SbBoolVector &nodes_sign) const;
00181
00182 private:
00183
00184 void copy(const PbPyramidCell &cell) ;
00185 void destroy();
00186
00187 static PiMarchingCase* addMC(PiMarchingCase *mcase);
00188 static PiMarchingCase* addMCBoth(PiMarchingCase *mcase);
00189
00190 static int c_edgeNodes[8][2];
00191 static PiMarchingCase* c_MarchingLookup[32];
00192 static SbBool c_isInit;
00193 static int c_count;
00194 };
00195
00196
00197
00198 #endif
00199
00200
00201
00202
00203
00204
00205
00206