Re: Locator points not working in Manipulate calling RegionPlot, etc.
- To: mathgroup at smc.vnet.net
- Subject: [mg124399] Re: Locator points not working in Manipulate calling RegionPlot, etc.
- From: Chris Young <cy56 at comcast.net>
- Date: Wed, 18 Jan 2012 06:02:17 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jf12ue$5g6$1@smc.vnet.net> <jf3ka7$q7r$1@smc.vnet.net>
Thanks very much to Heike for the suggestion. Doing a parametric plot of the whole triangular region (via two parameters, not just a line plot via one parameter) tells Mathematica where to put the mesh much more quickly than using RegionPlot, especially since it works fine with PlotPoints set to 2, unlike RegionPlot. I wonder if this would translate to a general polygon filling routine, though. http://home.comcast.net/~cy56/ParametricTriHatch.nb http://home.comcast.net/~cy56/ParametricTriHatchPIc1.png http://home.comcast.net/~cy56/ParametricTriHatchPIc2.png http://home.comcast.net/~cy56/ParametricTriHatchPIc3.png http://home.comcast.net/~cy56/ParametricTriHatchPIc4.png \[HorizontalLine]TriHatch3[A_, B_, C_, mesh_, light_, plotPts_, opts___] := Module[ { orient, (* the orientation of the triangle; counter- clockwise is positive *) N, (* the projection, or "normal", from A onto BC *) base (* the extended base, for spacing the hatch lines uniformly *) }, orient = Sign[Det[{B - A, C - A}]]; N = Projection[A - B, C - B] + B; base = Max[Norm /@ {N - B, N - C, C - B}]; ParametricPlot[ u A + (1 - u) (v B + (1 - v) C), {u, 0, 1}, {v, 0, 1}, PlotStyle -> None, Mesh -> Round[mesh * base, 1], MeshStyle -> If[orient > 0, Lighter[Green, light], Lighter[Red, light]], MeshFunctions -> {{x, y} \[Function] Det[{N - A, {x, y} - A}]}, PlotPoints -> plotPts, BoundaryStyle -> None, Evaluate[opts]] ] On 2012-01-17 10:59:19 +0000, Heike Gramberg said: > The problem is that you have two Locator controls which messes things > up. You could do something like this instead. > > Manipulate[ > PolyHatch[pts[[;; 4]], pts[[-1]], mesh, lighter, plotPoints], > {{pts, {{1, 0}, {1, 1}, {2, 1}, {2, 0}, {0, 0}}}, Locator}, > {{mesh, 20}, 1, 30}, > {{lighter, .3}, 0, 1}, > {{plotPoints, 15}, 10, 30, 1}] > > By the way, to make the manipulate less laggy you could use for example= > ParametricPlot to plot the triangles instead of > RegionPlot. For example, this produces the same result but is much more= > responsive: > > TriHatch[P1_, P2_, P3_, mesh_, light_, plotPts_, opts___] := > Module[{orient, qq }, > orient = Sign[Det[{P2 - P1, P3 - P1}]]; > qq = Projection[P1 - P2, P3 - P2] + P2; > > ParametricPlot[ > a P1 + (1 - a) (b P2 + (1 - b) P3), {a, 0, 1}, {b, 0, 1}, > PlotStyle -> None, > Mesh -> Round[mesh Norm[P3 - P2], 1], > MeshStyle -> > If[orient > 0, Lighter[Green, light], Lighter[Red, light]], > MeshFunctions -> {Function[{x, y}, Det[{qq - P1, {x, y} - P1}]]}, > PlotPoints -> plotPts, > BoundaryStyle -> None, Evaluate[opts]] > ] > > Manipulate[ > PolyHatch[pts[[;; 4]], pts[[-1]], mesh, lighter, plotPoints], > {{pts, {{1, 0}, {1, 1}, {2, 1}, {2, 0}, {0, 0}}}, Locator}, > {{mesh, 20}, 1, 30}, > {{lighter, .3}, 0, 1}, > {{plotPoints, 5}, 2, 20, 1}] > > (note that for ParametricPlot the number of PlotPoints can be as small= > as small as 2 whereas for RegionPlot you > need at least 20 points for a reasonable plot).