0027252: Implicit-implicit intersection (Cylinder-Plane) loses intersection curve
[occt.git] / src / math / math_BrentMinimum.cxx
index b2c0f9a..df60527 100644 (file)
 #include <math_Function.hxx>
 #include <StdFail_NotDone.hxx>
 
-#define CGOLD         0.3819660
-#ifdef MAX
-#undef MAX
-#endif
-#define MAX(a,b)      ((a) > (b) ? (a) : (b))
-#define SIGN(a,b)     ((b) > 0.0 ? fabs(a) : -fabs(a))
-#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d)
+static const Standard_Real CGOLD = 0.3819660; //0.5*(3 - sqrt(5));
+
+
+//=======================================================================
+//function : SHFT
+//purpose  : Shifts arguments
+//=======================================================================
+inline void SHFT(Standard_Real &theA, Standard_Real &theB,
+                 Standard_Real &theC, Standard_Real &theD)
+{
+  theA = theB;
+  theB = theC;
+  theC = theD;
+}
 
 //=======================================================================
 //function : math_BrentMinimum
@@ -92,66 +99,66 @@ void math_BrentMinimum::Perform(math_Function& F,
   Standard_Real tol1, tol2, u, v, w, xm;
   Standard_Real e = 0.0;
   Standard_Real d = RealLast();
-  
+
   a = ((ax < cx) ? ax : cx);
   b = ((ax > cx) ? ax : cx);
   x = w = v = bx;
   if (!myF) {
     OK = F.Value(x, fx);
-    if(!OK) return;
+    if (!OK) return;
   }
   fw = fv = fx;
-  for(iter = 1; iter <= Itermax; iter++) {
+  for (iter = 1; iter <= Itermax; iter++) {
     xm = 0.5 * (a + b);
     tol1 = XTol * fabs(x) + EPSZ;
     tol2 = 2.0 * tol1;
-    if(IsSolutionReached(F)) {
+    if (IsSolutionReached(F)) {
       Done = Standard_True;
       return;
     }
-    if(fabs(e) > tol1) {
+    if (fabs(e) > tol1) {
       r = (x - w) * (fx - fv);
       q = (x - v) * (fx - fw);
       p = (x - v) * q - (x - w) * r;
       q = 2.0 * (q - r);
-      if(q > 0.0) p = -p;
+      if (q > 0.0) p = -p;
       q = fabs(q);
       etemp = e;
       e = d;
-      if(fabs(p) >= fabs(0.5 * q * etemp) 
-        || p <= q * ( a - x) || p >= q * (b - x)) {
-       e = (x >= xm ? a - x : b - x);
-       d = CGOLD * e;
+      if (fabs(p) >= fabs(0.5 * q * etemp)
+        || p <= q * (a - x) || p >= q * (b - x)) {
+        e = (x >= xm ? a - x : b - x);
+        d = CGOLD * e;
       }
       else {
-       d = p / q;
-       u = x + d;
-       if(u - a < tol2 || b - u < tol2) d = SIGN(tol1, xm - x);
+        d = p / q;
+        u = x + d;
+        if (u - a < tol2 || b - u < tol2) d = Sign(tol1, xm - x);
       }
     }
     else {
       e = (x >= xm ? a - x : b - x);
       d = CGOLD * e;
     }
-    u = (fabs(d) >= tol1 ? x + d : x + SIGN(tol1, d));
+    u = (fabs(d) >= tol1 ? x + d : x + Sign(tol1, d));
     OK = F.Value(u, fu);
-    if(!OK) return;
-    if(fu <= fx) {
-      if(u >= x) a = x; else b = x;
+    if (!OK) return;
+    if (fu <= fx) {
+      if (u >= x) a = x; else b = x;
       SHFT(v, w, x, u);
       SHFT(fv, fw, fx, fu);
     }
     else {
-      if(u < x) a = u; else b = u;
-      if(fu <= fw || w == x) {
-       v = w;
-       w = u;
-       fv = fw;
-       fw = fu;
+      if (u < x) a = u; else b = u;
+      if (fu <= fw || w == x) {
+        v = w;
+        w = u;
+        fv = fw;
+        fw = fu;
       }
-      else if(fu <= fv || v == x || v == w) {
-       v = u;
-       fv = fu;
+      else if (fu <= fv || v == x || v == w) {
+        v = u;
+        fv = fu;
       }
     }
   }