00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 #ifndef  _MxWedgeCellExtract_h
00024 #define  _MxWedgeCellExtract_h
00025 
00026 #include <MeshVizXLM/mesh/geometry/MiGeometryI.h>
00027 
00028 #include <Inventor/STL/vector>
00029 #include <Inventor/STL/utility>
00030 
00031 class MxTabOfMarchingCase;
00032 class MiVolumeCell;
00033 
00059 class MESHIVIZ_API MxWedgeCellExtract 
00060 {
00061 public:
00062 
00068   static void getIsosurfTopology(unsigned char caseId, std::vector< std::pair<size_t,size_t> >& edgeList );
00069 
00083   static MbVec3d getIsoParametricCoord(const MiGeometryI& meshGeometry, const MiVolumeCell* wedgeCell, const MbVec3d &point);
00084   
00090   static MbVec3d getIsoParametricCoord(size_t nodeIndex)
00091   {
00092     return MbVec3d(s_nodesIsoParametricCoords[nodeIndex]);
00093   }
00094 
00114   static void getWeight(const MiGeometryI& meshGeometry, const MiVolumeCell* wedgeCell, const MbVec3d &point, std::vector<double>& weights)
00115   {
00116     MbVec3d ipcoord = getIsoParametricCoord(meshGeometry,wedgeCell,point);
00117     getWeight(ipcoord,weights);
00118   }
00119 
00132   static void getWeight(const MbVec3d &ipcoord, std::vector<double>& weights)
00133   {
00134     double um, tm;
00135 
00136     um = 1. - ipcoord[0] - ipcoord[1];
00137     tm = 1. - ipcoord[2];
00138 
00139     weights[0] = um * tm;
00140     weights[1] = ipcoord[0] * tm;
00141     weights[2] = ipcoord[1] * tm;
00142 
00143     weights[3] = um * ipcoord[2];
00144     weights[4] = ipcoord[0] * ipcoord[2];
00145     weights[5] = ipcoord[1] * ipcoord[2];
00146   }
00147 
00159   static void getDerivs(const MbVec3d &ipcoord, std::vector<double>& derivs);
00160 
00174   static bool isPointInsideCell(const MiGeometryI& meshGeometry, const MiVolumeCell* wedgeCell, const MbVec3d &point, std::vector<double>& weights)
00175   {
00176     MbVec3d pcoord = getIsoParametricCoord(meshGeometry,wedgeCell,point);
00177     bool inside =  ( -1.E-5 < pcoord[0] &&  pcoord[0] < 1 + 1.E-5 &&
00178                      -1.E-5 < pcoord[1] &&  pcoord[1] < 1 + 1.E-5 &&
00179                      -1.E-5 < pcoord[2] &&  pcoord[2] < 1 + 1.E-5 &&
00180                      -1.E-5 < (pcoord[0]+pcoord[1]) &&  (pcoord[0]+pcoord[1]) < 1 + 1.E-5);
00181     if (inside)
00182       getWeight(pcoord,weights);
00183     return inside;
00184   }
00185 
00189   static double getVolume(const MiGeometryI& meshGeometry, const MiVolumeCell* wedgeCell);
00190 
00194   static MbVec3d getFacetNormal(size_t facet, const MiGeometryI& meshGeometry, const MiVolumeCell* wedgeCell);
00195 
00199   static double getLongestEdgeLength(const MiGeometryI& meshGeometry, const MiVolumeCell* cell);
00200 
00204   static double getShortestEdgeLength(const MiGeometryI& meshGeometry, const MiVolumeCell* cell);
00205 
00206 private:
00207 
00208   static bool initClass();
00209   static void exitClass();
00210 
00211   static void initMarchingCase0();
00212   static void initMarchingCase1();
00213   static void initMarchingCase2();
00214   static void initMarchingCase3();
00215   static void initMarchingCase4();
00216   static void initMarchingCase5();
00217   static void initMarchingCase6();
00218   static void initMarchingCase7();
00219   static void initMarchingCase8();
00220   static void initMarchingCase9();
00221 
00222   static bool                 s_isInit;
00223   static MxTabOfMarchingCase* s_tabOfMarchingWedge;
00224   static double               s_nodesIsoParametricCoords[6][3];
00225 };
00226 
00227 #endif 
00228 
00229