0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / Hermit / Hermit.cxx
old mode 100755 (executable)
new mode 100644 (file)
index c4881e2..19ccc39
@@ -1,49 +1,42 @@
 // Created on: 1997-01-15
 // Created by: Stagiaire Francois DUMONT
 // Copyright (c) 1997-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.
 
 
-
-#include <Hermit.ixx>
-#include <Geom_BSplineCurve.hxx>
-#include <Geom2d_BSplineCurve.hxx>
 #include <BSplCLib.hxx>
-#include <TColStd_Array1OfReal.hxx>
-#include <TColStd_HArray1OfReal.hxx>
-#include <TColStd_Array1OfInteger.hxx>
-#include <TColStd_HArray1OfInteger.hxx>
+#include <Geom2d_BSplineCurve.hxx>
+#include <Geom_BSplineCurve.hxx>
+#include <gp_Pnt2d.hxx>
+#include <Hermit.hxx>
 #include <PLib.hxx>
+#include <Precision.hxx>
 #include <Standard_Boolean.hxx>
-#include <gp_Pnt2d.hxx>
-#include <TColgp_Array1OfPnt2d.hxx>
 #include <Standard_DimensionError.hxx>
 #include <Standard_Real.hxx>
-#include <TCollection_CompareOfReal.hxx>
-#include <SortTools_QuickSortOfReal.hxx>
-#include <Precision.hxx>
+#include <TColgp_Array1OfPnt2d.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <TColStd_Array1OfReal.hxx>
+#include <TColStd_HArray1OfInteger.hxx>
+#include <TColStd_HArray1OfReal.hxx>
 
+#include <algorithm>
 //=======================================================================
 //function : HermiteCoeff
 //purpose  : calculate  the Hermite coefficients of degree 3 from BS and
 //          store them in TAB(4 coefficients)
 //=======================================================================
-
 static void HermiteCoeff(const Handle(Geom_BSplineCurve)& BS,
                         TColStd_Array1OfReal&            TAB)
      
@@ -181,8 +174,6 @@ static void PolyTest(const TColStd_Array1OfReal&         Herm,
   Standard_Integer               cas=0,mark=0,dercas=0,  //loop marks
                                  min,max;                //Pole min and max indices
   Standard_Real                  Us1,Us2,a;              //bounderies value of the knots to be inserted
-//  gp_Pnt2d                       P ;
-  TCollection_CompareOfReal      Comp;
   
   U4=0.0;U5=1.0;                                         //default value
   if (Ux!=1.0){
@@ -221,7 +212,9 @@ static void PolyTest(const TColStd_Array1OfReal&         Herm,
 
   TColStd_Array1OfReal knots(1,Knots->Length());
   knots=Knots->ChangeArray1();
-  SortTools_QuickSortOfReal::Sort(knots,Comp);        //sort of the array of knots
+
+  //sort of the array of knots
+  std::sort (knots.begin(), knots.end());
 
   Polesinit(0).SetCoord(0.0,Herm(0));                 //poles of the Hermite polynome in the BSpline form
   Polesinit(1).SetCoord(0.0,Herm(0)+Herm(1)/3.0);
@@ -235,62 +228,77 @@ static void PolyTest(const TColStd_Array1OfReal&         Herm,
     Standard_Real  Polemax=Polesinit(max).Y();
     if (((Polemax)>=((1/TolPoles)*Polemin))||((Polemin==0.0)&&(Polemax>=(1/TolPoles)))){
       if (Polesinit(0).Y()>=(1/TolPoles)*Polesinit(3).Y()||Polesinit(0).Y()<=TolPoles*Polesinit(3).Y())
-       Standard_DimensionError::Raise("Hermit Impossible Tolerance");       
-      if ((max==0)||(max==3))                                                
-       for (i=0;i<=3;i++)
-         Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
-      if ((max==1)||(max==2))
-       if ((min==0)||(min==3))                                             
-         for (i=0;i<=3;i++)
-           Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-(1/TolPoles)*Polemin));
-       else{                                                                  
-         if ((TolPoles*Polemax<Polesinit(0).Y())&&(TolPoles*Polemax<Polesinit(3).Y())){
-           for (i=0;i<=3;i++)                                             
-             Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
-           mark=1;
-         }
-         if ((1/TolPoles*Polemin>Polesinit(0).Y())&&(1/TolPoles*Polemin>Polesinit(3).Y())&&(mark==0)){
-           for (i=0;i<=3;i++)                                             
-             Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-1/TolPoles*Polemin));
-           mark=1;
-         }
-         if (mark==0){
-           Standard_Real Pole0,Pole3;
-           Pole0=Polesinit(0).Y();
-           Pole3=Polesinit(3).Y();
-           if (Pole0<3){                         
-             a=Log10(Pole3/Pole0);                      
-             if (boucle==2)                      
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
-             if (boucle==1){
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
-               dercas=1;
-             }
-           }
-           if (Pole0>Pole3){                         
-             a=Log10(Pole0/Pole3);                           
-             if (boucle==2)                      
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
-             if (boucle==1){
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
-               dercas=1;
-             }
-           }
-         }
-       }
+        Standard_DimensionError::Raise("Hermit Impossible Tolerance");       
+      if ((max==0)||(max==3))
+      {
+        for (i=0;i<=3;i++)
+          Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
+      }
+      else if ((max==1)||(max==2)) {
+        if ((min==0)||(min==3))
+        {
+          for (i=0;i<=3;i++)
+            Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-(1/TolPoles)*Polemin));
+        }
+        else{                                                                  
+          if ((TolPoles*Polemax<Polesinit(0).Y())&&(TolPoles*Polemax<Polesinit(3).Y())){
+            for (i=0;i<=3;i++)                                             
+              Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
+            mark=1;
+          }
+          if ((1/TolPoles*Polemin>Polesinit(0).Y())&&(1/TolPoles*Polemin>Polesinit(3).Y())&&(mark==0)){
+            for (i=0;i<=3;i++)                                             
+              Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-1/TolPoles*Polemin));
+            mark=1;
+          }
+          if (mark==0){
+            Standard_Real Pole0,Pole3;
+            Pole0=Polesinit(0).Y();
+            Pole3=Polesinit(3).Y();
+            if (Pole0<3){                         
+              a=Log10(Pole3/Pole0);
+              if (boucle==2)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
+              }
+              if (boucle==1)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
+                dercas=1;
+              }
+            }
+            if (Pole0>Pole3)
+            {
+              a=Log10(Pole0/Pole3);                           
+              if (boucle==2)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0)))));
+              }
+              if (boucle==1)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
+                dercas=1;
+              }
+            }
+          }
+        }
+      }
     }
-  }                          //end of the loop
+  } // end of the loop
   
-  if (!SignDenom(Polesinit))                       //invertion of the polynome sign
+  if (!SignDenom(Polesinit)) //invertion of the polynome sign
+  {
     for (index=0;index<=3;index++)
       Polesinit(index).SetCoord(0.0,-Polesinit(index).Y());
-  
-                                //loop of positivity
-  if ((Polesinit(1).Y()<0.0)&&(Polesinit(2).Y()>=0.0)){              
+  }
+
+  // loop of positivity
+  if ((Polesinit(1).Y()<0.0)&&(Polesinit(2).Y()>=0.0))
+  {
     Us1=Polesinit(0).Y()/(Polesinit(0).Y()-Polesinit(1).Y());
     if (boucle==2)
       Us1=Us1*knots(2);
@@ -304,7 +312,8 @@ static void PolyTest(const TColStd_Array1OfReal&         Herm,
       U4=knots(I1);
   }
   
-  if ((Polesinit(1).Y()>=0.0)&&(Polesinit(2).Y()<0.0)){
+  if ((Polesinit(1).Y()>=0.0)&&(Polesinit(2).Y()<0.0))
+  {
     Us2=Polesinit(2).Y()/(Polesinit(2).Y()-Polesinit(3).Y());
     if (boucle==2)
       Us2=knots(knots.Length()-1)+Us2*(1-knots(knots.Length()-1));
@@ -386,8 +395,6 @@ static void PolyTest(const TColStd_Array1OfReal&        Herm,
   Standard_Integer               cas=0,mark=0,dercas=0,  //loop marks
                                  min,max;                //Pole min and max indices
   Standard_Real                  Us1,Us2,a;              //bounderies value of the knots to be inserted
-//  gp_Pnt2d                       P ;
-  TCollection_CompareOfReal      Comp;
   
   U4=0.0;U5=1.0;                                         //default value
   if (Ux!=1.0){
@@ -397,6 +404,7 @@ static void PolyTest(const TColStd_Array1OfReal&        Herm,
   }
 
   if (I1==I2)                                            //definition and filling of the 
+  {
     if((I3==I4)||(I3==0)){                               //array of knots
       Knots=new TColStd_HArray1OfReal(1,BS->NbKnots());
       for (i=1;i<=BS->NbKnots();i++)
@@ -408,7 +416,9 @@ static void PolyTest(const TColStd_Array1OfReal&        Herm,
        Knots->SetValue(i,BS->Knot(i));
       Knots->SetValue(BS->NbKnots()+1,Uy);
     }
-  else{
+  }
+  else
+  {
     if((I3==I4)||(I3==0)){
       Knots=new TColStd_HArray1OfReal(1,BS->NbKnots()+1);
       for (i=1;i<=BS->NbKnots();i++)
@@ -426,76 +436,102 @@ static void PolyTest(const TColStd_Array1OfReal&        Herm,
 
   TColStd_Array1OfReal knots(1,Knots->Length());
   knots=Knots->ChangeArray1();
-  SortTools_QuickSortOfReal::Sort(knots,Comp);     //sort of the array of knots
+
+  //sort of the array of knots
+  std::sort (knots.begin(), knots.end());
 
   Polesinit(0).SetCoord(0.0,Herm(0));              //poles of the Hermite polynome in the BSpline form
   Polesinit(1).SetCoord(0.0,Herm(0)+Herm(1)/3.0);
   Polesinit(2).SetCoord(0.0,Herm(3)-Herm(2)/3.0);
   Polesinit(3).SetCoord(0.0,Herm(3));
 
-                              //loop to check the tolerances on poles
-  if (TolPoles!=0.0){
+  // loop to check the tolerances on poles
+  if (TolPoles!=0.0)
+  {
     Polemax(Polesinit,min,max);
     Standard_Real  Polemin=Polesinit(min).Y();
     Standard_Real  Polemax=Polesinit(max).Y();
-    if (((Polemax)>=((1/TolPoles)*Polemin))||((Polemin==0.0)&&(Polemax>=(1/TolPoles)))){
+    if (((Polemax)>=((1/TolPoles)*Polemin))||((Polemin==0.0)&&(Polemax>=(1/TolPoles))))
+    {
       if (Polesinit(0).Y()>=(1/TolPoles)*Polesinit(3).Y()||Polesinit(0).Y()<=TolPoles*Polesinit(3).Y())
-       Standard_DimensionError::Raise("Hermit Impossible Tolerance");       
-      if ((max==0)||(max==3))                                                
-       for (i=0;i<=3;i++)
-         Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
-      if ((max==1)||(max==2))
-       if ((min==0)||(min==3))                                             
-         for (i=0;i<=3;i++)
-           Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-(1/TolPoles)*Polemin));
-       else{                                                                  
-         if ((TolPoles*Polemax<Polesinit(0).Y())&&(TolPoles*Polemax<Polesinit(3).Y())){
-           for (i=0;i<=3;i++)                                             
-             Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
-           mark=1;
-         }
-         if ((1/TolPoles*Polemin>Polesinit(0).Y())&&(1/TolPoles*Polemin>Polesinit(3).Y())&&(mark==0)){
-           for (i=0;i<=3;i++)                                             
-             Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-1/TolPoles*Polemin));
-           mark=1;
-         }
-         if (mark==0){
-           Standard_Real Pole0,Pole3;
-           Pole0=Polesinit(0).Y();
-           Pole3=Polesinit(3).Y();
-           if (Pole0<3){                         
-             a=Log10(Pole3/Pole0);                      
-             if (boucle==2)                      
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
-             if (boucle==1){
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
-               dercas=1;
-             }
-           }
-           if (Pole0>Pole3){                         
-             a=Log10(Pole0/Pole3);                           
-             if (boucle==2)                      
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
-             if (boucle==1){
-               for (i=0;i<=3;i++)                                                    
-                 Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
-               dercas=1;
-             }
-           }
-         }
-       }
+        Standard_DimensionError::Raise("Hermit Impossible Tolerance");       
+      if ((max==0)||(max==3))
+      {
+        for (i=0;i<=3;i++)
+          Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
+      }
+      else if ((max==1)||(max==2))
+      {
+        if ((min==0)||(min==3))
+        {
+          for (i=0;i<=3;i++)
+            Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-(1/TolPoles)*Polemin));
+        }
+        else
+        {
+          if ((TolPoles*Polemax<Polesinit(0).Y())&&(TolPoles*Polemax<Polesinit(3).Y()))
+          {
+            for (i=0;i<=3;i++)                                             
+              Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-TolPoles*Polemax));
+            mark=1;
+          }
+
+          if ((1/TolPoles*Polemin>Polesinit(0).Y())&&(1/TolPoles*Polemin>Polesinit(3).Y())&&(mark==0))
+          {
+            for (i=0;i<=3;i++)                                             
+              Polesinit(i).SetCoord(0.0,(Polesinit(i).Y()-1/TolPoles*Polemin));
+            mark=1;
+          }
+          if (mark==0)
+          {
+            Standard_Real Pole0,Pole3;
+            Pole0=Polesinit(0).Y();
+            Pole3=Polesinit(3).Y();
+            if (Pole0<3)
+            {
+              a=Log10(Pole3/Pole0);
+              if (boucle==2)
+              {
+                for (i=0;i<=3;i++)
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0)))));
+              }
+              if (boucle==1)
+              {
+                for (i=0;i<=3;i++)
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
+                dercas=1;
+              }
+            }
+            if (Pole0>Pole3)
+            {
+              a=Log10(Pole0/Pole3);                           
+              if (boucle==2)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole0*(Pow(10.0,(-0.5*Log10(TolPoles)-a/2.0))))); 
+              }
+              else if (boucle==1)
+              {
+                for (i=0;i<=3;i++)                                                    
+                  Polesinit(i).SetCoord(0.0, Polesinit(i).Y()-(Pole3*(Pow(10.0,(a/2.0+0.5*Log10(TolPoles)))))); 
+                dercas=1;
+              }
+            }
+          }
+        }
+      }
     }
-  }                          //end of the loop
+  } // end of the loop
   
-  if (!SignDenom(Polesinit))                       //invertion of the polynome sign
+  if (!SignDenom(Polesinit)) // invertion of the polynome sign
+  {
     for (index=0;index<=3;index++)
       Polesinit(index).SetCoord(0.0,-Polesinit(index).Y());
-  
-                                //boucle de positivite
-  if ((Polesinit(1).Y()<0.0)&&(Polesinit(2).Y()>=0.0)){
+  }
+
+  // boucle de positivite
+  if ((Polesinit(1).Y()<0.0)&&(Polesinit(2).Y()>=0.0))
+  {
     Us1=Polesinit(0).Y()/(Polesinit(0).Y()-Polesinit(1).Y());
     if (boucle==2)
       Us1=Us1*knots(2);
@@ -509,7 +545,8 @@ static void PolyTest(const TColStd_Array1OfReal&        Herm,
       U4=knots(I1);
   }
   
-  if ((Polesinit(1).Y()>=0.0)&&(Polesinit(2).Y()<0.0)){
+  if ((Polesinit(1).Y()>=0.0)&&(Polesinit(2).Y()<0.0))
+  {
     Us2=Polesinit(2).Y()/(Polesinit(2).Y()-Polesinit(3).Y());
     if (boucle==2)
       Us2=knots(knots.Length()-1)+Us2*(1-knots(knots.Length()-1));