Salome HOME
updated copyright message
[modules/geom.git] / src / GEOMAlgo / GEOMAlgo_SurfaceTools.cxx
index f8ade1562794cdbd613229e8dfc189089a13f3cc..65fbe73d9786e5d08bfb779c57f0ae0c84c42c1f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  CEA, EDF, 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
 
 #include <GeomAbs_SurfaceType.hxx>
 #include <GeomAdaptor_Surface.hxx>
+#include <IntSurf_Quadric.hxx>
 
 
 //=======================================================================
 //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;
-  Standard_Real aDp, aR;
-  GeomAbs_SurfaceType aType;
-  gp_Sphere aSph;
-  gp_Cylinder aCyl;
-  gp_Pln aPln;
+  Standard_Integer    iErr  = 0;
+  GeomAbs_SurfaceType aType = aGAS.GetType();
+  IntSurf_Quadric     aQuad;
   //
-  iErr=0;
-  aState=TopAbs_UNKNOWN;
+  aState = TopAbs_UNKNOWN;
   //
-  aType=aGAS.GetType();
   switch (aType) {
   case GeomAbs_Plane:
-    aPln=aGAS.Plane();
-    aR=0.;
-    aDp=GEOMAlgo_SurfaceTools::Distance(aP, aPln);
+    aQuad.SetValue(aGAS.Plane());
     break;
 
   case GeomAbs_Cylinder:
-    aCyl=aGAS.Cylinder();
-    aR=aCyl.Radius();
-    aDp=GEOMAlgo_SurfaceTools::Distance(aP, aCyl);
+    aQuad.SetValue(aGAS.Cylinder());
     break;
 
   case GeomAbs_Sphere:
-    aSph=aGAS.Sphere();
-    aR=aSph.Radius();
-    aDp=GEOMAlgo_SurfaceTools::Distance(aP, aSph);
+    aQuad.SetValue(aGAS.Sphere());
     break;
 
   default:
   }
   //
   if (!iErr) {
-    aState=TopAbs_ON;
-    if (aDp>aR+aTol) {
-      aState=TopAbs_OUT;
-    }
-    else if (aDp<aR-aTol) {
-      aState=TopAbs_IN;
+    const Standard_Real aDp = aQuad.Distance(aP);
+    //
+    aState = TopAbs_ON;
+    //
+    if (aDp > aTol) {
+      aState = TopAbs_OUT;
+    } else if (aDp < -aTol) {
+      aState = TopAbs_IN;
     }
   }
   //
 //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;
   //
   return aRSt;
 }
 //=======================================================================
-//function : Distance
-//purpose  :
-//=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
-                                              const gp_Sphere& aSph)
-{
-  Standard_Real aD;
-  //
-  const gp_Pnt& aLoc=aSph.Location();
-  aD=aLoc.Distance(aP);
-  //
-  return aD;
-}
-//=======================================================================
-//function : Distance
-//purpose  :
-//=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
-                                              const gp_Cylinder& aCyl)
-{
-  Standard_Real aD;
-  //
-  const gp_Ax1& aAxis=aCyl.Axis();
-  gp_Lin aLin(aAxis);
-  aD=aLin.Distance(aP);
-  //
-  return aD;
-}
-//=======================================================================
-//function : Distance
-//purpose  :
-//=======================================================================
-Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
-                                              const gp_Pln& aPL)
-{
-  Standard_Real aD;
-  //
-  const gp_Ax3& aPos=aPL.Position();
-  const gp_Pnt& aLoc=aPos.Location ();
-  const gp_Dir& aDir=aPos.Direction();
-  //
-  aD= (aDir.X() * (aP.X() - aLoc.X()) +
-       aDir.Y() * (aP.Y() - aLoc.Y()) +
-       aDir.Z() * (aP.Z() - aLoc.Z()));
-  return aD;
-}
-//=======================================================================
 //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;
@@ -232,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;
   //