Bug 13402 fixed: Bounding boxes of xarcs were not correct 23/14523/2
Calixte DENIZET [Tue, 13 May 2014 12:03:14 +0000 (14:03 +0200)]
Change-Id: Ia871d272efda65e109561d75452fe34aaedba3a4

scilab/CHANGES_5.5.X
scilab/modules/graphics/src/c/sciCall.c
scilab/modules/graphics/tests/nonreg_tests/bug_13402.dia.ref [new file with mode: 0644]
scilab/modules/graphics/tests/nonreg_tests/bug_13402.tst [new file with mode: 0644]

index 4200b9e..272ba65 100644 (file)
@@ -37,6 +37,8 @@ Scilab Bug Fixes
 
 * Bug #13401 fixed - Closing Scilab during halt() did not quit the Scilab process.
 
+* Bug #13402 fixed - Bounding boxes of xarcs were not correct.
+
 * Bug #13403 fixed - Regression on axes labeling fixed.
 
 * Bug #13404 fixed - rect property was not taken into account in polarplot.
index 7adcf20..759df01 100644 (file)
@@ -125,14 +125,81 @@ void Objarc(double* angle1    ,
     int iSubwinUID = 0;
     int iObjUID = 0;
     double rect[6];
+    const double two_pi = 2 * M_PI;
 
     iSubwinUID = getCurrentSubWin();
     checkRedrawing();
 
-    rect[0] = *x;
-    rect[1] = *x + *width;
-    rect[2] = *y - *height;
-    rect[3] = *y;
+    if (abs(*angle2) >= two_pi)
+    {
+        rect[0] = *x;
+        rect[1] = *x + *width;
+        rect[2] = *y - *height;
+        rect[3] = *y;
+    }
+    else
+    {
+        double a = *angle1;
+        double s = *angle2;
+        double a1, b1;
+        double b;
+
+        a -= (floor(a / two_pi)) * two_pi;
+        b = a + s;
+
+        if (s >= 0)
+        {
+            b = a + s;
+        }
+        else
+        {
+            b = a;
+            a += s;
+        }
+
+        b1 = b / M_PI;
+        a1 = a / M_PI;
+
+        // is there a 2k\pi in [a,b] ?
+        if (ceil(a1 / 2) <= floor(b1 / 2))
+        {
+            rect[1] = *x + *width;
+        }
+        else
+        {
+            rect[1] = *x + 0.5 * *width * (1 + Max(cos(a), cos(b)));
+        }
+
+        // is there a (2k+1)\pi in [a,b] ?
+        if (ceil((a1 - 1) / 2) <= floor((b1 - 1) / 2))
+        {
+            rect[0] = *x;
+        }
+        else
+        {
+            rect[0] = *x + 0.5 * *width * (1 + Min(cos(a), cos(b)));
+        }
+
+        // is there a (2k+1/2)\pi in [a,b] ?
+        if (ceil((a1 - 0.5) / 2) <= floor((b1 - 0.5) / 2))
+        {
+            rect[3] = *y;
+        }
+        else
+        {
+            rect[3] = *y + 0.5 * *height * (-1 + Max(sin(a), sin(b)));
+        }
+
+        // is there a (2k+3/2)\pi in [a,b] ?
+        if (ceil((a1 - 1.5) / 2) <= floor((b1 - 1.5) / 2))
+        {
+            rect[2] = *y - *height;
+        }
+        else
+        {
+            rect[2] = *y + 0.5 * *height * (-1 + Min(sin(a), sin(b)));
+        }
+    }
 
     updateXYDataBounds(iSubwinUID, rect);
 
@@ -811,9 +878,9 @@ void Objdrawaxis (char     dir    ,
         matData = getStrMatData(tics_labels);
 
         /*
-        * The labels vector size must be computed using the matrix's dimensions.
-        * To be modified when the labels computation is moved to the Model.
-        */
+         * The labels vector size must be computed using the matrix's dimensions.
+         * To be modified when the labels computation is moved to the Model.
+         */
         setGraphicObjectProperty(iObjUID, __GO_TICKS_LABELS__, matData, jni_string_vector, tics_labels->nbCol * tics_labels->nbRow);
 
         deleteMatrix(tics_labels);
@@ -822,10 +889,10 @@ void Objdrawaxis (char     dir    ,
     {
         int i = 0;
         /*
-        * Labels are set using the str argument; the previous code tested whether each element of the
-        * str array was null and set the corresponding Axis' element to NULL, though there was no
-        * apparent reason to do so. This is still checked, but now aborts building the Axis.
-        */
+         * Labels are set using the str argument; the previous code tested whether each element of the
+         * str array was null and set the corresponding Axis' element to NULL, though there was no
+         * apparent reason to do so. This is still checked, but now aborts building the Axis.
+         */
 
         if (nb_tics_labels == -1)
         {
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_13402.dia.ref b/scilab/modules/graphics/tests/nonreg_tests/bug_13402.dia.ref
new file mode 100644 (file)
index 0000000..7955ad8
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- TEST WITH GRAPHIC -->
+// <-- Non-regression test for bug 13402 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13402
+//
+// <-- Short Description -->
+// Bounding boxes of xarcs were not correct   
+xarc(0, 0, 2, 1, 64 * 0, 64 * 360);
+a = gca();
+assert_checkequal(a.data_bounds, [0 -1 ; 2 0]);
+clf();
+xarc(0, 0, 2, 1, 64 * 0, 64 * 90);
+a = gca();
+assert_checkequal(a.data_bounds, [1 -0.5 ; 2 0]);
+clf();
+xarc(0, 0, 2, 1, 64 * 45, 64 * 90);
+a = gca();
+assert_checkalmostequal(a.data_bounds, [1-sqrt(2)/2 sqrt(2)/4-0.5 ; 1+sqrt(2)/2 0]);
+clf();
+xarc(0, 0, 2, 1, 64 * 45, 64 * -90);
+a = gca();
+assert_checkalmostequal(a.data_bounds, [1+sqrt(2)/2 -0.5-sqrt(2)/4 ; 2 sqrt(2)/4-0.5]);
+clf();
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_13402.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_13402.tst
new file mode 100644 (file)
index 0000000..850c05b
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+
+// <-- Non-regression test for bug 13402 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13402
+//
+// <-- Short Description -->
+// Bounding boxes of xarcs were not correct
+
+xarc(0, 0, 2, 1, 64 * 0, 64 * 360);
+a = gca();
+assert_checkequal(a.data_bounds, [0 -1 ; 2 0]);
+clf();
+
+xarc(0, 0, 2, 1, 64 * 0, 64 * 90);
+a = gca();
+assert_checkequal(a.data_bounds, [1 -0.5 ; 2 0]);
+clf();
+
+xarc(0, 0, 2, 1, 64 * 45, 64 * 90);
+a = gca();
+assert_checkalmostequal(a.data_bounds, [1-sqrt(2)/2 sqrt(2)/4-0.5 ; 1+sqrt(2)/2 0]);
+clf();
+
+xarc(0, 0, 2, 1, 64 * 45, 64 * -90);
+a = gca();
+assert_checkalmostequal(a.data_bounds, [1+sqrt(2)/2 -0.5-sqrt(2)/4 ; 2 sqrt(2)/4-0.5]);
+clf();