0023782: Intersection algorithm produces wrong section curves for the attached faces
[occt.git] / src / Adaptor3d / Adaptor3d_TopolTool.cxx
index 46ec787..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>
@@ -959,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;
@@ -1053,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;
@@ -1096,7 +1130,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
        if(!ok) {
          j = k - 1;
          anUFlg(j) = Standard_True;
-         ++myNbSamplesU;
+         //++myNbSamplesU;
          break;
        }
        
@@ -1112,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;
@@ -1132,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;
@@ -1174,7 +1214,7 @@ void Adaptor3d_TopolTool::BSplSamplePnts(const Standard_Real theDefl,
        if(!ok) {
          j = k - 1;
          aVFlg(j) = Standard_True;
-         ++myNbSamplesV;
+         //++myNbSamplesV;
          break;
        }
        
@@ -1190,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;