]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
0020440: [CEA 349] P1P0 barycentric interpolators
authoreap <eap@opencascade.com>
Tue, 29 Sep 2009 06:55:48 +0000 (06:55 +0000)
committereap <eap@opencascade.com>
Tue, 29 Sep 2009 06:55:48 +0000 (06:55 +0000)
+    double intersectWith(const QuadraticPolygon& other, double* barycenter) const;

src/INTERP_KERNEL/Geometric2D/QuadraticPolygon.cxx
src/INTERP_KERNEL/Geometric2D/QuadraticPolygon.hxx

index f5642487403a5314c411e070083a16fbc1227bdc..817c68477b192e4559ed451de2d87a797dbacc27 100644 (file)
@@ -197,6 +197,33 @@ double QuadraticPolygon::intersectWith(const QuadraticPolygon& other) const
   return ret;
 }
 
+/*!
+ * \b WARNING this method is const and other is const too. \b BUT location of Edges in 'this' and 'other' are nevertheless modified.
+ * This is possible because loc attribute in Edge class is mutable.
+ * This implies that if 'this' or/and 'other' are reused for intersect* method initLocations has to be called on each of this/them.
+ */
+double QuadraticPolygon::intersectWith(const QuadraticPolygon& other, double* barycenter) const
+{
+  double ret=0., bary[2];
+  barycenter[0] = barycenter[1] = 0.;
+  vector<QuadraticPolygon *> polygs=intersectMySelfWith(other);
+  for(vector<QuadraticPolygon *>::iterator iter=polygs.begin();iter!=polygs.end();iter++)
+  {
+    double area = fabs((*iter)->getArea());
+    (*iter)->getBarycenter(bary);
+    delete *iter;
+    ret+=area;
+    barycenter[0] += bary[0]*area;
+    barycenter[1] += bary[1]*area;
+  }
+  if ( ret > std::numeric_limits<double>::min() )
+  {
+    barycenter[0] /= ret;
+    barycenter[1] /= ret;
+  }
+  return ret;
+}
+
 /*!
  * \b WARNING this method is const and other is const too. \b BUT location of Edges in 'this' and 'other' are nevertheless modified.
  * This is possible because loc attribute in Edge class is mutable.
index 78977ecf5a4a3fc70b50170a5900871288449bd4..fba577d8bd781cdac26a81d9b6f2202e04ec69c6 100644 (file)
@@ -50,6 +50,7 @@ namespace INTERP_KERNEL
     //! Before intersecting as intersectWith a normalization is done.
     double intersectWithAbs(QuadraticPolygon& other);
     double intersectWith(const QuadraticPolygon& other) const;
+    double intersectWith(const QuadraticPolygon& other, double* barycenter) const;
     std::vector<QuadraticPolygon *> intersectMySelfWith(const QuadraticPolygon& other) const;
     void intersectForPerimeter(const QuadraticPolygon& other, double& perimeterThisPart, double& perimeterOtherPart, double& perimeterCommonPart) const;
     void intersectForPerimeterAdvanced(const QuadraticPolygon& other, std::vector< double >& polThis, std::vector< double >& polOther) const;