Re: How to apply EdgeForm to ParametricPlot3D?
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1724] Re: How to apply EdgeForm to ParametricPlot3D?
- From: deppeler at math.ethz.ch (Harry Deppeler)
- Date: Thu, 20 Jul 1995 23:46:37 -0400
- Organization: Swiss Federal Institute of Technology (ETHZ)
Dave Wagner (wagner at bullwinkle.cs.Colorado.EDU) wrote:
: In article <DBKyKB.4BF at wri.com>,
: Gabriel Berriz <berriz at husc.harvard.edu> wrote:
: >
: >
: >Hello. Is it possible to apply the EdgeForm Graphics3D directive to a
: >surface plot done with ParametricPlot3D? The Book says nothing to the
: >contrary, but I haven't found a way of getting it to work
: >(i.e. ParametricPlot3D *always* draws black edges on the polygons
: >forming the surface, regardless of EdgeForm directives). Does anybody
: >know how to do it?
: You can apply EdgeForm to *any* Graphics3D object. The form of a
: Graphics3D object is "Graphics3D[primitives, options]", where each
: of the two parts is a list. (A list of polygons, lines, and so forth
: in the first case, and a list of options in the second.) Hence the
: following does what you want with the Graphics3D object "g3dobj":
: Show[Graphics3D[{EdgeForm[whatever], g3dobj[[1]]}, g3dobj[[2]] ]]
: where "whatever" is a list of style directives. Note that the primitives
: (the first element of the object) can be arbitrarily nested, so there's
: no problem adding another level of nesting to it. You can leave out
: the second componenet if you want to, but then you would lose any special
: formatting options that were already in the object.
: Here's an example. I have no idea what this gizmo is but it was the
: first thing I could think of plotting parametrically.
: In[1]:=
: ParametricPlot3D[{Sin[u], Cos[u]Sin[t], Cos[t]}, {u,-Pi,0}, {t,0,Pi}]
: In[2]:=
: Show[Graphics3D[{EdgeForm[Hue[0]], %[[1]]}, %[[2]]]]
: Dave Wagner
: Principia Consulting
: (303) 786-8371
: dbwagner at princon.com
: http://www.princon.com/princon
Hi!
A while ago I run into the same problem. I did not manage to get this
to work the way I wanted to (and I used the recipe above as well) ---
I hope, this was a bug of the version I used then. I've no time to
reproduce the results now or to check whether they're gone, but back
then I just hacked the package (which looks different in the current
versions I understand):
I changed
ParametricPlot3D[ fun_,
ul:{_, u0_, u1_, du_},
vl:{_, v0_, v1_, dv_},
opts___] :=
Show[Graphics3D[ MakePolygons[Table[N[fun], ul, vl]] ],
opts] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]] &&
NumberQ[N[v0]] && NumberQ[N[v1]] && NumberQ[N[dv]]
into
ParametricPlot3D[ fun_,
ul:{_, u0_, u1_, du_},
vl:{_, v0_, v1_, dv_},
opts___] :=
Show[Graphics3D[ {EdgeForm[ ], MakePolygons[Table[N[fun], ul, vl]] } ],
^^^^^^^^^^^^^ ^^^
Opts] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]] &&
NumberQ[N[v0]] && NumberQ[N[v1]] && NumberQ[N[dv]]
I hope this helps if nothing else helps.
In case you don't have the old package, I will include it here.
Just read it in instead of using the ParametricPlot3D included with
your version of mathematica and everything will be fine.
cu
harald (deppeler at math.ethz.ch)
(* Copyright 1988 Wolfram Research Inc. *)
(* One and Two Parameter 3D Plots *)
(* by Roman Maeder *)
BeginPackage["Graphics`ParametricPlot3D`"]
ParametricPlot3D::usage =
"ParametricPlot3D[{x,y,z}, {u,u0,u1,(du)}, {v,v0,v1,(dv)}, (options..)]
plots a 3D parametric surface. Options are passed to Show[]"
PointParametricPlot3D::usage =
"PointParametricPlot3D[{x,y,z}, {u,u0,u1,(du)}, {v,v0,v1,(dv)}, (options..)]
plots a two-parameter set of points in space.
Options are passed to Show[]"
SpaceCurve::usage =
"SpaceCurve[{x,y,z}, {u,u0,u1,(du)}, (options..)]
plots a 3D parametric curve. Options are passed to Show[]"
PointSpaceCurve::usage =
"PointSpaceCurve[{x,y,z}, {u,u0,u1,(du)}, (options..)]
plots a one-parameter set of points in space.
Options are passed to Show[]"
SphericalPlot3D::usage = "SphericalPlot3D[r, {theta-range}, {phi-range},
(options...)] plots r as a function of the angles theta and phi."
Begin["`Private`"]
MakePolygons[vl_List] :=
Block[{l = vl,
l1 = Map[RotateLeft, vl],
mesh},
mesh = {l, l1, RotateLeft[l1], RotateLeft[l]};
mesh = Map[Drop[#, -1]&, mesh, {1}];
mesh = Map[Drop[#, -1]&, mesh, {2}];
Polygon /@ Transpose[ Map[Flatten[#, 1]&, mesh] ]
]
Attributes[ParametricPlot3D] = {HoldFirst}
ParametricPlot3D[ fun_,
ul:{_, u0_, u1_, du_},
vl:{_, v0_, v1_, dv_},
opts___] :=
Show[Graphics3D[ {EdgeForm[ ], MakePolygons[Table[N[fun], ul, vl]] } ], opts] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]] &&
NumberQ[N[v0]] && NumberQ[N[v1]] && NumberQ[N[dv]]
ParametricPlot3D[fun_, {u_, u0_, u1_}, {v_, v0_, v1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
ParametricPlot3D[ fun,
{u, u0, u1, (u1-u0)/(plotpoints-1)},
{v, v0, v1, (v1-v0)/(plotpoints-1)},
opts ]
]
ParametricPlot3D[fun_, ulim:{_, _, _, _}, {v_, v0_, v1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
ParametricPlot3D[ fun,
ulim,
{v, v0, v1, (v1-v0)/(plotpoints-1)},
opts ]
]
ParametricPlot3D[fun_, {u_, u0_, u1_}, vlim:{_, _, _, _}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
ParametricPlot3D[ fun,
{u, u0, u1, (u1-u0)/(plotpoints-1)},
vlim,
opts ]
]
Attributes[PointParametricPlot3D] = {HoldFirst}
PointParametricPlot3D[ fun:{_, _, _},
ul:{_, u0_, u1_, du_},
vl:{_, v0_, v1_, dv_},
opts___] :=
Show[ Graphics3D[Table[Point[N[fun]], ul, vl]], opts ] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]] &&
NumberQ[N[v0]] && NumberQ[N[v1]] && NumberQ[N[dv]]
PointParametricPlot3D[fun_, {u_, u0_, u1_}, {v_, v0_, v1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
PointParametricPlot3D[ fun,
{u, u0, u1, (u1-u0)/(plotpoints-1)},
{v, v0, v1, (v1-v0)/(plotpoints-1)},
opts ]
]
PointParametricPlot3D[fun_, ulim:{_, _, _, _}, {v_, v0_, v1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
PointParametricPlot3D[ fun,
ulim,
{v, v0, v1, (v1-v0)/(plotpoints-1)},
opts ]
]
PointParametricPlot3D[fun_, {u_, u0_, u1_}, vlim:{_, _, _, _}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
PointParametricPlot3D[ fun,
{u, u0, u1, (u1-u0)/(plotpoints-1)},
vlim,
opts ]
]
Attributes[SpaceCurve] = {HoldFirst}
SpaceCurve[ fun:{_, _, _}, ul:{_, u0_, u1_, du_}, opts___] :=
Show[ Graphics3D[Line[Table[N[fun], ul]]], opts ] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]]
SpaceCurve[fun_, {u_, u0_, u1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
SpaceCurve[ fun, {u, u0, u1, (u1-u0)/(plotpoints-1)}, opts ]
]
Attributes[PointSpaceCurve] = {HoldFirst}
PointSpaceCurve[ fun:{_, _, _}, ul:{_, u0_, u1_, du_}, opts___] :=
Show[ Graphics3D[Table[Point[N[fun]], ul]], opts ] /;
NumberQ[N[u0]] && NumberQ[N[u1]] && NumberQ[N[du]]
PointSpaceCurve[fun_, {u_, u0_, u1_}, opts___] :=
Block[{plotpoints},
plotpoints = PlotPoints /. {opts} /. Options[Plot3D];
PointSpaceCurve[ fun, {u, u0, u1, (u1-u0)/(plotpoints-1)}, opts ]
]
Attributes[SphericalPlot3D] = {HoldFirst}
SphericalPlot3D[ r_, tlist:{theta_, __}, plist:{phi_, __}, opts___ ] :=
Block[{rs},
ParametricPlot3D[{(rs = r) Sin[theta] Cos[phi],
rs Sin[theta] Sin[phi],
rs Cos[theta]},
tlist, plist, opts]
]
End[]
Protect[ParametricPlot3D, PointParametricPlot3D, SpaceCurve,
PointSpaceCurve, SphericalPlot3D]
EndPackage[]
Null