Salome HOME
Fix valgrind error: Mismatched free() / delete / delete []
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_SurfaceTools.cxx
index e50fc4c7c525742b4d2174e0064168b0f62c6c3c..de773a6ee2fbbef40f7ca1c21a9aedfc98c5a97c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 //function : GetState
 //purpose  :
 //=======================================================================
- Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
-                                                  const GeomAdaptor_Surface& aGAS,
-                                                  const Standard_Real aTol,
-                                                  TopAbs_State& aState)
+ Standard_Integer GEOMAlgo_SurfaceTools::GetState
+  (const gp_Pnt& aP,
+   const GeomAdaptor_Surface& aGAS,
+   const Standard_Real aTol,
+   TopAbs_State& aState)
 {
   Standard_Integer    iErr  = 0;
   GeomAbs_SurfaceType aType = aGAS.GetType();
 //function : GetState
 //purpose  :
 //=======================================================================
- Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
-                                                  const Handle(Geom_Surface)& aSurf,
-                                                  const Standard_Real aTol,
-                                                  TopAbs_State& aState)
+ Standard_Integer GEOMAlgo_SurfaceTools::GetState
+  (const gp_Pnt& aP,
+   const Handle(Geom_Surface)& aSurf,
+   const Standard_Real aTol,
+   TopAbs_State& aState)
 {
   Standard_Integer iErr;
   GeomAdaptor_Surface aGAS;
 //function : ReverseState
 //purpose  :
 //=======================================================================
- TopAbs_State GEOMAlgo_SurfaceTools::ReverseState(const TopAbs_State aState)
+ TopAbs_State GEOMAlgo_SurfaceTools::ReverseState
+  (const TopAbs_State aState)
 {
   TopAbs_State aRSt=aState;
   //
 //function : IsCoaxial
 //purpose  :
 //=======================================================================
-Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
-                                                  const gp_Pnt& aP2,
-                                                  const gp_Cylinder& aCyl,
-                                                  const Standard_Real aTol)
+Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial
+  (const gp_Pnt& aP1,
+   const gp_Pnt& aP2,
+   const gp_Cylinder& aCyl,
+   const Standard_Real aTol)
 {
-  Standard_Boolean bRet=Standard_False;
-  Standard_Real aSM;
-  //
-  gp_Vec aV12(aP1, aP2);
-  gp_Dir aD12(aV12);
-  //
-  const gp_Ax1& aAxis=aCyl.Axis();
-  const gp_Dir& aDAxis=aAxis.Direction();
-  //
-  aSM=fabs(aD12*aDAxis);
-  if (fabs(1.-aSM) > aTol) {
-    return bRet;
+  const gp_XYZ &aLoc   = aCyl.Location().XYZ();
+  const gp_Ax1 &aAxis  = aCyl.Axis();
+  const gp_XYZ &aDAxis = aAxis.Direction().XYZ();
+  gp_XYZ        aDP1   = aP1.XYZ().Subtracted(aLoc);
+  gp_XYZ        aDP2   = aP2.XYZ().Subtracted(aLoc);
+  Standard_Real aDot1  = aDP1.Dot(aDAxis);
+  Standard_Real aDot2  = aDP1.Dot(aDAxis);
+  //Standard_Real aTol2  = aTol*aTol;
+
+  // Project P1 and P2 onto a plane with location aLoc and Norm aDAxis.
+  aDP1.Subtract(aDAxis.Multiplied(aDot1));
+  aDP2.Subtract(aDAxis.Multiplied(aDot2));
+
+  Standard_Real    aRadius1 = aDP1.Modulus();
+  Standard_Real    aRadius2 = aDP2.Modulus();
+  Standard_Boolean isOn     = Standard_False;
+
+  if (fabs(aRadius1 - aRadius2) <= aTol) {
+    // Check the deflection of the middle point.
+    gp_XYZ        aMidP       = 0.5*(aDP1 + aDP2);
+    //Standard_Real aMidRadius1 = aMidP.Modulus();
+
+    if (fabs(aRadius1 - aRadius2) <= aTol) {
+      isOn = Standard_True;
+    }
   }
-  //
-  return !bRet;
+
+  return isOn;
 }
 //=======================================================================
 //function : IsAnalytic
 //purpose  :
 //=======================================================================
-Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& aSurf)
+Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic
+  (const Handle(Geom_Surface)& aSurf)
 {
   Standard_Boolean bRet;
   GeomAbs_SurfaceType aType;
@@ -177,8 +195,9 @@ Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& a
 //function : IsConformState
 //purpose  :
 //=======================================================================
-Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState(const TopAbs_State aST1,
-                                                       const GEOMAlgo_State aST2)
+Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState
+  (const TopAbs_State aST1,
+   const GEOMAlgo_State aST2)
 {
   Standard_Boolean bRet=Standard_False;
   //