00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MBPOLYHEDRONCELL_H
00024 #define _MBPOLYHEDRONCELL_H
00025
00026 #ifdef _WIN32
00027 #pragma warning(push)
00028 #pragma warning(disable:4250)
00029 #endif
00030
00031 #include <MeshVizXLM/extractors/MxPolyhedronCellExtract.h>
00032 #include <MeshVizXLM/mesh/cell/MiVolumeCell.h>
00033 #include <MbMeshVizImpl.h>
00034
00035 #include <Inventor/STL/map>
00036
00037 typedef std::map<size_t,size_t> IndexPairMap;
00038 typedef std::map<size_t,size_t>::const_iterator IndexPairMapIterator;
00039 typedef std::pair<IndexPairMapIterator,bool> IndexPairMapRet;
00040
00046 class MbPolyhedronCell : virtual public MiVolumeCell
00047 {
00048 public:
00049
00053 template < typename _FacetNodeIter, typename _NumNodeIter>
00054 MbPolyhedronCell(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00055 _NumNodeIter beginNum, _NumNodeIter endNum);
00056
00057 virtual void getIsosurfTopology(unsigned char, std::vector< std::pair<size_t,size_t> >& ) const
00058 {
00059 }
00060
00064 virtual size_t getNumFacets() const;
00065
00069 virtual size_t getNumEdges() const;
00070
00074 virtual size_t getNumNodes() const;
00075
00076 virtual size_t getNodeIndex(size_t nod) const;
00077
00086 virtual size_t appendNodesIndexOfFacet (size_t facet, std::vector<size_t>& facetNodes) const;
00087
00096 virtual size_t appendLocalNodesIndexOfFacet (size_t facet, std::vector<size_t>& facetNodes) const;
00097
00101 virtual bool isPointInsideCell(const MiGeometryI& meshGeometry, const MbVec3d &point, std::vector<double>& weights) const;
00102
00106 virtual double getRelativeSize(const MiGeometryI* meshGeometry) const;
00107
00108
00109 private:
00113 virtual std::ostream& toStream(std::ostream& s) const;
00114
00115 std::vector<size_t> m_nodeIds;
00116 std::vector< std::vector<size_t> > m_facetNode;
00117 };
00118
00119
00120 template < typename _FacetNodeIter, typename _NumNodeIter>
00121 inline
00122 MbPolyhedronCell::MbPolyhedronCell(_FacetNodeIter beginFacetNode, _FacetNodeIter endFacetNode,
00123 _NumNodeIter beginNum, _NumNodeIter endNum)
00124 {
00125 IndexPairMap mapping;
00126 IndexPairMapRet retPair;
00127 size_t newIndex = 0;
00128 std::vector<size_t> localFacetIndex;
00129 size_t numFacet = std::distance(beginNum,endNum);
00130 m_facetNode.resize(numFacet);
00131 _FacetNodeIter itFacetNode = beginFacetNode;
00132 size_t nf = 0;
00133 for (_NumNodeIter itNum = beginNum; itNum != endNum; ++itNum, ++nf)
00134 {
00135 m_facetNode[nf].reserve(*itNum);
00136 _FacetNodeIter endIt = itFacetNode+*itNum;
00137 while ( itFacetNode != endIt )
00138 {
00139 retPair = mapping.insert(std::make_pair(*itFacetNode,newIndex));
00140 if ( retPair.second == false )
00141 m_facetNode[nf].push_back((*retPair.first).second);
00142 else
00143 {
00144 m_nodeIds.push_back(*itFacetNode);
00145 m_facetNode[nf].push_back(newIndex++);
00146 }
00147 ++itFacetNode;
00148 }
00149 }
00150 }
00151
00152
00153 inline size_t
00154 MbPolyhedronCell::appendNodesIndexOfFacet (size_t facet, std::vector<size_t>& facetNodes) const
00155 {
00156 std::vector<size_t>::const_iterator it;
00157 for ( it = m_facetNode[facet].begin(); it != m_facetNode[facet].end(); ++it )
00158 facetNodes.push_back(m_nodeIds[*it]);
00159
00160 return m_facetNode[facet].size();
00161 }
00162
00163
00164 inline size_t
00165 MbPolyhedronCell::appendLocalNodesIndexOfFacet (size_t facet, std::vector<size_t>& facetNodes) const
00166 {
00167 std::vector<size_t>::const_iterator it;
00168 for ( it = m_facetNode[facet].begin(); it != m_facetNode[facet].end(); ++it )
00169 facetNodes.push_back(*it);
00170
00171 return m_facetNode[facet].size();
00172 }
00173
00174
00175 inline bool
00176 MbPolyhedronCell::isPointInsideCell(const MiGeometryI& meshGeometry, const MbVec3d &point, std::vector<double>& weights) const
00177 {
00178 return MxPolyhedronCellExtract::isPointInsideCell(meshGeometry,this,point,weights);
00179 }
00180
00181
00182 inline double
00183 MbPolyhedronCell::getRelativeSize(const MiGeometryI* meshGeometry) const
00184 {
00185 return MxPolyhedronCellExtract::getLongestDistance(*meshGeometry,this);
00186 }
00187
00188
00189 inline size_t
00190 MbPolyhedronCell::getNumFacets() const
00191 {
00192 return m_facetNode.size();
00193 }
00194
00195
00196 inline size_t
00197 MbPolyhedronCell::getNumEdges() const
00198 {
00199 return 0;
00200 }
00201
00202
00203 inline size_t
00204 MbPolyhedronCell::getNumNodes() const
00205 {
00206 return m_nodeIds.size();
00207 }
00208
00209
00210 inline size_t
00211 MbPolyhedronCell::getNodeIndex(size_t nod) const
00212 {
00213 return m_nodeIds[nod];
00214 }
00215
00216
00217 inline std::ostream&
00218 MbPolyhedronCell::toStream(std::ostream& s) const
00219 {
00220 s << "MbPolyhedronCell (";
00221 size_t numNodes = m_nodeIds.size();
00222 for (size_t i=0; i<numNodes-1; ++i)
00223 s << m_nodeIds[i] << ",";
00224 s << m_nodeIds[numNodes-1];
00225 s << ")";
00226 return s;
00227 }
00228
00229 #ifdef _WIN32
00230 #pragma warning(pop)
00231 #endif
00232
00233 #endif
00234
00235
00236