# Increase 3D Graph thickness for 3D printing in Mathematica?

My code:

Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}]


Output:

And now I can export this to STL by using the export STL command, however, when I try to print this on the MakerBot 3D printer there is a problem because the width of the graph is too thin. I need to increase the thickness of the width of the graph, can I do this in Mathematica?

-
Try with RegionPlot3D[] – Dr. belisarius Nov 24 '13 at 1:49
I'm confused by your terminology. What do mean by "width" and "thickness"? I have no idea what dimension "width" refers to, and as for "thickness", a surface it infinitesimally thin by definition. – m_goldberg Nov 24 '13 at 3:49
Here's an article about 3D printing from Mathematica... there are some tricks to take note of. segerman.org/3d_printing_notes.html – bill s Nov 24 '13 at 4:20

Try this:

Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2},
PlotStyle -> Thickness[1]]


And remember to watch your units - if you print in millimetres, 1 is a bit small...

# For Version 10

The above no longer works in Mathematica version 10. Instead of Plot3D, use ParametricPlot3D:

ParametricPlot3D[{x, y, (2 x y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2},
PlotStyle -> Thickness[1]]


-
This may be version 9 and later, not sure... – cormullion Nov 24 '13 at 8:31
What about AbsoluteThickness? edit: it seems it's not supported. – shrx Nov 24 '13 at 11:54
@shrx AbsoluteThickness doesn't appear to work for this application... – cormullion Nov 24 '13 at 12:01
+1. Well, wasn't that easy? :) – Michael E2 Nov 24 '13 at 12:53
@MichaelE2 :) our answers reflect our contrasting math skills... – cormullion Nov 24 '13 at 12:55

In version 10.0.0 the PlotStyle -> Thickness method shown by cormullion does not appear to work. Instead we can use the undocumented Extrusion option:

ContourPlot3D[x y z == 0.05, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, Extrusion -> 0.1]


-
Aaaaaaagh. They're supposed to add new features for new releases, not remove ones.. – cormullion Jul 16 '14 at 16:36
Which works in ContourPlot3D even though it's Red so unrecognized as an option but doesn't work and is rejected by ListContourPlot3D!!! Echoing Aaaaaaaagh. V. 10.1. – Ymareth Apr 3 '15 at 18:23
@Ymareth Seems Extrusion (still undocumented) works now also in ListContourPlot3D since v10.2. See this post – SquareOne Oct 29 '15 at 10:49

You can take advantage of the VertexNormals that Plot computes to translate the surface a little to each side. I'm not sure just what is required for good STL output. I put a polygonal side all around the two surfaces. The VertexNormals are wrong for the sides, so I commented them out for the image presented.

The thickness is controlled by the parameter thickness.

With[{plot = Plot3D[{(2*x*y)/(x^2 + y^2)}, {x, -2, 2}, {y, -2, 2}, Mesh -> None]},
With[{n0 = VertexNormals /. Cases[plot, HoldPattern[VertexNormals -> _], Infinity],
thickness = 0.1},
With[{pts = First @
Cases[plot,
GraphicsComplex[p_, e__] :> Flatten[{p - thickness n0, p + thickness n0}, 1],
Infinity],
vn = First @ Cases[plot, HoldPattern[VertexNormals -> v_] :> Join[v, v], Infinity]},
Graphics3D[
GraphicsComplex[
pts,
{EdgeForm[],
Cases[plot, Polygon[p_] :> Polygon@Join[p, p + Length[pts]/2], Infinity],
Cases[plot,
Line[p_] :> Polygon[Join[#, Reverse@# + Length[pts]/2] & /@ Partition[p, 2, 1]],
Infinity]}
(*, VertexNormals -> vn *)
],
PlotRange -> All,
Options[plot]
]
]]]


-
This was a very detailed answer, and I appreciate you taking the time to write it. I chose the other only out of simplicity but I am sure your answer may have future benefits, thanks. – ratman2050 Nov 24 '13 at 23:22
Hey, no problem. The other way is definitely superior based on simplicity. Also, the other answer does what this one does and more. – Michael E2 Nov 24 '13 at 23:26