Fix bug 3404.
Jean-baptiste Silvy [Thu, 4 Sep 2008 16:09:02 +0000 (16:09 +0000)]
scilab/modules/graphics/src/c/Format.c
scilab/modules/graphics/tests/nonreg_tests/bug_3404.dia.ref [new file with mode: 0644]
scilab/modules/graphics/tests/nonreg_tests/bug_3404.tst [new file with mode: 0644]

index 7804938..1078dd2 100644 (file)
 static double spans[18] = {10,12,14,15,16,18,20,25,30,35,40,45,50,60,70,80,90,100};
 static int ticks[18] = {11,7,8,4,9,10,11,6,7,8,9,10,11,7,8,9,10,11};
 static double width[18] = {1,2,2,5,2,2,2,5,5,5,5,5,5,10,10,10,10,10};
+
+/** Maximum of ticks for log mode */
+#define MAX_LOG_TICKS 15
+
 /* end here */
 
 extern double C2F(dlamch)  (char *CMACH, unsigned long int);
@@ -976,7 +980,7 @@ int GradLog( double   _min   ,
 
   *n_grads = 0 ;
 
-  if(size<=7)    {
+  if(size <= MAX_LOG_TICKS)    {
     for(i=0;i<size;i++)
     {
       /*    _grads[i] = exp10(tab[i]); */
@@ -990,19 +994,22 @@ int GradLog( double   _min   ,
     int pas = 0, old_pas= 0,j;
     int val = size, passed = 0;
 
+    /* Try to reduce number of ticks, by finding the greatest divider */
     for(j=val-1;j>1;j--)
       if(val%j == 0){
         old_pas = pas;
         pas=j; 
         passed = 1;
 
-        if((7*pas)<=val){ 
+        if((MAX_LOG_TICKS * pas)<=val){ 
           if(old_pas != 0) {pas = old_pas; }
           break;
         }
       }
 
-      if(passed != 1 || (size/pas)>15 ) pas = size;
+      /* If we haven't found a divider or if the number of ticks will be to large */
+      /* Use only towo ticks */
+      if(passed != 1 || (size/pas) >  MAX_LOG_TICKS ) { pas = size; }
 
       if(pas==size)
       {
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_3404.dia.ref b/scilab/modules/graphics/tests/nonreg_tests/bug_3404.dia.ref
new file mode 100644 (file)
index 0000000..658be30
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008-2008 - INRIA - Jean-Baptiste Silvy
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- TEST WITH GRAPHIC -->
+// <-- Non-regression test for bug 3404 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3404
+//
+// <-- Short Description -->
+// Some problems come when an axis is set in log scale.
+//
+// first check axes
+a = gca();
+a.data_bounds = [1e-9,-20;10,10];
+a.axes_visible = "on";
+a.log_flags = "lnn";
+for i=-9:1
+ expectedLocations(i + 10) = 10^(i);
+end
+// compare the expected locations and the real ones
+for i=1:11,
+  if  abs(  (expectedLocations(i) - a.x_ticks.locations(i)) ..
+           / max(expectedLocations(i), a.x_ticks.locations(i))) > 1000 * %eps then bugmes();quit;end
+end
+// now draw a segs object using this scale
+xarrows([0.0001,0.01],[-15,1],5,1);
+// check that the arrow is centered
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_3404.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_3404.tst
new file mode 100644 (file)
index 0000000..32c2241
--- /dev/null
@@ -0,0 +1,42 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2008-2008 - INRIA - Jean-Baptiste Silvy
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+
+// <-- Non-regression test for bug 3404 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=3404
+//
+// <-- Short Description -->
+// Some problems come when an axis is set in log scale.
+// 
+
+// first check axes
+a = gca();
+a.data_bounds = [1e-9,-20;10,10];
+a.axes_visible = "on";
+a.log_flags = "lnn";
+for i=-9:1
+ expectedLocations(i + 10) = 10^(i);
+end
+
+// compare the expected locations and the real ones
+for i=1:11,
+  if  abs(  (expectedLocations(i) - a.x_ticks.locations(i)) ..
+           / max(expectedLocations(i), a.x_ticks.locations(i))) > 1000 * %eps then pause; end
+end
+
+
+// now draw a segs object using this scale
+xarrows([0.0001,0.01],[-15,1],5,1);
+
+// check that the arrow is centered
+
+
+
+