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