]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Bug in checkButterfly.
authorageay <ageay>
Wed, 25 Apr 2012 16:07:59 +0000 (16:07 +0000)
committerageay <ageay>
Wed, 25 Apr 2012 16:07:59 +0000 (16:07 +0000)
src/MEDCoupling/MEDCouplingPointSet.cxx
src/MEDCoupling/MEDCouplingPointSet.hxx
src/MEDCoupling/MEDCouplingUMesh.cxx
src/MEDCoupling/MEDCouplingUMesh.hxx

index f66834967956f1588247340b87affd15c8a0203a..11db59d65e32bc0f9249945683e3c41bba72b469 100644 (file)
@@ -912,7 +912,7 @@ void MEDCouplingPointSet::project2DCellOnXY(const int *startConn, const int *end
 /*!
  * low level method that checks that the 2D cell is not a butterfly cell.
  */
-bool MEDCouplingPointSet::isButterfly2DCell(const std::vector<double>& res, bool isQuad)
+bool MEDCouplingPointSet::isButterfly2DCell(const std::vector<double>& res, bool isQuad, double eps)
 {
   std::size_t nbOfNodes=res.size()/2;
   std::vector<INTERP_KERNEL::Node *> nodes(nbOfNodes);
@@ -921,12 +921,14 @@ bool MEDCouplingPointSet::isButterfly2DCell(const std::vector<double>& res, bool
       INTERP_KERNEL::Node *tmp=new INTERP_KERNEL::Node(res[2*i],res[2*i+1]);
       nodes[i]=tmp;
     }
+  INTERP_KERNEL::QUADRATIC_PLANAR::_precision=eps;
+  INTERP_KERNEL::QUADRATIC_PLANAR::_arc_detection_precision=eps;
   INTERP_KERNEL::QuadraticPolygon *pol=0;
   if(isQuad)
     pol=INTERP_KERNEL::QuadraticPolygon::BuildArcCirclePolygon(nodes);
   else
     pol=INTERP_KERNEL::QuadraticPolygon::BuildLinearPolygon(nodes);
-  bool ret=pol->isButterfly();
+  bool ret=pol->isButterflyAbs();
   delete pol;
   return ret;
 }
index 8e0561959ab972607ca98729dc426cad3654a61b..257af5247d958eae0d3e1dec762868a1530797bc 100644 (file)
@@ -115,7 +115,7 @@ namespace ParaMEDMEM
     void rotate2D(const double *center, double angle);
     void rotate3D(const double *center, const double *vect, double angle);
     void project2DCellOnXY(const int *startConn, const int *endConn, std::vector<double>& res) const;
-    static bool isButterfly2DCell(const std::vector<double>& res, bool isQuad);
+    static bool isButterfly2DCell(const std::vector<double>& res, bool isQuad, double eps);
     template<int SPACEDIM>
     void findNodeIdsNearPointAlg(std::vector<double>& bbox, const double *pos, int nbNodes, double eps,
                                  std::vector<int>& c, std::vector<int>& cI) const;
index a4d6e686853faa238af29ce40aa1fe54eda1d4bd..58b63bddc3898ca39efeb8415474228fad4b9902 100644 (file)
@@ -2987,7 +2987,7 @@ void MEDCouplingUMesh::getCellsContainingPoints(const double *pos, int nbOfPoint
  * A 2D cell is considered to be butterfly if it exists at least one pair of distinct edges of it that intersect each other
  * anywhere excepted their extremities. An INTERP_KERNEL::NORM_NORI3 could \b not be butterfly.
  */
-void MEDCouplingUMesh::checkButterflyCells(std::vector<int>& cells) const
+void MEDCouplingUMesh::checkButterflyCells(std::vector<int>& cells, double eps) const
 {
   const char msg[]="Butterfly detection work only for 2D cells with spaceDim==2 or 3!";
   if(getMeshDimension()!=2)
@@ -3007,7 +3007,7 @@ void MEDCouplingUMesh::checkButterflyCells(std::vector<int>& cells) const
         continue;
       bool isQuad=INTERP_KERNEL::CellModel::GetCellModel((INTERP_KERNEL::NormalizedCellType)conn[offset]).isQuadratic();
       project2DCellOnXY(conn+offset+1,conn+connI[i+1],cell2DinS2);
-      if(isButterfly2DCell(cell2DinS2,isQuad))
+      if(isButterfly2DCell(cell2DinS2,isQuad,eps))
         cells.push_back(i);
       cell2DinS2.clear();
     }
index b2f81b1bf497098a035c6bc88bece1c626a0b95b..163a8ccf93796119d36215ba865773a914c4dd2e 100644 (file)
@@ -137,7 +137,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT int getCellContainingPoint(const double *pos, double eps) const;
     MEDCOUPLING_EXPORT void getCellsContainingPoint(const double *pos, double eps, std::vector<int>& elts) const;
     MEDCOUPLING_EXPORT void getCellsContainingPoints(const double *pos, int nbOfPoints, double eps, std::vector<int>& elts, std::vector<int>& eltsIndex) const;
-    MEDCOUPLING_EXPORT void checkButterflyCells(std::vector<int>& cells) const;
+    MEDCOUPLING_EXPORT void checkButterflyCells(std::vector<int>& cells, double eps=1e-12) const;
     MEDCOUPLING_EXPORT void findAndCorrectBadOriented3DExtrudedCells(std::vector<int>& cells) throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void getBoundingBoxForBBTree(std::vector<double>& bbox) const;
     MEDCOUPLING_EXPORT MEDCouplingUMesh *buildExtrudedMesh(const MEDCouplingUMesh *mesh1D, int policy);