15

My code:

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

Output:

enter image description here

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?

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
ratman2050
  • 193
  • 1
  • 7
  • 1
    Try with RegionPlot3D[] – Dr. belisarius Nov 24 '13 at 01: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 03:49
  • Here's an article about 3D printing from Mathematica... there are some tricks to take note of. http://www.segerman.org/3d_printing_notes.html – bill s Nov 24 '13 at 04:20

4 Answers4

22

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]

enter image description here

Simon Woods
  • 84,945
  • 8
  • 175
  • 324
19

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]
    ]
   ]]]

Graphics

Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • 3
    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
16

Try this:

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

thick

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]]

still thick

cormullion
  • 24,243
  • 4
  • 64
  • 133
7

As of Version 11 there are the PlotThemes "ThickSurface" and "FilledSurface".

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

enter image description here

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

enter image description here

Greg Hurst
  • 35,921
  • 1
  • 90
  • 136
  • Can Mathematica 11 vary the value of "ThickSurface"? If yes how? Could you share a line of code? I have this: PlotTheme -> "ThickSurface" but the thickness is to big. thank you – M. Joe Oct 23 '17 at 10:29
  • 1
    @M.Joe I think you'll adapt Simon Wood's answer by using the undocumented option Extrusion. – Greg Hurst Oct 23 '17 at 17:49