Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Inconsistent behavior of RegionFunction in ContourPlot and ListContourPlot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127757] Re: Inconsistent behavior of RegionFunction in ContourPlot and ListContourPlot
  • From: "djmpark" <djmpark at comcast.net>
  • Date: Sat, 18 Aug 2012 20:37:34 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net
  • References: <12810930.143850.1345276053586.JavaMail.root@m06>

It's a disappointment! I thought I would demonstrate John Browne's Grassmann
algebra by using its routines to generate a RegionFunction. 

The idea is:
1) There is a simple Grassmann algebra expression that determines whether a
test point is on the same side of a line as a reference point.
2) You can then test if a point is inside a triangle by applying the test to
each side with the opposite vertex as the reference point.
3) You can then triangulate any polygon, convex or not, and test if a point
is in any of the triangles.

For your polygon I generated, by this method, the following RegionFunction:

inPolygon = 
Function[{x,   y},
   (NonNegative[3. - 0.75 x - 1.25 y] && 
    NonNegative[1.25 x - 1.25 y] && 
    NonNegative[-2. - 0.5 x + 2.5 y]) || (NonNegative[-3. + 2. x] && 
    NonNegative[-4.8 + 1.2 x + 2. y] && 
    NonNegative[8.8 - 3.2 x - 2. y]) || (NonNegative[2.5 - 1.25 y] && 
    NonNegative[-1.83333 + 0.666667 x + 0.416667 y] && 
    NonNegative[0.333333 - 0.666667 x + 0.833333 y]) || (NonNegative[
     3. - 1. x] && NonNegative[-0.571429 + 1.14286 x - 1.42857 y] && 
    NonNegative[-1.42857 - 0.142857 x + 1.42857 y])] 

This all works very well and I can even make a dynamic diagram with a spoken
voice that says "Inside" or "Outside" whenever a point locator crosses the
boundary.

But the sad fact is that ListContourPlot has a bug and does not implement
RegionFunction properly - neither your function nor my function. It does
appear to work properly in other plot types: ContourPlot or RegionPlot.

A possible work around is to use RegionPlot with ! inPolygon to mask the
undesired region.

Show[
 {ListContourPlot[pts],
  RegionPlot[! inPolygon[x, y], {x, 0.4, 3.6}, {y, 0.4, 2.6},
   MaxRecursion -> 4,
   PlotStyle -> White]},
 AspectRatio -> Automatic,
 PlotRange -> {{0.5, 3.5}, {0.5, 2.5}},
 Frame -> True,
 BaseStyle -> {FontSize -> 12},
 ImageSize -> 400] 


David Park
djmpark at comcast.net 
http://home.comcast.net/~djmpark/index.html 



From: Alexey Popkov [mailto:lehin.p at gmail.com] 

Hello folks,

When trying to plot a non-covex set of datapoints ListContourPlot produces a
convex graph effectively extrapolating values outside of the actual range of
the original dataset:

pts = {{1, 1, 1}, {2, 1.2, .8}, {3, 1.3, .7}, {3, 2, 1}, {1.5, 2,
    1}, {1.5, 1.5, 1}};
epilog = {FaceForm[None], EdgeForm[Red], Polygon[Most /@ pts]};
ListContourPlot[pts, Epilog -> epilog]

(the red polygon shows the actual range of the data).

I need to remove the extrapolated parts of the graph and define
RegionFunction:

leftBorder =
  Interpolation[pts[[{5, 6, 1}, {2, 1}]], InterpolationOrder -> 1];
bottomBorder =
  Interpolation[pts[[{1, 2, 3}, {1, 2}]], InterpolationOrder -> 1];
ListContourPlot[pts, Epilog -> epilog,  RegionFunction ->
  Function[{x, y, z},
   x >= leftBorder[y] && y >= bottomBorder[x]]]

But as you see, nothing happens! The drawn region of the plot still contains
areas outside of the area allowed by the RegionFunction.

There is no such problem with ContourPlot:

ContourPlot[Sin[x y], {x, 1, 3}, {y, 1, 2}, Epilog -> epilog,
RegionFunction ->
  Function[{x, y, z}, x >= leftBorder[y] && y >= bottomBorder[x]]]

Is it a bug in ListContourPlot? How to achieve consistent behavior of
RegionFunction in both ContourPlot and ListContourPlot?

Thanks in advance! 






  • Prev by Date: Re: NIntegrate and replacements
  • Next by Date: Re: Drawing a Line From One Plot to Another
  • Previous by thread: Inconsistent behavior of RegionFunction in ContourPlot and ListContourPlot
  • Next by thread: TimeValue around NDSolve