Question: plotting region between two functions

December 12 2011 acer 11966

Suppose that I wanted to produce a 2D plot which was coloured in the region between two functions.

I mean not just between two curves, but between two functions. I would like to make the curves appear as smooth as Maple knows how, but without getting any jaggedness due to using a high grid in an implicitpot.

Consider this example. These two curves are displayed as being quite smooth (using adaptive plotting or whatever `plot` knows to use). How best can the regions between these two curves be filled, without having to recourse perhaps to a rough implicit plot?

plot([x^2-1, -x-1], x=-1.5..1.5, y=-1.5..1.5, color=black);

A simple trick with a product provides a defined implicit region that `implicitplot` can handle. But there can be small gaps, or irregularities, because the formulas for the curves are being solved in a complicated way and no longer being used as mere functions.

plots:-implicitplot( (y - (x^2-1))*(y - (-x-1)),
                     x=-1.5..1.5, y=-1.5..1.5,
                     filledregions=true, gridrefine=4,
                     axes=boxed, labels=["x","y"],
                     view=[-1.5..1.5,-1.5..1.5] );

Another technique is to overlay two simpler implicit plots, colouring and layering them carefully so as to give the impression that only the inner regions had been coloured. The problem here is that the intersections all have to be computed and the problem split up piecemeal (which I did not do) so that the layered colouring is adjusted to whichever curve lies on top. Without that care, then something like this happens, with odd subregions appearing uncoloured.

   plots:-implicitplot( x^2-1 >= y, x=-1.5..1.5, y=-1.5..1.5,
                        filledregions=true, gridrefine=4,
                        coloring=["white","white"] ),
   plots:-implicitplot( -x-1 >= y, x=-1.5..1.5, y=-1.5..1.5,
                        filledregions=true, gridrefine=2,
                        coloring=[COLOUR(RGB,.8,.8,.9),"white"] ),
               axes=boxed, labels=["x","y"], view=[-1.5..1.5,-1.5..1.5]);

Did I miss something obvious? Is there some other calling sequence or command that makes this much easier (and smoother, by default)?


Please Wait...