# HG changeset patch # User Shai Ayal # Date 1205088712 -7200 # Node ID 09b1a9c8812850cd4ba12b1b52b7698697ed16b4 # Parent cf672485be432ab544325067200a64551980db6b added (far from perfect) support for logscale ticks diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,11 @@ 2008-06-04 Shai Ayal + * 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. diff --git a/src/graphics.cc b/src/graphics.cc --- a/src/graphics.cc +++ b/src/graphics.cc @@ -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 (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; } diff --git a/src/graphics.h.in b/src/graphics.h.in --- a/src/graphics.h.in +++ b/src/graphics.h.in @@ -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);