Re: Plot3D gives serrated ridge
- To: mathgroup at smc.vnet.net
- Subject: [mg54862] Re: Plot3D gives serrated ridge
- From: "Peltio" <peltio at trilight.zone>
- Date: Fri, 4 Mar 2005 05:07:57 -0500 (EST)
- References: <d01538$ov0$1@smc.vnet.net> <d03ng6$858$1@smc.vnet.net>
- Reply-to: "Peltio" <peltioNOSPAM at despammed.com.invalid>
- Sender: owner-wri-mathgroup at wolfram.com
"Jon Harrop" wrote:
>Hugh Goyder wrote:
>> Any suggestions for improving the plot?
>
>Use Plot3D to do the shaded surface (with a single white light) and then
add
>your own code to plot the grid at a lower sampling but the same resolution:
>
>\!\(\(With[{n = 128, m = 32, xmin = 4, xmax = 5.5, zmin = 4.5, zmax = 5},
> Show[{Graphics3D[
> Plot3D[Evaluate[Abs[f]], {k1, xmin, xmax}, {k, zmin, zmax},
snip-
That's nice.
Here's a procedure that implements your suggestions with a few options: the
number of intervals of the plot in the x and y directions, the number of
intervals between lines crossing the x and y axis, plus their style (only a
a list of two lists).
Oh, yes, there is also a GridOffset value that can be useful to lift the
grid and avoiding its being hidden by the surface. Adding 1% to 3-5% of
the plotrange should work in most cases.
(*======================================================*)
(*WirePlot3D*)
(*======================================================*)
Needs["Utilities`FilterOptions`"]
Options[WirePlot3D] = {PlotLines -> 15, PlotPoints -> 100,
GridOffset -> 0, LightSources -> {{{0, 1, 0.65}, RGBColor[1, 1, 1]}},
Mesh -> False, WireStyle -> {{GrayLevel[0]}, {GrayLevel[0]}}};
WirePlot3D[g_, {x1_Symbol, xmin_, xmax_}, {x2_Symbol, ymin_, ymax_},
opts___Rule] :=
Module[
{n, m, x, y, f, fr, p3opts, shopts, funplot,
linplot, i, j, px, py, lx, ly, eps, xlinsty, ylinsty},
p3opts = FilterOptions[Plot3D, Join[{opts}, Options[WirePlot3D]]];
shopts = FilterOptions[Show, Join[{opts}, Options[WirePlot3D]]];
n = Flatten[{PlotPoints /. {opts} /. Options[WirePlot3D]}];
{px, py} = {First[n], Last[n]};
m = Flatten[{PlotLines /. {opts} /. Options[WirePlot3D]}];
{lx, ly} = {First[m], Last[m]};
eps = GridOffset /. {opts} /. Options[WirePlot3D];
xlinsty = First[WireStyle /. {opts} /. Options[WirePlot3D]];
ylinsty = Last[WireStyle /. {opts} /. Options[WirePlot3D]];
f[x_, y_] = g /. {x1 -> x, x2 -> y};
funplot = Plot3D[Evaluate[f[x, y]], {x, xmin, xmax}, {y, ymin, ymax},
PlotPoints -> Evaluate[{px + 1, py + 1}], Evaluate[p3opts],
DisplayFunction -> Identity
];
fr[i_, j_] := Block[
{x = ((px - i)*xmin + i*xmax)/px, y = ((py - j)*ymin + j*ymax)/py},
{x, y, f[x, y] + eps}];
linplot = Graphics3D[{
{Sequence @@ xlinsty,
Table[Line[Table[fr[i, j], {i, 0, px}]], {j, 0, py, py/ly}]},
{Sequence @@ ylinsty,
Table[Line[Table[fr[i, j], {j, 0, py}]], {i, 0, px, px/lx}]}}
];
Show[{Graphics3D[funplot], linplot},
shopts, DisplayFunction -> $DisplayFunction]
]
(*======================================================*)
A few examples:
WirePlot3D[Exp[-0.1 x y^2] Sin[x] Cos[y], {x, -2, 3}, {y, -3, 5},
PlotPoints -> {100, 50}, PlotLines -> 10, GridOffset -> 0.05]
Clear[f]
f[x_, y_] := Exp[-0.1 x y - y^2 x] Sin[x] Cos[y]
WirePlot3D[f[x, y], {x, 0.2, 4}, {y, -3, 3}, PlotLines -> {20, 40},
WireStyle -> {{GrayLevel[0.84]}, {GrayLevel[0.15]}},
GridOffset -> 0.002, PlotRange -> {-0.5, 0.5}]
Clear[f];
f = -((2 I)/(4 - 100 (9.42477796076938 + 0.01 I - 2 k)*
(0.047123889803846894 I - k + k1)));
WirePlot3D[Abs[f], {k1, 4, 5.5}, {k, 4.5, 5}, PlotPoints -> 128,
PlotLines -> 32]
cheers,
Peltio