changeset 7857:09b1a9c88128

added (far from perfect) support for logscale ticks
author Shai Ayal <shaiay@users.sourceforge.net>
date Sun, 09 Mar 2008 20:51:52 +0200
parents cf672485be43
children dfae35ac4fb0
files src/ChangeLog src/graphics.cc src/graphics.h.in
diffstat 3 files changed, 32 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Mar 06 06:40:06 2008 +0200
+++ b/src/ChangeLog	Sun Mar 09 20:51:52 2008 +0200
@@ -1,5 +1,11 @@
 2008-06-04  Shai Ayal  <shaiay@users.sourceforge.net>
 
+	* graphics.h.in (axes::properties::update_xlim,
+	axes::properties::update_ylim, axes::properties::update_zlim):
+	pass is_logscale flag to axes::properties::calc_ticks_and_lims
+	* graphics.cc (axes::properties::calc_ticks_and_lims): Added
+	support for log scale
+
 	* graphics.h.in (axes::properities::fix_limits) : New method.
 	(axes::properties::update_xlim, axes::properties::update_ylim,
 	axes::properties::update_zlim): Use fix_limits.
--- a/src/graphics.cc	Thu Mar 06 06:40:06 2008 +0200
+++ b/src/graphics.cc	Sun Mar 09 20:51:52 2008 +0200
@@ -2670,7 +2670,7 @@
 }
 
 void 
-axes::properties::calc_ticks_and_lims (array_property& lims, array_property& ticks, bool limmode_is_auto)
+axes::properties::calc_ticks_and_lims (array_property& lims, array_property& ticks, bool limmode_is_auto, bool is_logscale)
 {
 
   // FIXME -- add log ticks and lims
@@ -2687,7 +2687,14 @@
       hi = lo;
       lo = tmp;
     }
-  
+
+  if (is_logscale)
+    {
+      // FIXME we should check for negtives here
+      hi = std::log10 (hi);
+      lo = std::log10 (lo);
+    }
+
   double tick_sep = calc_tick_sep (lo , hi);
 
   int i1 = static_cast<int> (std::floor (lo / tick_sep));
@@ -2700,6 +2707,11 @@
       tmp_lims(0) = tick_sep * i1;
       tmp_lims(1) = tick_sep * i2;
 
+      if (is_logscale) 
+	{
+	  tmp_lims(0) = std::pow (10.,tmp_lims(0));
+	  tmp_lims(1) = std::pow (10.,tmp_lims(1));
+	}
       lims = tmp_lims;
     }
   else
@@ -2710,8 +2722,14 @@
     }
       
   Matrix tmp_ticks (1, i2-i1+1);
-  for (int i = 0; i <= i2-i1; i++)
-    tmp_ticks (i) = tick_sep * (i+i1);
+  for (int i = 0; i <= i2-i1; i++) 
+    {
+      tmp_ticks (i) = tick_sep * (i+i1);
+      if (is_logscale)
+	tmp_ticks (i) = std::pow (10., tmp_ticks (i));
+    }
+	
+  
 
   ticks = tmp_ticks;
 }
--- a/src/graphics.h.in	Thu Mar 06 06:40:06 2008 +0200
+++ b/src/graphics.h.in	Sun Mar 09 20:51:52 2008 +0200
@@ -2714,7 +2714,7 @@
     void update_zdir (void) { update_camera (); }
 
     double calc_tick_sep (double minval, double maxval);
-    void calc_ticks_and_lims (array_property& lims, array_property& ticks, bool limmode_is_auto);
+    void calc_ticks_and_lims (array_property& lims, array_property& ticks, bool limmode_is_auto, bool is_logscale);
     void fix_limits (array_property& lims)
     {
       if (lims.get ().is_empty ()) 
@@ -2741,7 +2741,7 @@
     void update_xlim (bool do_clr_zoom = true)
     {
       if (xtickmode.is ("auto"))
-	calc_ticks_and_lims (xlim, xtick, xlimmode.is ("auto"));
+	calc_ticks_and_lims (xlim, xtick, xlimmode.is ("auto"), xscale.is ("log"));
 
       fix_limits (xlim);
 
@@ -2752,7 +2752,7 @@
     void update_ylim (bool do_clr_zoom = true)
     {
       if (ytickmode.is ("auto"))
-	calc_ticks_and_lims (ylim, ytick, ylimmode.is ("auto"));
+	calc_ticks_and_lims (ylim, ytick, ylimmode.is ("auto"), yscale.is ("log"));
 
       fix_limits (ylim);
 
@@ -2763,7 +2763,7 @@
     void update_zlim (void)
     {
       if (ztickmode.is ("auto"))
-	calc_ticks_and_lims (zlim, ztick, zlimmode.is ("auto"));
+	calc_ticks_and_lims (zlim, ztick, zlimmode.is ("auto"), zscale.is ("log"));
 
       fix_limits (zlim);