How do I draw a hemisphere?
To show that there's more than one way to skin a cat, here's another primitive-based method, using NURBS surfaces to render a hemisphere:
With[{r = 1},
Graphics3D[{EdgeForm[],
BSplineSurface[Outer[Append[First[#1] #2, Last[#1]] &,
r {{0, 1}, {1, 1}, {1, 0}},
{{1, 0}, {1, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {1, -1}, {1, 0}}, 1],
SplineClosed -> {False, True}, SplineDegree -> 2,
SplineKnots -> {{0, 0, 0, 1, 1, 1},
{0, 0, 0, 1/4, 1/2, 1/2, 3/4, 1, 1, 1}},
SplineWeights -> Outer[Times, {1, 1/Sqrt[2], 1},
{1, 1/2, 1/2, 1, 1/2, 1/2, 1}]]},
BaseStyle -> {BSplineSurface3DBoxOptions ->
{Method -> {"SplinePoints" -> 40}}}, Boxed -> False]]
Change r
to vary the radius; the control points in the first argument of BSplineSurface[]
can be translated and rotated, if the hemisphere needs to be positioned/oriented differently.
If you're interested in this sort of thing, you can refer to work by Piegl and Tiller, e.g. this paper and their book.
Here's another NURBS representation of a hemisphere:
With[{r = 1},
Graphics3D[{EdgeForm[],
BSplineSurface[Outer[Insert[First[#1] #2, Last[#1], 2] &,
r {{0, -1}, {1, -1}, {1, 1}, {0, 1}},
{{-1, 0}, {-1, 1}, {1, 1}, {1, 0}}, 1],
SplineDegree -> 2,
SplineKnots -> {{0, 0, 0, 1/2, 1, 1, 1},
{0, 0, 0, 1/2, 1, 1, 1}},
SplineWeights -> Outer[Times, {1, 1/2, 1/2, 1},
{1, 1/2, 1/2, 1}]]},
BaseStyle -> {BSplineSurface3DBoxOptions ->
{Method -> {"SplinePoints" -> 40}}}, Boxed -> False]]
N.B. The previous version of this answer featured BSplineSurface[]
objects with noticeable blemishes; this turned out to be due to insufficient internal sampling. Adding the option BaseStyle -> {BSplineSurface3DBoxOptions -> {Method -> {"SplinePoints" -> 40}}}
(similar to what Mr. Wizard did here) minimizes the blemishes to a barely noticeable spot.
This peculiar method works in Mathematica versions 7 (thanks, Mr. Wizard!) and 8, but apparently no longer in version 9 onwards (per rm and Reb.Cabin):
Graphics3D[{CapForm["Round"], Tube[{{0, 0, 0}, {0, 0, 0}}, {0, 1}]}, Boxed -> False]
(I know CapForm["Round"]
can be omitted, since it's the default; I just wanted to indicate that it's the reason for this behavior.)
Replace the 1
with your desired radius. As has been noted, if you need to put your hemispheres into an arbitrary position/orientation, GeometricTransformation[]
comes in handy.
A workaround suggested by Pickett for version 9 involves a slight perturbation of one of the endpoints, like so:
With[{r = 1, ε = $MachineEpsilon},
Graphics3D[{CapForm["Round"], Tube[{{0, 0, 0}, {0, 0, ε r}}, {0, r}]},
Boxed -> False]]
ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]},
{u, 0, π}, {v, 0, π},
Mesh -> None,
Boxed -> False,
Axes -> None
]
r = 0.5;
d = {0, 0, 0.5}
sphere = ParametricPlot3D[r {Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]} + d,
{u, -π/2, π/2}, {v, -π/2, π/2},
Mesh -> None, Boxed -> False, Axes -> None][[1]];
SphereOpacity = 0.5;
CuboidOpacity = 0.5;
SphereColor = Blue;
CuboidColor = Orange;
Graphics3D[{SphereColor, Opacity[SphereOpacity], sphere, CuboidColor,
Opacity[CuboidOpacity], Cuboid[{-5, -5, 0}, {5, 5, 0.5}]},
Boxed -> False]