Re: ParametricPlot with jumps
- To: mathgroup at smc.vnet.net
- Subject: [mg16230] Re: ParametricPlot with jumps
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Fri, 5 Mar 1999 00:40:56 -0500
- References: <7b89al$4la@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
David Epstein wrote in message <7b89al$4la at smc.vnet.net>...
>I want to do something similar to the following. I have a curve on a
>cylinder. I want to cut the cylinder
>along one of its generators and open it out to a flat strip (the inverse
>process to how cans are made).
>
>If I now use ParametricPlot to see what the curves look like on the flat
>strip, there are jumps where the
>curves cross the generator which has turned into a pair of edges of the
>flat strip. The way
>ParametricPlot treats this situation is to construct an artificial
>interpolation between the two points
>where the curve meets corresponding opposite edges of the strip. What I
>want it to do is not to make
>this interpolation.
>
>One way to achieve this is to solve for when the curve cuts the edge of
>the figure and then do separate plots between each of these intersection
>points. Is this the easiest way, or is there some way of telling
>ParametricPlot not to interpolate over huge distances?
>
>David Epstein
>
>
David,
The following may help
Avoiding Jumps in ParametricPlot
ParametricPlotPlus::usage =
"ParametricPlotPlus is an extension of ParametricPlot by an extra
option, \
MaxSlope. With MaxSlope->ms (default 5000) the line is broken at segments \
where the absolute slope in either coordinate is greater than ms";
Options[ParametricPlotPlus] =
Union[Options[ParametricPlot], {MaxSlope -> 5000}];
<< Utilities`FilterOptions`
ParametricPlotPlus[{x_, y_},{t_, r__},(opts___)?OptionQ]:=
Block[
{$DisplayFunction,p,ms,inopts,ppopts,gr,pars,pts,data,splt},
$DisplayFunction = Identity;
ms = MaxSlope/.{opts}/.Options[ParametricPlotPlus];
inopts = Sequence @@ Flatten[{opts}];
ppopts = FilterOptions[ParametricPlot, inopts];
p = {};
gr =
ParametricPlot[{p={p,t};x,y},{t,r}, Evaluate[ppopts]];
pars = Drop[Flatten[p],2];
pts = Cases[gr, Line[l_]:>l,Infinity][[1]];
data = Transpose[{pts,pars}];
splt =
Map[First,
Split[data,Max[Abs[Divide@@(#1-#2)]]<=ms &],
{2}
];
gr /. Line[lst_] :> Line /@ splt
]//Show
Examples
ParametricPlotPlus[{x, Tan[x]}, {x, 0, 2Pi}]
ParametricPlotPlus[(1 + Tan[3x]){Cos[x], Sin[x]}, {x, 0, 2Pi},
PlotRange -> {{-3, 3}, {-3, 3}},
AspectRatio -> Automatic,
Frame -> True, Axes -> False]
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565