Re: Strange autoscaling with rgbimage and inverted yranges

Dima Kogan <[email protected]>
Newsgroups gmane.comp.graphics.gnuplot.devel
Message-ID <[email protected]>
Hi. I do observe your sequence work at you state:

> 1) start gnuplot
> 2) load script
> 3) zoom
> 4) 'u'
>    plot is now incorrectly scaled
> 5) 'n'
>    shows zoom state from (3)
> 6) 'p'
>    correctly unzooms to original plot

Step 6 may be 'u' or 'p'. The reason things don't look the same after
steps 4 and 6 is the value of

  { axis_array[FIRST_Y_AXIS].min, axis_array[FIRST_Y_AXIS].max }

at the start of the refresh_bounds() call. This function assumes
min<max. And if we're reversing some axis, this is done at the very end
of refresh_bounds() with the axis_check_range() calls.

In step 3, refresh_bounds() sees {min,max} = {4000,-500}
In step 6, refresh_bounds() sees {min,max} = {1850,1400}

This is dependent on the actual zoom bounds. Both of these have the
unexpected min>max, obviously, but in step 6 we get lucky, and it ends
up doing the right thing anyway, in this case.

Specifically the diverging behavior comes from

  refresh_bounds()          calls
  process_image()           calls
  STORE_AND_UPDATE_RANGE()  calls
  store_and_update_range()

The logic in store_and_update_range() is effectively:

    if ( curval > axis->max && curval >= axis->min )
      axis->max = curval;

Which is correct only if axis->min < axis->max

I'm not entirely sure what the values of axis->min, axis->max should be
at the start of refresh_bounds(), but reordering them makes this thing
work correctly. Patch (usable for this specific test case only):

  diff --git a/src/plot2d.c b/src/plot2d.c
  index b2877eb89..7e4e57259 100644
  --- a/src/plot2d.c
  +++ b/src/plot2d.c
  @@ -299,6 +299,17 @@ refresh_bounds(struct curve_points *first_plot, int nplots)
       struct curve_points *this_plot = first_plot;
       int iplot;		/* plot index */

  +
  +    if(axis_array[FIRST_Y_AXIS].min > axis_array[FIRST_Y_AXIS].max)
  +    {
  +        double t = axis_array[FIRST_Y_AXIS].min;
  +        axis_array[FIRST_Y_AXIS].min = axis_array[FIRST_Y_AXIS].max;
  +        axis_array[FIRST_Y_AXIS].max = t;
  +    }
  +
  +
  +
  +
       for (iplot = 0;  iplot < nplots; iplot++, this_plot = this_plot->next) {
          int i;		/* point index */
          struct axis *x_axis = &axis_array[this_plot->x_axis];

Applying this patch makes the test case work, even before any of your
patches from yesterday. Clearly, this should be more general, but I'm
hazy on the details, so it'd be better if you finish this, probably.

Thanks!


_______________________________________________
gnuplot-beta mailing list
[email protected]
Membership management via: https://lists.sourceforge.net/lists/listinfo/gnuplot-beta
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.