Back to index

salome-geom  6.5.0
GEOMAlgo_SurfaceTools.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 // File:        GEOMAlgo_SurfaceTools.cxx
00024 // Created:     Thu Jan 27 11:05:16 2005
00025 // Author:      Peter KURNEV
00026 //              <pkv@irinox>
00027 //
00028 #include <GEOMAlgo_SurfaceTools.hxx>
00029 
00030 #include <math.h>
00031 
00032 #include <gp_Pln.hxx>
00033 #include <gp_Cylinder.hxx>
00034 #include <gp_Sphere.hxx>
00035 #include <gp_Ax1.hxx>
00036 #include <gp_Lin.hxx>
00037 #include <gp_Ax3.hxx>
00038 #include <gp_Dir.hxx>
00039 #include <gp_Ax1.hxx>
00040 #include <gp_Vec.hxx>
00041 
00042 #include <GeomAbs_SurfaceType.hxx>
00043 #include <GeomAdaptor_Surface.hxx>
00044 
00045 
00046 //=======================================================================
00047 //function : GetState
00048 //purpose  :
00049 //=======================================================================
00050  Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
00051                                                   const GeomAdaptor_Surface& aGAS,
00052                                                   const Standard_Real aTol,
00053                                                   TopAbs_State& aState)
00054 {
00055   Standard_Integer iErr;
00056   Standard_Real aDp, aR;
00057   GeomAbs_SurfaceType aType;
00058   gp_Sphere aSph;
00059   gp_Cylinder aCyl;
00060   gp_Pln aPln;
00061   //
00062   iErr=0;
00063   aState=TopAbs_UNKNOWN;
00064   //
00065   aType=aGAS.GetType();
00066   switch (aType) {
00067   case GeomAbs_Plane:
00068     aPln=aGAS.Plane();
00069     aR=0.;
00070     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aPln);
00071     break;
00072 
00073   case GeomAbs_Cylinder:
00074     aCyl=aGAS.Cylinder();
00075     aR=aCyl.Radius();
00076     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aCyl);
00077     break;
00078 
00079   case GeomAbs_Sphere:
00080     aSph=aGAS.Sphere();
00081     aR=aSph.Radius();
00082     aDp=GEOMAlgo_SurfaceTools::Distance(aP, aSph);
00083     break;
00084 
00085   default:
00086     iErr=1; // unprocessed surface type
00087     break;
00088   }
00089   //
00090   if (!iErr) {
00091     aState=TopAbs_ON;
00092     if (aDp>aR+aTol) {
00093       aState=TopAbs_OUT;
00094     }
00095     else if (aDp<aR-aTol) {
00096       aState=TopAbs_IN;
00097     }
00098   }
00099   //
00100   return iErr;
00101 }
00102 //=======================================================================
00103 //function : GetState
00104 //purpose  :
00105 //=======================================================================
00106  Standard_Integer GEOMAlgo_SurfaceTools::GetState(const gp_Pnt& aP,
00107                                                   const Handle(Geom_Surface)& aSurf,
00108                                                   const Standard_Real aTol,
00109                                                   TopAbs_State& aState)
00110 {
00111   Standard_Integer iErr;
00112   GeomAdaptor_Surface aGAS;
00113   //
00114   aState=TopAbs_UNKNOWN;
00115   aGAS.Load(aSurf);
00116   //
00117   iErr=GEOMAlgo_SurfaceTools::GetState(aP, aGAS, aTol, aState);
00118   //
00119   return iErr;
00120 }
00121 //=======================================================================
00122 //function : ReverseState
00123 //purpose  :
00124 //=======================================================================
00125  TopAbs_State GEOMAlgo_SurfaceTools::ReverseState(const TopAbs_State aState)
00126 {
00127   TopAbs_State aRSt=aState;
00128   //
00129   switch (aState) {
00130     case TopAbs_IN:
00131      aRSt=TopAbs_OUT;
00132      break;
00133    case TopAbs_OUT:
00134      aRSt=TopAbs_IN;
00135      break;
00136    default:
00137      break;
00138   }
00139   //
00140   return aRSt;
00141 }
00142 //=======================================================================
00143 //function : Distance
00144 //purpose  :
00145 //=======================================================================
00146 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
00147                                               const gp_Sphere& aSph)
00148 {
00149   Standard_Real aD;
00150   //
00151   const gp_Pnt& aLoc=aSph.Location();
00152   aD=aLoc.Distance(aP);
00153   //
00154   return aD;
00155 }
00156 //=======================================================================
00157 //function : Distance
00158 //purpose  :
00159 //=======================================================================
00160 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
00161                                               const gp_Cylinder& aCyl)
00162 {
00163   Standard_Real aD;
00164   //
00165   const gp_Ax1& aAxis=aCyl.Axis();
00166   gp_Lin aLin(aAxis);
00167   aD=aLin.Distance(aP);
00168   //
00169   return aD;
00170 }
00171 //=======================================================================
00172 //function : Distance
00173 //purpose  :
00174 //=======================================================================
00175 Standard_Real GEOMAlgo_SurfaceTools::Distance(const gp_Pnt& aP,
00176                                               const gp_Pln& aPL)
00177 {
00178   Standard_Real aD;
00179   //
00180   const gp_Ax3& aPos=aPL.Position();
00181   const gp_Pnt& aLoc=aPos.Location ();
00182   const gp_Dir& aDir=aPos.Direction();
00183   //
00184   aD= (aDir.X() * (aP.X() - aLoc.X()) +
00185        aDir.Y() * (aP.Y() - aLoc.Y()) +
00186        aDir.Z() * (aP.Z() - aLoc.Z()));
00187   return aD;
00188 }
00189 //=======================================================================
00190 //function : IsCoaxial
00191 //purpose  :
00192 //=======================================================================
00193 Standard_Boolean GEOMAlgo_SurfaceTools::IsCoaxial(const gp_Pnt& aP1,
00194                                                   const gp_Pnt& aP2,
00195                                                   const gp_Cylinder& aCyl,
00196                                                   const Standard_Real aTol)
00197 {
00198   Standard_Boolean bRet=Standard_False;
00199   Standard_Real aSM;
00200   //
00201   gp_Vec aV12(aP1, aP2);
00202   gp_Dir aD12(aV12);
00203   //
00204   const gp_Ax1& aAxis=aCyl.Axis();
00205   const gp_Dir& aDAxis=aAxis.Direction();
00206   //
00207   aSM=fabs(aD12*aDAxis);
00208   if (fabs(1.-aSM) > aTol) {
00209     return bRet;
00210   }
00211   //
00212   return !bRet;
00213 }
00214 //=======================================================================
00215 //function : IsAnalytic
00216 //purpose  :
00217 //=======================================================================
00218 Standard_Boolean GEOMAlgo_SurfaceTools::IsAnalytic(const Handle(Geom_Surface)& aSurf)
00219 {
00220   Standard_Boolean bRet;
00221   GeomAbs_SurfaceType aType;
00222   GeomAdaptor_Surface aGAS;
00223   //
00224   aGAS.Load(aSurf);
00225   aType=aGAS.GetType();
00226   bRet=(aType==GeomAbs_Plane ||
00227         aType==GeomAbs_Cylinder ||
00228         aType==GeomAbs_Sphere);
00229   return bRet;
00230 }
00231 //=======================================================================
00232 //function : IsConformState
00233 //purpose  :
00234 //=======================================================================
00235 Standard_Boolean GEOMAlgo_SurfaceTools::IsConformState(const TopAbs_State aST1,
00236                                                        const GEOMAlgo_State aST2)
00237 {
00238   Standard_Boolean bRet=Standard_False;
00239   //
00240   switch (aST2) {
00241     case GEOMAlgo_ST_IN:
00242       if (aST1==TopAbs_IN) {
00243         bRet=!bRet;
00244       }
00245       break;
00246     case GEOMAlgo_ST_OUT:
00247       if (aST1==TopAbs_OUT) {
00248         bRet=!bRet;
00249       }
00250       break;
00251     case GEOMAlgo_ST_ON:
00252       if (aST1==TopAbs_ON) {
00253         bRet=!bRet;
00254       }
00255       break;
00256     case GEOMAlgo_ST_ONIN:
00257       if (aST1==TopAbs_ON || aST1==TopAbs_IN) {
00258         bRet=!bRet;
00259       }
00260       break;
00261     case GEOMAlgo_ST_ONOUT:
00262       if (aST1==TopAbs_ON || aST1==TopAbs_OUT) {
00263         bRet=!bRet;
00264       }
00265       break;
00266     default:
00267       break;
00268   }
00269   return bRet;
00270 }