0023782: Intersection algorithm produces wrong section curves for the attached faces
[occt.git] / src / Adaptor3d / Adaptor3d_TopolTool.cxx
index 7a73a38..cfaa83d 100755 (executable)
@@ -1,3 +1,20 @@
+// Copyright (c) 1999-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
 
 #include <Standard_NotImplemented.hxx>
 #include <Adaptor3d_TopolTool.ixx>
@@ -30,7 +47,7 @@ static void GetConeApexParam(const gp_Cone& C, Standard_Real& U, Standard_Real&
   else {
     U = atan2(Ploc.Y(),Ploc.X());
   }
-  if      (U < -1.e-16)  U += (PI+PI);
+  if      (U < -1.e-16)  U += (M_PI+M_PI);
   else if (U < 0)        U = 0;
 
   V =  sin(SAngle) * ( Ploc.X() * cos(U) + Ploc.Y() * sin(U) - Radius)
@@ -765,7 +782,6 @@ Standard_Boolean Adaptor3d_TopolTool::DomainIsInfinite() {
   if(Precision::IsPositiveInfinite(Vsup)) return(Standard_True);
   return(Standard_False);
 }
-//modified by NIZNHY-PKV Mon Apr 23 16:00:31 2001 f
 //=======================================================================
 //function : Edge
 //purpose  : 
@@ -774,8 +790,6 @@ Standard_Boolean Adaptor3d_TopolTool::DomainIsInfinite() {
 {
   return NULL;
 } 
-//modified by NIZNHY-PKV Mon Apr 23 16:00:35 2001 t
-
 //=======================================================================
 //function : Has3d
 //purpose  : 
@@ -962,6 +976,23 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
   Standard_Boolean bUuniform = Standard_False;
   Standard_Boolean bVuniform = Standard_False;
 
+  //modified by NIZHNY-EMV Mon Jun 10 14:19:04 2013
+  if (nbsu < theNUmin || nbsv < theNVmin) {
+    Standard_Integer aNb;
+    if (nbsu < nbsv) {
+      aNb = (Standard_Integer)(nbsv * ((Standard_Real)theNUmin)/((Standard_Real)nbsu));
+      aNb = Min(aNb, 30);
+      bVuniform = (aNb > nbsv) ? Standard_True : bVuniform;
+      nbsv = bVuniform ? aNb : nbsv;
+    } else {
+      aNb = (Standard_Integer)(nbsu * ((Standard_Real)theNVmin)/((Standard_Real)nbsv));
+      aNb = Min(aNb, 30);
+      bUuniform = (aNb > nbsu) ? Standard_True : bUuniform;
+      nbsu = bUuniform ? aNb : nbsu;
+    }
+  }
+  //modified by NIZHNY-EMV Mon Jun 10 14:19:05 2013
+
   if(nbsu < theNUmin) {
     nbsu = theNUmin;
     bUuniform = Standard_True;
@@ -1056,7 +1087,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
 
   anUFlg(1) = Standard_True;
   anUFlg(nbsu) = Standard_True;
-  myNbSamplesU = 2; 
+  //myNbSamplesU = 2; 
   for(i = 1; i <= nbsv; ++i) {
     t1 = aVPars(i);
     j = 1;
@@ -1099,7 +1130,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
        if(!ok) {
          j = k - 1;
          anUFlg(j) = Standard_True;
-         ++myNbSamplesU;
+         //++myNbSamplesU;
          break;
        }
        
@@ -1115,6 +1146,12 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
 
     }
   }
+
+  myNbSamplesU = 0;
+  for (i = 1; i <= nbsu; i++)
+    if (anUFlg(i) == Standard_True)
+      myNbSamplesU++;
+  
   if(myNbSamplesU < myMinPnts) {
     if(myNbSamplesU == 2) {
       //"uniform" distribution;
@@ -1135,7 +1172,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
       
   aVFlg(1) = Standard_True;
   aVFlg(nbsv) = Standard_True;
-  myNbSamplesV = 2;
+  //myNbSamplesV = 2;
   for(i = 1; i <= nbsu; ++i) {
     t1 = anUPars(i);
     j = 1;
@@ -1177,7 +1214,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
        if(!ok) {
          j = k - 1;
          aVFlg(j) = Standard_True;
-         ++myNbSamplesV;
+         //++myNbSamplesV;
          break;
        }
        
@@ -1193,6 +1230,12 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
 
     }
   }
+
+  myNbSamplesV = 0;
+  for (i = 1; i <= nbsv; i++)
+    if (aVFlg(i) == Standard_True)
+      myNbSamplesV++;
+  
   if(myNbSamplesV < myMinPnts) {
     if(myNbSamplesV == 2) {
       //"uniform" distribution;
@@ -1211,8 +1254,52 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
     myNbSamplesV = myMinPnts;
     aVFlg(j) = Standard_True;
   }
-
+  //
+  //modified by NIZNHY-PKV Fri Dec 16 10:05:01 2011f
+  //
+  Standard_Boolean bFlag;
+  //
+  // U 
+  bFlag=(myNbSamplesU < theNUmin);
+  if (bFlag) {
+    myNbSamplesU=nbsu;
+  }
+  //
+  myUPars = new TColStd_HArray1OfReal(1, myNbSamplesU);
+  //
+  for(j = 0, i = 1; i <= nbsu; ++i) {
+    if (bFlag) {
+       myUPars->SetValue(i,anUPars(i));
+    }
+    else {
+      if(anUFlg(i)) {
+       ++j;
+       myUPars->SetValue(j,anUPars(i));
+      }
+    }
+  }
+  //
+  // V 
+  bFlag=(myNbSamplesV < theNVmin);
+  if (bFlag) {
+    myNbSamplesV=nbsv;
+  }
+  //
+  myVPars = new TColStd_HArray1OfReal(1, myNbSamplesV);
+  //
+  for(j = 0, i = 1; i <= nbsv; ++i) {
+    if (bFlag) {
+       myVPars->SetValue(i,aVPars(i));
+    }
+    else {
+      if(aVFlg(i)) {
+       ++j;
+       myVPars->SetValue(j,aVPars(i));
+      }
+    }
+  }
+  //
+  /*
   myUPars = new TColStd_HArray1OfReal(1, myNbSamplesU);
   myVPars = new TColStd_HArray1OfReal(1, myNbSamplesV);
 
@@ -1231,10 +1318,15 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
       myVPars->SetValue(j,aVPars(i));
     }
   }
+  */
+  //modified by NIZNHY-PKV Mon Dec 26 12:25:35 2011t
 
 }
 
+//=======================================================================
+//function : IsUniformSampling
+//purpose  : 
+//=======================================================================
 Standard_Boolean Adaptor3d_TopolTool::IsUniformSampling() const
 {
   GeomAbs_SurfaceType typS = myS->GetType();