00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MBPOLYGONCELL_H
00024 #define _MBPOLYGONCELL_H
00025
00026 #ifdef _WIN32
00027 #pragma warning(push)
00028 #pragma warning(disable:4250)
00029 #endif
00030
00031 #include <MeshVizXLM/extractors/MxPolygonCellExtract.h>
00032 #include <MeshVizXLM/mesh/cell/MiSurfaceCell.h>
00033 #include <MbMeshVizImpl.h>
00034
00040 class MbPolygonCell : virtual public MiSurfaceCell
00041 {
00042 public:
00043
00047 template <typename _NodeIdIter>
00048 MbPolygonCell(_NodeIdIter beginId, _NodeIdIter endId);
00049
00053 double getArea(const MiGeometryI* meshGeometry) const;
00054
00058 virtual size_t getNumEdges() const;
00059
00063 virtual size_t getNumNodes() const;
00064
00065 virtual size_t getNodeIndex(size_t nod) const;
00066
00070 virtual bool isPointInsideCell(const MiGeometryI& meshGeometry, const MbVec3d &point, std::vector<double>& weights) const;
00071
00075 virtual double getRelativeSize(const MiGeometryI* meshGeometry) const;
00076
00077
00078 private:
00082 virtual std::ostream& toStream(std::ostream& s) const;
00083
00084 std::vector<size_t> m_nodeIds;
00085
00086 };
00087
00088
00089 template <typename _NodeIdIter>
00090 inline
00091 MbPolygonCell::MbPolygonCell(_NodeIdIter beginId, _NodeIdIter endId)
00092 {
00093 m_nodeIds.assign(beginId,endId);
00094 }
00095
00096
00097 inline bool
00098 MbPolygonCell::isPointInsideCell(const MiGeometryI& meshGeometry, const MbVec3d &point, std::vector<double>& weights) const
00099 {
00100 return MxPolygonCellExtract::isPointInsideCell(meshGeometry,this,point,weights);
00101 }
00102
00103
00104 inline double
00105 MbPolygonCell::getRelativeSize(const MiGeometryI* meshGeometry) const
00106 {
00107 return MxPolygonCellExtract::getLongestEdgeLength(*meshGeometry,this);
00108 }
00109
00110
00111 inline double
00112 MbPolygonCell::getArea(const MiGeometryI* meshGeometry) const
00113 {
00114 return MxPolygonCellExtract::getArea(*meshGeometry,this);
00115 }
00116
00117
00118 inline size_t
00119 MbPolygonCell::getNumEdges() const
00120 {
00121 return m_nodeIds.size();
00122 }
00123
00124
00125 inline size_t
00126 MbPolygonCell::getNumNodes() const
00127 {
00128 return m_nodeIds.size();
00129 }
00130
00131
00132 inline size_t
00133 MbPolygonCell::getNodeIndex(size_t nod) const
00134 {
00135 return m_nodeIds[nod];
00136 }
00137
00138
00139 inline std::ostream&
00140 MbPolygonCell::toStream(std::ostream& s) const
00141 {
00142 s << "MbPolygonCell (";
00143 size_t numNodes = m_nodeIds.size();
00144 for (size_t i=0; i<numNodes-1; ++i)
00145 s << m_nodeIds[i] << ",";
00146 s << m_nodeIds[numNodes-1];
00147 s << ")";
00148 return s;
00149 }
00150
00151 #ifdef _WIN32
00152 #pragma warning(pop)
00153 #endif
00154
00155 #endif
00156
00157
00158