0025024: BSplCLib::PrepareInsertKnots reports incorrect number of poles
[occt.git] / src / BSplCLib / BSplCLib.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 97053ae..f41a893
@@ -1,23 +1,18 @@
 // Created on: 1991-08-09
 // Created by: JCV
 // Copyright (c) 1991-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
+// Copyright (c) 1999-2014 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.
+// This file is part of Open CASCADE Technology software library.
 //
-// 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.
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
 //
-// 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.
-
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 // Modified RLE 9 Sep 1993
 // pmn : modified 28-01-97  : fixed a mistake in LocateParameter (PRO6973)
@@ -34,7 +29,7 @@
 
 #include <BSplCLib.ixx>
 #include <PLib.hxx>
-#include <PLib_LocalArray.hxx>
+#include <NCollection_LocalArray.hxx>
 #include <Precision.hxx>
 #include <Standard_NotImplemented.hxx>
 
@@ -67,8 +62,6 @@ public:
   Standard_Real myBuffer[27*27];
 };
 
-typedef PLib_LocalArray BSplCLib_LocalArray;
-
 //=======================================================================
 //function : Hunt
 //purpose  : 
@@ -1709,6 +1702,7 @@ Standard_Boolean  BSplCLib::PrepareInsertKnots
       ak++;
   }
   
+  Standard_Integer aLastKnotMult = Mults (Knots.Upper());
   Standard_Real au,oldau = AddKnots(ak),Eps;
   
   while (ak <= AddKnots.Upper()) {
@@ -1748,7 +1742,15 @@ Standard_Boolean  BSplCLib::PrepareInsertKnots
       }
       else if (amult > mult) {
        if (amult > Degree) amult = Degree;
-       sigma += amult - mult;
+        if (k == Knots.Upper () && Periodic)
+        {
+          aLastKnotMult = Max (amult, mult);
+          sigma += 2 * (aLastKnotMult - mult);
+        }
+        else
+        {
+         sigma += amult - mult;
+        }
       }
       /*
       // on periodic curves if this is the last knot
@@ -1786,7 +1788,7 @@ Standard_Boolean  BSplCLib::PrepareInsertKnots
     //instance);
     //respectively AddMults() must meet this requirement if AddKnots() contains
     //knot(s) coincident with first or last
-    NbPoles = sigma - Mults(Knots.Upper());
+    NbPoles = sigma - aLastKnotMult;
   }
   else {
     NbPoles = sigma - Degree - 1;
@@ -1975,7 +1977,8 @@ void BSplCLib::InsertKnots
       if (Periodic) {
        // on periodic curve the first and last knot are delayed to the end
        if (curk == Knots.Lower() || (curk == Knots.Upper())) {
-         firstmult += depth;
+          if (firstmult == 0) // do that only once
+            firstmult += depth;
          depth = 0;
        }
       }
@@ -3117,7 +3120,6 @@ void  BSplCLib::Eval
   NewRequest,
   ExtrapolatingFlag[2],
   ErrorCode,
-  ReturnCode,
   Order = Degree + 1,
   FirstNonZeroBsplineIndex,
   LocalRequest = DerivativeRequest ;
@@ -3187,7 +3189,6 @@ void  BSplCLib::Eval
                               FirstNonZeroBsplineIndex,
                               BsplineBasis) ;
   if (ErrorCode != 0) {
-    ReturnCode = 1 ;
     goto FINISH ;
   }
   if (ExtrapolatingFlag[0] == 0 && ExtrapolatingFlag[1] == 0) {
@@ -3226,7 +3227,7 @@ void  BSplCLib::Eval
     if (NewRequest > Degree) {
       NewRequest = Degree ;
     }
-    BSplCLib_LocalArray LocalRealArray((LocalRequest + 1)*ArrayDimension);
+    NCollection_LocalArray<Standard_Real> LocalRealArray((LocalRequest + 1)*ArrayDimension);
     Index = 0 ;
     Inverse = 1.0e0 ;
 
@@ -3318,7 +3319,6 @@ void  BSplCLib::Eval
   NewRequest,
   ExtrapolatingFlag[2],
   ErrorCode,
-  ReturnCode,
   Order = Degree + 1,
   FirstNonZeroBsplineIndex,
   LocalRequest = DerivativeRequest ;
@@ -3388,7 +3388,6 @@ void  BSplCLib::Eval
                               FirstNonZeroBsplineIndex,
                               BsplineBasis);
   if (ErrorCode != 0) {
-    ReturnCode = 1 ;
     goto FINISH ;
   }
   if (ExtrapolatingFlag[0] == 0 && ExtrapolatingFlag[1] == 0) {
@@ -3421,7 +3420,7 @@ void  BSplCLib::Eval
     if (NewRequest > Degree) {
       NewRequest = Degree ;
     }
-    BSplCLib_LocalArray LocalRealArray((LocalRequest + 1)*ArrayDimension);
+    NCollection_LocalArray<Standard_Real> LocalRealArray((LocalRequest + 1)*ArrayDimension);
 
     Index = 0 ;
     Inverse = 1.0e0 ;