Re: 3D ContourGraphics alternative
- To: mathgroup at smc.vnet.net
- Subject: [mg65716] Re: [mg65683] 3D ContourGraphics alternative
- From: "David Park" <djmp at earthlink.net>
- Date: Sun, 16 Apr 2006 01:45:21 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
It is difficult to understand exactly what your graphic objective is. I will
take it that you want to plot the surfaces given by implicit equations.
The first surface...
z^2 == 1 - (2 - Sqrt[x^2 + y^2])^2
is nothing more than a torus with large radius a == 2 and small radius b ==
1. It can be parameterized by..
torus[a_, b_][u_, v_] := {(a + b Cos[v])Cos[u], (a + b Cos[v])Sin[u],
b Sin[v]}
and plotted with
ParametricPlot3D[Evaluate[torus[2, 1][u, v]], {u, 0, 2*Pi},
{v, 0, 2*Pi}];
The second surface...
E^z*Cos[x] == Cos[y]
can be solved for z
z == Log[Cos[y] Sec[x]]
in the domain...
domain[x_, y_] := Cos[y] Sec[x] > 0
We then plot the function
f[x_, y_] := Log[Cos[y] Sec[x]]
We can obtain a reasonable plot of this using the Boole function. The only
problem is that it shows a zero level surface where it should show nothing.
Plot3D[Boole[domain[x, y]]*f[x, y], {x, -3*(Pi/2), 3*(Pi/2)},
{y, -3*(Pi/2), 3*(Pi/2)}, PlotPoints -> {42, 42},
ImageSize -> 450];
With the DrawGraphic package we can eliminate the false zero surface patches
by trimming an array of polygons to the region where the function is real.
Needs["DrawGraphics`DrawingMaster`"]
polygrid = N[MakePolyGrid[{42, 42}, {{-3*(Pi/2), -3*(Pi/2)},
{3*(Pi/2), 3*(Pi/2)}}]];
polys = polygrid // TrimPolygonsBoole[domain];
The following shows the region in the xy plane where the function is real.
Draw2D[
{Burlywood, polys,
polys // PolygonOutline[Black]},
AspectRatio -> Automatic,
Frame -> True,
ImageSize -> 300];
The following draws the 3D image
plot1 =
Draw3DItems[
{polys // RaiseTo3D[f]},
BoxStyle -> Gray,
BoxRatios -> {1, 1, 0.7},
PlotRange -> {-1, 1}3,
Background -> Linen,
ImageSize -> 500];
We can also recognize that the surface exists only in certain square
regions. It is the region {x,-Pi/2,Pi,2},{y,-Pi/2,Pi,2} and regions that are
shifted in the xy plane by {n1 Pi, n2 Pi} where n1 + n2 is even. We can do
the plot this way with...
oneregion = Draw3D[f[x, y], {x, -Pi/2, Pi/2}, {y, -Pi/2, Pi/2}];
Draw3DItems[
{Table[If[EvenQ[n1 + n2], oneregion /.
DrawingTransform3D[#1 + n1*Pi & , #2 + n2*Pi & , #3 & ], {}],
{n1, -1, 1}, {n2, -1, 1}]},
BoxStyle -> Gray,
BoxRatios -> {1, 1, 0.7},
PlotRange -> {-1, 1}*3,
Background -> Linen,
ImageSize -> 500];
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
From: vasil michev [mailto:michev at gmail.com]
To: mathgroup at smc.vnet.net
Hello,
I need to plot a function of 3 parameters, and later examine different
contours of it. To do so, I've already downloaded and tried
ImplicitPlot3D and ContourPlot3D, but once I have the plot, say
p1 = ImplicitPlot3D[z^2 == 1 - (2 - Sqrt[x^2 +
y^2])^2, {x, -3, 3}, {y, -3, 3}, {z, -1, 1}, PlotPoints -> {15,
15, 10}, Passes -> Automatic]
I want to be able to work with the 'pl1' plot. With the 'ordinary'
Plot3D command the outpur it SurfaceGraphics and I can convert it, or
immediately display N contours of it on a single plot using the
ContourGraphics function. For example:
Show[ContourGraphics[Out[80]], ColorFunction -> Hue,
ColorFunctionScaling ->
True, ContourShading -> False, Contours -> 11, PlotRange -> {{-10, 10},
{1, 10}, {0.39999, .4}}]
But when using ContourPlot3D or ImplicitPlot3D packages the output is
more general - Graphics3D, and I cant simply do the trick. Can anyone
help me out, is there any package that will do the trick or any other
way you can think of doing this? I tried making number of plots with
various limitation for z-range, say
Show[p1, PlotRange -> {-.00001, 0}, Axes -> True]
and that seems to do what I want, but problems occur when I try to
convert the output to "ordinary" Graphics object - the range/points are
all wrong, probalby scaled (they vary from 0 to 1 only)
(If you cant understand me just try the following:
p1 = ImplicitPlot3D[E^z Cos[x] == Cos[y], {x, -6, 6}, {y, -6, 6}, {z,
-6, 6}, PlotPoints -> {16, 16, 12}, Passes -> 4]
pp1 = Show[p1, PlotRange -> {-.00001, 0}, Axes -> True]
Show[Graphics[pp1], Axes -> True, PlotRange -> All]
and look at the later 2 graphs - they're not quite the same... any help
working around this will be much appretiated too)
thanks in advance for any help