discontinuous 3D plot and error messages
- To: mathgroup at smc.vnet.net
- Subject: [mg25050] discontinuous 3D plot and error messages
- From: PNichols at cornell-iowa.edu
- Date: Sun, 3 Sep 2000 22:11:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Dear Mathematica programming experts,
I've come across a question about handling Mathematica's error messages, and
I'm a little surprised that I've never come across the answer before.
Here's the question: I want to turn off the Plot3D::plnc message while a
function I've written does its work, and then leave the message in its
previous state (whether on or off) when the function is finished. To do
this, I came up with the following construction:
Module[{plncHead,...},
plncHead = Head[Plot3D::plnc]; (* record the prior state *)
Off[Plot3D::plnc]; (* turn it off *)
...(* the main code *)
If[plncHead =!= $Off, On[Plot3D::plnc]]; (* if it was on before, turn it
back on *)
Show[...]
]
Is there a better way to do this? What's the accepted view about functions
that "secretly" turn standard messages on or off?
===========================================================
Here are the details of the context for this question:
A few weeks ago, Ulrich Bodenhofer asked about 3D plots of functions having
discontinuities along lines and curves, and Andrzej Kozlowski suggested a
method based on DeleteCases. I tried it out and liked it enough to build it
into a PlotDiscontinuous3D function so I can use it later, with my
undergraduate course in multivariable calculus. Here it is:
Needs["Utilities`FilterOptions`"];
PlotDiscontinuous3D::usage =
"PlotDiscontinuous3D[funclist,{x,xmin,xmax},{y,ymin,ymax}] plots a
discontinuous function of x and y. The first argument funclist should be a
list of pairs of the form {cond,expr}, where cond and expr are both
expressions in x and y, and expr is to be plotted for those values of x and
y which make cond True.";
PlotDiscontinuous3D[pieces_,{x_,xmin_,xmax_},{y_,ymin_,ymax_},opts___]:=
Module[{plncHead, filledpieces, plots},
plncHead = Head[Plot3D::plnc]; Off[Plot3D::plnc];
filledpieces = Apply[If[##1, Indeterminate]&, pieces, {1}];
Block[{$DisplayFunction = Identity},
plots = (Plot3D[#, {x,xmin,xmax}, {y,ymin,ymax},
Evaluate[FilterOptions[Plot3D, opts]]]&) /@ filledpieces];
plots = Graphics3D /@ plots;
plots = DeleteCases[plots,
{_, _, _}?(MemberQ[#1, Indeterminate]&), Infinity];
If[plncHead =!= $Off, On[Plot3D::plnc]];
Show[plots, Evaluate[FilterOptions[Graphics3D, opts]] ]
]
If you set PlotPoints fairly high and Mesh->False, the results are okay,
though still not as good as David Park's method of customized coordinate
transformations. Here's an example:
PlotDiscontinuous3D[{{x^2 + y^2 <= 2, x^2 + y^2 + 2},
{x^2 + y^2 > 2, Sin[(x^2 + y^2)/2]}},
{x, -3, 3}, {y, -3, 3},
PlotPoints -> 75, Mesh -> False];
Preston Nichols
Mathematics Departement
Cornell College