VC.09 Spherical Coordinates
TUTORIALS

\(Off[General::spell]; 
Off[General::spell1]; 

    \(Off[ParametricPlot3D::ppcom]; \)\)Off[ParametricPlot::ppcom]; Off[Plot::plnr]; SetOptions[Limit, Analytic -> True];

CMView = {2.7, 1.6, 1.2};

Vector Drawer

BeginPackage["Vector3D`", "Graphics`Colors`"];

\(Axes3D::"usage" = 
      "Axes3D[a, b] creates a Graphics3D object of cartesian axes with x, y, and z running from -a/3 to a, and with axes labels b units beyond the tips of the axes.  Axes3D[a] is Axes3D[a, a/8]."; 

    \(Perpend::"usage" = 
      "Perpend[a] returns a unit vector which is perpendicular to the vector a."; \)\)Arrow::"usage" = 
      "Arrow[a] produces a 2 or 3 dimensional vector from the origin to a. \
Arrow[a, Tail -> tail] gives a vector from tail to a."; Vector::"usage" = 
      "Vector[a, b] gives a 2D or 3D vector from a to b."; ArrowHead::"usage" = 
      "ArrowHead[a, vec] produces an arrowhead with its tip placed at the \
point a, pointing in the direction of the vector vec."; Tail::"usage" = 
      "Tail -> point puts the tail of the vector at point."; Norm::"usage" = 
      "Norm[vec] returns the Euclidean length of vec."; Normalize::"usage" = 
      "Normalize[vec] returns a unit vector in the direction of vec, \
provided vec is nonzero."; Aperture::"usage" = 
      "Aperture is the ratio of the radius of the base to the length of the \
head of a vector."; TipSize::"usage" = 
      "TipSize specifies an absolute size for the inner tip length of the \
head of a vector."; TipRatio::"usage" = 
      "TipRatio is the ratio of the inner length of the arrowhead to the \
length of the shaft of a vector."; HeadRatio::"usage" = 
      "HeadRatio is the ratio of the outer length of the arrowhead to the \
length of the shaft of a vector."; HeadSize::"usage" = 
      "HeadSize specifies an absolute size for the head of a vector."; 
    ScaleFactor::"usage" = 
      "ScaleFactor specifies the amount to scale a vector in length and may \
be either a number or a pure function."; ZeroVectorPointSize::"usage" = 
      "ZeroVectorPointSize is the size of the point used to represent a \
zero vector."; Options[Vector] = 
      Options[Arrow] = 
        Options[ArrowHead] = {HeadRatio -> 0.18, 
            TipRatio -> 0.14, Aperture -> 0.3, 
            ScaleFactor -> 1, HeadType -> Polygon, 
            ShaftQ -> True, EdgesQ -> True, 
            VectorColor -> RGBColor[0, 0, 1], ShaftWidth -> 0.005, 
            ZeroVectorPointSize -> 0.01}; Begin["`Private`"]; SetOptions[ParametricPlot, AspectRatio -> Automatic]; SetOptions[Plot, AspectRatio -> Automatic]; SetOptions[Graphics, AspectRatio -> Automatic]; Axes3D[u_, v_] := 
      Graphics3D[{{Blue, Line[{{-(u/3), 0, 0}, {u, 0, 0}}]}, 
          Text["x", {u + v, 0, 0}], {Blue, 
            Line[{{0, -(u/3), 0}, {0, u, 0}}]}, 
          Text["y", {0, u + v, 0}], {Blue, 
            Line[{{0, 0, -(u/3)}, {0, 0, u}}]}, 
          Text["z", {0, 0, u + v}]}]; Axes3D[u_] := Axes3D[u, (u/8)]; Norm[a_?VectorQ] := N[(Sqrt[a . a])]; Normalize[a_?VectorQ] := If[a . a == 0, a, (a/Norm)[a]]; Perpend[a_?VectorQ] := 
      Normalize[{a[[2]], 
            -a[[1]]}] /; 
        Length[a] == 2Perpend[a_?VectorQ] := 
      Normalize[
          If[a[[1]] == 0, {1, 0, 0}, {0, 
              a[[3]], 
              -a[[2]]}]] /; 
        Length[a] == 3Base3D = 
      Table[{Cos[((2 k π)/8.) ], Sin[((2 k π)/8.) ]}, {k, 0, 
          8}]; Vector[from_?VectorQ, to_?VectorQ, opts___] := 
      Module[{sq, sw, ht, hs, hr, tr, ap, sf, vc, zvps, diff = to - from, 
            tip}, {sq, sw, ht, hs, hr, ts, tr, ap, sf, vc, zvps} = 
            {ShaftQ, ShaftWidth, HeadType, HeadSize, HeadRatio, TipSize, 
                  TipRatio, Aperture, ScaleFactor, VectorColor, 
                  ZeroVectorPointSize} /. {opts} /. Options[Vector]; 
          If[from == to, 
            Return[Graphics[{PointSize[zvps], vc, Point[from]}]]]; 
          diff = If[NumberQ[N[sf]], sf diff, sf[diff]]; tip = from + diff; 
          If[NumberQ[hs], hr = (hs/Norm)[diff]; tr = 0.75 hr]; 
          If[NumberQ[ts], tr = (ts/Norm)[diff]]; 
          Graphics[{
              If[sq, {vc, Thickness[sw], Line[{from, tip - tr diff}]}, {}], 
              With[{trans = ap hr Norm[diff] Perpend[diff]}, {vc, 
                  Thickness[sw], 
                  ht[{tip, tip - hr diff + trans, tip - tr diff, 
                      tip - hr diff - trans, tip}]}]}]] /; 
        Length[from] == Length[to] == 2Vector[from_?VectorQ, to_?VectorQ, opts___] := 
      Module[{sq, eq, sw, hs, hr, tr, ap, sf, vc, zvps, diff = to - from, 
            tip}, {sq, eq, sw, hs, hr, ap, sf, vc, zvps} = 
            {ShaftQ, EdgesQ, ShaftWidth, HeadSize, HeadRatio, Aperture, 
                  ScaleFactor, VectorColor, ZeroVectorPointSize} /. {opts}
                   /. Options[Vector]; 
          If[from == to, 
            Return[Graphics3D[{PointSize[zvps], vc, Point[from]}]]]; 
          diff = If[NumberQ[N[sf]], sf diff, sf[diff]]; tip = from + diff; 
          If[NumberQ[hs], hr = (hs/Norm)[diff]]; tr = (hr/2); 
          Graphics3D[{
              If[sq, {vc, Thickness[sw], Line[{from, tip - tr diff}]}, {}], 
              If[eq, {}, EdgeForm[]], {SurfaceColor[vc], 
                With[{temp = Perpend[diff]}, 
                  (Polygon[Append[#1, tip]]&)/@
                    Partition[
                      (tip - hr diff + #1&)/@
                        ((ap hr Norm[diff] Base3D) . {temp, 
                              Normalize[temp\[Cross]diff]}), 2, 1]]}}]] /; 
        Length[from] == Length[to] == 3Arrow[a_, Tail -> b_, opts___] := Vector[b, a + b, opts]Arrow[a_, opts___] := Vector[Table[0, {Length[a]}], a, opts]\(ArrowHead[a_, b_, opts___] := 
      Vector[a - b, a, ShaftQ -> False, opts]; 

End[]; 

    \(EndPackage[]; \)\)

Graphics`Colors`GosiaGreen = RGBColor[0,  0.392187,  0];

Spherical Setup

\(Clear[polar]; 

    polar[{x_, y_, z_}] := {\@\(x\^2 + y\^2 + z\^2\), ArcTan[y\/x], 
        ArcCos[z\/\@\(x\^2 + y\^2 + z\^2\)]}; 
Clear[X, length]; 

    length[X_] := \@\(X . X\); 
\(rr = 3; \)\)R = 5; scale = 0.8; red = RGBColor[1, 0, 0]; blue = RGBColor[0, 0, 1]; color1 = RGBColor[0.8, 0.2, 0.8]; color2 = RGBColor[0.2, 0.8, 0.2]; black = RGBColor[0, 0, 0]; \(Clear[axes]; 

    axes := Graphics3D[{Line[{X, {1.5\ rr, 0, 0}}], 
          Line[{X, {0, 1.5\ rr, 0}}], Line[{X, {0, 0, 2\ rr}}]}]; 

    Clear[xyplane]; 

    xyplane := 
      Graphics3D[
        Polygon[{{\(-2\)\ rr, \(-2\)\ rr, 0}, {\(-2\)\ rr, 2\ rr, 0}, {2\ rr, 
              2\ rr, 0}, {2\ rr, \(-2\)\ rr, 0}}]]; 
\(X = {0, 0, 0}; \)\)origin = Graphics3D[{black, Point[X]}]; Z = {2, 3, 5}; \(Clear[point]; 

    point := Graphics3D[{red, PointSize[0.03], Point[scale\ Z]}]; 

    \(Z0 = {0, 0, length[0.8\ Z]}; \)\)\(Clear[zpoint]; 
zpoint = Graphics3D[{black, Point[Z0]}]; 

    \(XY = scale\ Z\ {1, 1, 0}; \)\)\(Clear[xypoint]; 
xypoint := Graphics3D[{black, Point[XY]}]; 

    \(X0 = {length[scale\ Z\ {1, 1, 0}], 0, 0}; \)\)xpoint = Graphics3D[{black, Point[X0]}]; Y0 = {0, length[scale Z {1, 1, 0}], 0}; ypoint = Graphics3D[{black, Point[Y0]}]; \(Clear[ray]; 
ray := Graphics3D[{blue, Line[{X, scale\ Z}]}]; 

    Clear[ray1]; 
ray1 := Graphics3D[{color1, Line[{scale\ Z, Z}]}]; 

    Clear[xyray]; 
xyray := Graphics3D[{red, Line[{X, Z\ {1, 1, 0}}]}]; 

    \(rays := {ray, xyray}; \)\)xyaux = 
      (length[0.8 Z] (0.8 Z {1, 1, 0}))/
        length[0.8 Z {1, 1, 0}]; \(Clear[zarc]; 

    zarc = Graphics3D[{blue, 
          Line[Table[
              \(Cos[t]\ \) {0, 0, length[0.8\ Z]} + Sin[t]\ xyaux, {t, 0, 
                \(polar[0.8\ Z]\)[[3
                  ]],  .1}]]}]; 
Clear[zarc1]; 

    zarc1 = Graphics3D[{color1, 
          Line[Table[
              \(Cos[t]\ \) {0, 0, length[0.8\ Z]} + Sin[t]\ xyaux, {t, 
                \(polar[0.8\ Z]\)[[3]], 
                1,  .1}]]}]; 
Clear[zarc2]; 

    zarc2 = Graphics3D[{color1, 
          Line[Table[
              \(Cos[t]\ \) {0, 0, length[0.8\ Z]} + Sin[t]\ xyaux, {t, 
                \(-0.8\), 0,  .1}]]}]; 
Clear[xyarc]; 

    xyarc = Graphics3D[{blue, 
          Line[Table[
              Cos[t]\ X0 + Sin[t]\ Y0, {t, 0, 
                \(polar[XY]\)[[2
                  ]],  .1}]]}]; 
Clear[xyarc1]; 

    xyarc1 = Graphics3D[{color1, 
          Line[Table[Cos[t]\ X0 + Sin[t]\ Y0, {t, \(- .5\), 0,  .1}]]}]; 

    Clear[xyarc2]; 

    xyarc2 = Graphics3D[{color1, 
          Line[Table[
              Cos[t]\ X0 + Sin[t]\ Y0, {t, 
                \(polar[XY]\)[[2]], 
                \(polar[XY]\)[[2]] + 
                  0.3,  .1}]]}]; 
Clear[stick]; 

    stick = Graphics3D[{red, Line[{scale\ Z, XY}]}]; 

    \(xaxislabel = Text["x", {0.363, 0.26}]; \)\)yaxislabel = Text["y", {0.73, 0.3}]; zaxislabel = Text["z", { .5, 0.67}]; stickplot = 
      Show[xyplane, axes, ray, point, Boxed -> False, 
        ViewPoint -> {2.747, 1.594, 1.168}, 
        Epilog -> {xaxislabel, yaxislabel, zaxislabel}, 
        DisplayFunction -> Identity]; rho = Text["r", {0.53, 0.45}]; rlabel = 
      Show[xyplane, axes, ray, point, Boxed -> False, 
        ViewPoint -> {2.747, 1.594, 1.168}, 
        Epilog -> {rho, xaxislabel, yaxislabel, zaxislabel}, 
        DisplayFunction -> Identity]; phi = Text["s", {0.55, 0.57}]; slabel = 
      Show[xyplane, zpoint, axes, ray, point, zarc, zarc1, zarc2, 
        Boxed -> False, ViewPoint -> {2.747, 1.594, 1.168}, 
        Epilog -> {phi, xaxislabel, yaxislabel, zaxislabel}, 
        DisplayFunction -> Identity]; theta = Text["t", { .5, 0.3}]; tlabel = 
      Show[xyplane, axes, xypoint, xpoint, ray, stick, point, xyarc, xyarc1, 
        xyarc2, Boxed -> False, ViewPoint -> {2.747, 1.594, 1.168}, 
        Epilog -> {theta, xaxislabel, yaxislabel, zaxislabel}, 
        DisplayFunction -> Identity]; all = 
      Show[xyplane, axes, ray, stick, point, zpoint, xpoint, xypoint, xyarc, 
        xyarc1, xyarc2, zarc, zarc1, zarc2, Boxed -> False, 
        ViewPoint -> {2.747, 1.594, 1.168}, 
        Epilog -> {theta, phi, rho, xaxislabel, yaxislabel, zaxislabel}, 
        DisplayFunction -> Identity];

Crisscross

\(Clear[x]; 

    crisscross = 
      Plot[{Cos[x], Sin[x]}, {x, π\/8, \(3\ π\)\/8}, 
        PlotStyle -> {{RGBColor[1, 0, 0], Thickness[0.02]}}, 
        Axes -> None, AspectRatio -> 1\/3, 
        DisplayFunction -> Identity]; \)

T.1)  Balls and eggs

T.1.a) Centering a sphere at a given point

Here's a plot of the sphere of radius 1 centered at {0, 0, 0}:

\(Clear[x, y, z, r, s, t]; 
    
{x[r_, s_, t_], y[r_, s_, t_], z[r_, s_, t_]} = {r\ Sin[s]\ Cos[t], 
        r\ Sin[s]\ Sin[t], r\ Cos[s]}; 

    \({{slow, shigh}, {tlow, thigh}} = {{0, π}, {0, 2\ π}}; \)\)Clear[firstsphereplotter]; firstsphereplotter[s_, t_] = {x[1, s, t], y[1, s, t], z[1, s, t]}; 
    firstsphereplot = 
      ParametricPlot3D[
        Evaluate[firstsphereplotter[s, t]], {s, slow, shigh}, {t, tlow, 
          thigh}, Boxed -> False, BoxRatios -> Automatic, 
        ViewPoint -> CMView, 
        AxesLabel -> {"x", "y", "z"}];

Add the plot of the sphere of radius 0.2 centered at {1, 1, 1.5} to this plot.

That's easy. Just copy, paste, and edit the code that made the original plot:

center = {1, 1, 1.5}; \(Clear[x, y, z, r, s, t]; 
    
{x[r_, s_, t_], y[r_, s_, t_], z[r_, s_, t_]} = 
      center + {r\ Sin[s]\ Cos[t], r\ Sin[s]\ Sin[t], r\ Cos[s]}; 

    \(r = 0.2; \)\){{slow, shigh}, {tlow, thigh}} = {{0, π}, {0, 2 π}}; Clear[secondsphereplotter]; secondsphereplotter[s_, t_] = {x[r, s, t], y[r, s, t], z[r, s, t]}; 
    secondsphereplot = 
      ParametricPlot3D[
        Evaluate[secondsphereplotter[s, t]], {s, slow, shigh}, {t, tlow, 
          thigh}, DisplayFunction -> Identity]; Show[firstsphereplot, secondsphereplot, Boxed -> False, 
      BoxRatios -> Automatic, ViewPoint -> CMView, 
      PlotRange -> All, AxesLabel -> {"x", "y", "z"}, 
      DisplayFunction -> $DisplayFunction];

This plants the seeds for some interesting movies.

T.1.b)

Use spherical coordinates to get a quick evaluation of
       \(∫\_\%\(∫\_\%\(∫\_\(\ R\_xyz\)\%\ 
            \((x\^2 + \ y\^2)\) dx dy 
              dz\)\)\)
where (Subscript[R, xyz]) is the sphere of radius 0.1 centered on {2, 5, 0}.

Go with spherical coordinates based at {2, 5, 0} and calculate the volume conversion factor:

center = {2, 5, 0}; \(Clear[x, y, z, r, s, t]; 
    
{x[r_, s_, t_], y[r_, s_, t_], z[r_, s_, t_]} = 
      center + {r\ Sin[s]\ Cos[t], r\ Sin[s]\ Sin[t], r\ Cos[s]}; 

    \({{rlow, rhigh}, {slow, shigh}, {tlow, thigh}} = {{0, 0.1}, {0, π}, {
          0, 2\ π}}; \)\)\(Clear[gradx, grady, gradz, Vxyz]; 

    gradx[r_, s_, t_] = {D[x[r, s, t], r], D[x[r, s, t], s], 
        D[x[r, s, t], t]}; 

    grady[r_, s_, t_] = {D[y[r, s, t], r], D[y[r, s, t], s], 
        D[y[r, s, t], t]}; 

    gradz[r_, s_, t_] = {D[z[r, s, t], r], D[z[r, s, t], s], 
        D[z[r, s, t], t]}; 

    Vxyz[r_, s_, t_] = 
      TrigExpand[Det[{gradx[r, s, t], grady[r, s, t], gradz[r, s, t]}]]\)

Because you are going with 0 ≤ s ≤ π, you know that (r^2) Sin[s] can never go negative, so you don't have to multiply by -1.
Now you are ready to calculate 
       \(∫\_\%\(∫\_\%\(∫\_\(\ R\_xyz\)\%\ 
            \((x\^2 + \ y\^2)\) dx dy 
              dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              \((x[r, s, t]\^2 + \ y[r, s, t]\^2)\) V\_xyz[r, s, t] 
                dr ds 
                dt\)\)\)\)
        = 
        (∫_tlow^thigh)
            (∫_slow^shigh)
              (∫_rlow^rhigh)(x[r, s, t]^2 + y[r, s, t]^2) 
                (Subscript[V, xyz])[r, s, t] dr ds 
                dt

(∫_tlow^thigh)
        (∫_slow^shigh)
          (∫_rlow^rhigh)
            (x[r, s, t]^2 + y[r, s, t]^2) Vxyz[r, s, t] 
            \[DifferentialD]r \[DifferentialD]s \[DifferentialD]t

Routine stuff.

T.1.c.i)

Look at this:

\(Clear[x, y, z, r, s, t]; 
    
{x[r_, s_, t_], y[r_, s_, t_], z[r_, s_, t_]} = {2\ r\ Sin[s]\ Cos[t], 
        5\ r\ Sin[s]\ Sin[t], 3\ r\ Cos[s]}; 

    \({{slow, shigh}, {tlow, thigh}} = {{0, π}, {0, 2\ π}}; \)\)Clear[plotter]; plotter[s_, t_] = {x[1, s, t], y[1, s, t], z[1, s, t]}; ParametricPlot3D[
      Evaluate[plotter[s, t]], {s, slow, shigh}, {t, tlow, thigh}, 
      Boxed -> False, BoxRatios -> Automatic, 
      ViewPoint -> CMView, 
      AxesLabel -> {"x", "y", "z"}];

What do folks call this skin?

It all depends on who you are talking to. 
Common-sense folks call it an egg. 
Fancy folks call it an ellipsoid.

T.1.c.ii)

Agree that (Subscript[R, xyz]) is everything inside and on the skin plotted in part i) above. Calculate
       \(∫\_\%\(∫\_\%\(∫\_\(\ R\_xyz\)\%\ 
            \((x\^2 + \ y\^2 + \ z\^2)\) dx dy 
              dz\)\)\).

You plotted this skin by going with
       {x[r, s, t], y[r, s, t], z[r, s, t]}
        = {2  r Sin[s] Cos[t], 5  r Sin[s] Sin[t], 3  r Cos[s]}
and keeping r = 1, running s from slow to shigh and running t from tlow to thigh. 
Remembering that (Subscript[R, xyz]) is everything inside and on this skin, you see that you can describe (Subscript[R, xyz]) with
       {x[r, s, t], y[r, s, t], z[r, s, t]}
        = {2  r Sin[s] Cos[t], 5  r Sin[s] Sin[t], 3  r Cos[s]}
by running r from 0 to 1, running s from slow to shigh, and running t from to tlow to thigh.
In short,
       \(∫\_\%\(∫\_\%\(∫\_\(\ R\_xyz\)\%\ 
            \((x\^2 + \ y\^2 + \ z\^2)\) dx dy 
              dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              \((x[r, s, t]\^2 + \ y[r, s, t]\^2 + \ z[r, s, t]\^2)
                \)\)\)\)\)\(					\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
      \ \ \ \ \ \ \ \ 
      V\_xyz[r, s, t]drdsdt
        \)
       \(\( = 
        ∫\_tlow\%thigh
            \(∫\_slow\%shigh\(∫\_\(\ 0\)\%1\ 
              \((x[r, s, t]\^2 + \ y[r, s, t]\^2 + \ z[r, s, t]\^2)
                \)\)\)\)\)\(					\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
      \ \ \ \ \ \ \ \ 
      V\_xyz[r, s, t]drdsdt
        \)                   

Calculate the volume conversion factor:

\(Clear[gradx, grady, gradz, Vxyz]; 

    gradx[r_, s_, t_] = {D[x[r, s, t], r], D[x[r, s, t], s], 
        D[x[r, s, t], t]}; 

    grady[r_, s_, t_] = {D[y[r, s, t], r], D[y[r, s, t], s], 
        D[y[r, s, t], t]}; 

    gradz[r_, s_, t_] = {D[z[r, s, t], r], D[z[r, s, t], s], 
        D[z[r, s, t], t]}; 
    Vxyz[r_, s_, t_] = 
      TrigExpand[Det[{gradx[r, s, t], grady[r, s, t], gradz[r, s, t]}]]\)

Here comes the calculation of 
       \(∫\_\%\(∫\_\%\(∫\_\(\ R\_xyz\)\%\ 
            \((x\^2 + \ y\^2 + \ z\^2)\) dx dy 
              dz\)\)\)
       \(\( = 
        ∫\_tlow\%thigh
            \(∫\_slow\%shigh\(∫\_\(\ 0\)\%1\ 
              \((x[r, s, t]\^2 + \ y[r, s, t]\^2 + \ z[r, s, t]\^2)
                \)\)\)\)\)\(					\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
      \ \ \ \ \ \ \ \ 
      V\_xyz[r, s, t]drdsdt\)

(∫_tlow^thigh)
        (∫_slow^shigh)
          (∫_0^1)
            (x[r, s, t]^2 + y[r, s, t]^2 + z[r, s, t]^2) 
              Vxyz[r, s, t] \[DifferentialD]r \[DifferentialD]s 
            \[DifferentialD]t

T.2)  Ice cream cones and tops

T.2.a.i) Ice cream cones

Here's an ice cream cone plotted in two steps:

\(Clear[x, y, z, r, s, t, radial]; 
x[r_, s_, t_] = r\ Sin[s]\ Cos[t]; 

    \(y[r_, s_, t_] = r\ Sin[s]\ Sin[t]; \)\)z[r_, s_, t_] = r Cos[s]; \(Clear[sideplotter]; 

    sideplotter[r_, t_] = {x[r, π\/6, t], y[r, π\/6, t], 
        z[r, π\/6, t]}; 

    \(side = ParametricPlot3D[
        Evaluate[sideplotter[r, t]], {r, 0, 3}, {t, 0, 2\ π}, 
        Boxed -> False, BoxRatios -> Automatic, 
        ViewPoint -> CMView, 
        AxesLabel -> {"x", "y", "z"}]; \)\)

\(Clear[capplotter]; 

    capplotter[s_, t_] = {x[3, s, t], y[3, s, t], z[3, s, t]}; 

    \(cap = ParametricPlot3D[
        Evaluate[capplotter[s, t]], {s, 0, π\/6}, {t, 0, 2\ π}, 
        Boxed -> False, BoxRatios -> Automatic, 
        ViewPoint -> CMView, 
        AxesLabel -> {"x", "y", "z"}]; \)\)

Here's the whole ice cream cone:

Show[cap, side, Boxed -> False, BoxRatios -> Automatic, 
      ViewPoint -> CMView, AxesLabel -> {"x", "y", "z"}];

Stingy serving.
Imagine that the ice cream is packed solidly all the way to the bottom, and measure the volume of the ice cream.

When you review the plotting instructions above, you find that you plotted the side by plotting
       {x[r, (π/6), t], y[r, (π/6), t], z[r, (π/6), t]}
with 0 ≤ r ≤ 3, and 0 ≤ t ≤ 2  π.
You also find that you plotted the cap by plotting
       {x[3, s, t], y[3, s, t], z[3, s, t]}
with 0 ≤ s ≤ (π/6), and 0 ≤ t ≤ 2  π.
When you go with
       0 ≤ r ≤ 3, 0 ≤ s ≤ (π/6), and 0 ≤ t ≤ 2  π,
the points
       {x[r, s, t], y[r, s, t], z[r, s, t]}
will sweep out the skin of the top and everything inside.
Call the skin of the top and everything inside by the name (Subscript[R, xyz]). 
To measure the volume of (Subscript[R, xyz]), all you gotta do is calculate
       \(volume = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\)\%\ 
              dx dy dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              V\_xyz[r, s, t] dr ds 
                dt\)\)\)\)
        = 
        (∫_0
            ^(2  π))(∫_0^((π/6)))(∫_0^3) 
              (Subscript[V, xyz])[r, s, t] dr ds 
                dt

\(Clear[gradx, grady, gradz, Vxyz]; 

    gradx[r_, s_, t_] = {D[x[r, s, t], r], D[x[r, s, t], s], 
        D[x[r, s, t], t]}; 

    grady[r_, s_, t_] = {D[y[r, s, t], r], D[y[r, s, t], s], 
        D[y[r, s, t], t]}; 

    gradz[r_, s_, t_] = {D[z[r, s, t], r], D[z[r, s, t], s], 
        D[z[r, s, t], t]}; 

    Vxyz[r_, s_, t_] = 
      TrigExpand[Det[{gradx[r, s, t], grady[r, s, t], gradz[r, s, t]}]]\)

Because 0 ≤ s ≤ (π/6), this can never be negative; so
       \(volume = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\)\%\ 
              dx dy dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              V\_xyz[r, s, t] dr ds 
                dt\)\)\)\)
        = 
        (∫_0
            ^(2  π))(∫_0^((π/6)))(∫_0^3) 
              (Subscript[V, xyz])[r, s, t] dr ds 
                dt
measures out to:

volume = 
      (∫_0
          ^(2 π))(∫_0
            ^((π/6)))(∫_0^3) Vxyz[r, s, t] \[DifferentialD]r 
              \[DifferentialD]s \[DifferentialD]t

That measurement is a bit too esoteric; check it out in plain decimal cubic units:

N[volume]

Very, very easy.
Once again, if you can plot something, you've got a really good chance of setting up the integral to measure its volume.

T.2.a.ii) Tops

You can use spherical coordinates to come up with your own custom-made coordinate systems.
Here's a sample involving a top. It's only a small variant of what you did in part a.i) above.

\(Clear[x, xx, y, yy, z, zz, r, s, t, radial]; 

    xx[r_, s_, t_] = r\ Sin[s]\ Cos[t]; 

    \(yy[r_, s_, t_] = r\ Sin[s]\ Sin[t]; \)\)zz[r_, s_, t_] = r Cos[s]; radial[s_] = 3 + (E^(-5 s)); {x[r_, s_, t_], y[r_, s_, t_], z[r_, s_, t_]} = {
        xx[r radial[s], s, t], yy[r radial[s], s, t], 
        zz[r radial[s], s, t]}; \(Clear[sideplotter, radial]; 
radial[s_] = 3 + E\^\(\(-5\)\ s\); 

    \(sideplotter[r_, t_] = {x[r, π\/6, t], y[r, π\/6, t], 
        z[r, π\/6, t]}; \)\)side = 
      ParametricPlot3D[
        Evaluate[sideplotter[r, t]], {r, 0, 1}, {t, 0, 2 π}, 
        Boxed -> False, BoxRatios -> Automatic, 
        ViewPoint -> CMView, 
        AxesLabel -> {"x", "y", "z"}];

\(Clear[capplotter]; 

    capplotter[s_, t_] = {x[1, s, t], y[1, s, t], z[1, s, t]}; 

    \(cap = ParametricPlot3D[
        Evaluate[capplotter[s, t]], {s, 0, π\/6}, {t, 0, 2\ π}, 
        Boxed -> False, BoxRatios -> Automatic, 
        ViewPoint -> CMView, 
        AxesLabel -> {"x", "y", "z"}]; \)\)

Here's the whole top:

Show[cap, side, Boxed -> False, BoxRatios -> Automatic, 
      ViewPoint -> CMView, AxesLabel -> {"x", "y", "z"}];

Spiffy.
Measure the volume inside this spinner.

When you review the plotting instructions above, you find that you plotted the side by plotting
       {x[r, (π/6), t], y[r, (π/6), t], z[r, (π/6), t]}
with 0 ≤ r ≤ 1 and 0 ≤ t ≤ 2  π.
You also find that you plotted the cap by plotting
       {x[1, s, t], y[1, s, t], z[1, s, t]}
with 0 ≤ s ≤ (π/6) and 0 ≤ t ≤ 2  π.
When you go with
       0 ≤ r ≤ 1, 0 ≤ s ≤ (π/6) and 0 ≤ t ≤ 2  π,
the points
       {x[r, s, t], y[r, s, t], z[r, s, t]}
sweep out the skin of the top and everything inside.
Call the skin of the top and everything inside (Subscript[R, xyz]). 
To measure the volume of (Subscript[R, xyz]), all you have to do is calculate
       \(volume = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\)\%\ 
              dx dy dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              V\_xyz[r, s, t] dr ds 
                dt\)\)\)\)
        = 
        (∫_0
            ^(2  π))(∫_0^((π/6)))(∫_0^1) 
              (Subscript[V, xyz])[r, s, t] dr ds 
                dt

\(Clear[gradx, grady, gradz, Vxyz]; 

    gradx[r_, s_, t_] = {D[x[r, s, t], r], D[x[r, s, t], s], 
        D[x[r, s, t], t]}; 

    grady[r_, s_, t_] = {D[y[r, s, t], r], D[y[r, s, t], s], 
        D[y[r, s, t], t]}; 

    gradz[r_, s_, t_] = {D[z[r, s, t], r], D[z[r, s, t], s], 
        D[z[r, s, t], t]}; 

    Vxyz[r_, s_, t_] = 
      TrigExpand[Det[{gradx[r, s, t], grady[r, s, t], gradz[r, s, t]}]]\)

Because 0 ≤ s ≤ (π/6), this can never be negative, so
       \(volume = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\)\%\ 
              dx dy dz\)\)\)
       \(\( = 
        ∫\_\%\(∫\_\%\(∫\_\(\ R\_rst\)\%\ 
              V\_xyz[r, s, t] dr ds 
                dt\)\)\)\)
        = 
        (∫_0
            ^(2  π))(∫_0^((π/6)))(∫_0^1) 
              (Subscript[V, xyz])[r, s, t] dr ds 
                dt
measures out to:

volume = 
      (∫_0
          ^(2 π))(∫_0
            ^((π/6)))(∫_0^1) Vxyz[r, s, t] \[DifferentialD]r 
              \[DifferentialD]s \[DifferentialD]t

That measurement is way too abstruse; check it out in plain decimal cubic units:

N[volume]

Easy.
Once again, if you can plot something, you've got a damn good chance of setting up the integral that measures its volume.

T.3)  Jennifer Phillips's flower

T.3.a)

When she was asked to do some art with spherical coordinates, 1992 Calculus&Mathematica student Jennifer Phillips responded with the flower you are about to see.  She commented, "I only did one, but I like it a lot." 
So will you.
Activate, enjoy, read her code, and think about what you too can do with spherical coordinates and tubes.

The bloom:

\(Clear[x, y, z, r, s, t]; 
x[r_, s_, t_] = r\ Sin[s]\ Cos[t]; 

    \(y[r_, s_, t_] = r\ Sin[s]\ Sin[t]; \)\)z[r_, s_, t_] = r Cos[s]; r[s_, t_] = 1.5 (1 - Sin[16 s]) + 0.5 (1 - Cos[4 t]); 
    bloom = 
      ParametricPlot3D[{x[r[s, t], s, t], y[r[s, t], s, t], 
          z[r[s, t], s, t]}, {s, 0, (π/2)}, {t, 0, 2 π}, 
        Axes -> None, ViewPoint -> CMView, Boxed -> False, 
        PlotRange -> All];

The stem:

Clear[s, P];
P[s_] = {-s, -2 s, (s^2)};
Clear[unittan, mainnormal, mainunitnormal, binormal, 
        secondunitnormal];
unittan[s_]=((P'[s])/(Sqrt[Expand[P'[s].P'[s]]]));

mainnormal[s_] = Together[D[unittan[s], s]];

mainunitnormal[s_] = 
        Simplify[mainnormal[s]/(Sqrt[mainnormal[s] . mainnormal[s]])];

binormal[s_] = Simplify[unittan[s]\[Cross]mainunitnormal[s]];
r = 0.3;

Clear[stem, t];
stem[s_, t_] = 
        Together[
            P[s] + r Cos[t] mainunitnormal[s] + r Sin[t] binormal[s]] + {
            2, 4, -4};

stemplot = 
        ParametricPlot3D[stem[s, t], {s, 0, 2}, {t, 0, 2 π}, 
          Axes -> None, ViewPoint -> CMView, Boxed -> False, 
          PlotRange -> All];

A leaf:

\(Clear[x, y, z, r, s, t]; 
x[r_, s_, t_] = r\ Sin[s]\ Cos[t] + 2; 

    \(y[r_, s_, t_] = r\ Sin[s]\ Sin[t] - 2; \)\)z[r_, s_, t_] = r Cos[s] + 2; r[s_] = 3.3 (1 - Sin[2 s]); leaf = 
      ParametricPlot3D[{z[r[s], s, t], x[r[s], s, t], y[r[s], s, t]}, {s, 0, 
          (π/4)}, {t, 0, π}, Axes -> None, 
        ViewPoint -> CMView, Boxed -> False, 
        PlotRange -> All];

All together:

Show[bloom, stemplot, leaf, Axes -> None, 
      ViewPoint -> CMView, Boxed -> False, PlotRange -> All];

Exquisite.
Way to go, Jennifer!