bin[N_, k_] := Binomial[n, k] bezier[V_] := Block[{n, k, ut}, (n = Length[V] - 1; ut = Sum[V[[k + 1]] bin[n, k] t^k(1 - t)^(n - k), {k, 0, n}]; Return[ut])] dispbez[curve_] := ParametricPlot[curve, {t, 0, 1}, AspectRatio -> Automatic, Axes -> True] PP3[surfaces_] := param[surfaces, {t, 0, 1}, {alpha, 0, 2 Pi}, AspectRatio -> 1, Axes -> True, PlotRange -> All] /. param -> ParametricPlot3D VPO3[surfaces_, a_, b_, c_] := param[surfaces, {t, 0, 1}, {alpha, 0, 2Pi}, AspectRatio -> 1, ViewPoint -> {a, b, c}, Axes -> True] /. param -> ParametricPlot3D NPO3[surfaces_, a_, b_, c_] := param[surfaces, {t, 0, 1}, {alpha, 0, 2Pi}, AspectRatio -> 1, ViewPoint -> {a, b, c}, Axes -> False, Boxed -> False] /. param -> ParametricPlot3D R = bezier[{5, 3, 3, 2, 2, 1.6, 1, 1}] dispbez[{{5t, R}, {t, 0}}] mkspout[curve_, R_] := Block[{ut, y, z, dy, dz, L, X, Y, Z}, (X = R Cos[alpha]; y = curve[[1]]; z = curve[[2]]; dy = D[y, {t, 1}]; dz = D[z, {t, 1}]; L = Sqrt[dy^2 + dz^2]; Y = y - R Sin[alpha] dz/L; Z = z + R Sin[alpha] dy/L; Return[{X, Y, Z}])] revolve[curve_] := Block[{y, z}, (y = curve[[1]]; z = curve[[2]]; Return[{y Cos[alpha], y Sin[alpha], z}])] translate[obj_, a_, b_, c_] := Block[{x, y, z}, (x = obj[[1]]; y = obj[[2]]; z = obj[[3]]; Return[{x + a, y + b, z + c}])] stretch[obj_, a_, b_, c_] := Block[{x, y, z, ut}, (x = obj[[1]]; y = obj[[2]]; z = obj[[3]]; Return[{a x, b y, c z}])] body = revolve[{2 + Sin[2 Pi t], 2 Pi t}] PP3[body] spotdir = {{27, 259}, {117, 223}, {123, 166}, {152, 132}, {212, 134}, {237, 165}} CC = Map[Expand, bezier[spotdir]] SPOUT = mkspout[CC, 8 R] PP3[SPOUT] GA = stretch[SPOUT, .26, .13, -.07] VPO3[GA, 2, 2, 1] NPO3[{ translate[GA, 0, 20, 28], stretch[body, 10, 10, 4]}, 4, 2, 1] cap = {{0, 121}, {106, 118}, {139, 83}, {251, 91}, {313, 123}, {334, 161}, {254, 163}} dispbez[bezier[cap]] rcap = stretch[revolve[bezier[cap]], .06, .06, -.04] VPO3[stretch[rcap, 1, 1, .2], 1, 1, .05] NPO3[{translate[rcap, 0, 0, 30], translate[GA, 0, 20, 28], stretch[body, 10, 10, 4]}, 4, 2, 1] dish = {{6, 148}, {115, 153}, {252, 155}, {315, 122}, {348, 95}, {339, 168}, {193, 179}} dispbez[bezier[dish]] rdish = stretch[revolve[bezier[dish]], .1, .1, -.1] VPO3[stretch[rdish, 1, 1, .3], 1, 1, .1] NPO3[{ translate[rdish, 0, 0, 15], translate[rcap, 0, 0, 30], translate[GA, 0, 20, 28], stretch[body, 10, 10, 4]}, 4, 2, 1] tip = {{2, 247}, {20, 217}, {46, 209}, {52, 140}, {0, 150}} dispbez[bezier[tip]] trip = stretch[revolve[bezier[tip]], .1, .1, -.06] NPO3[{ translate[trip, 0, 0, 39.5], translate[rdish, 0, 0, 15], translate[rcap, 0, 0, 30], translate[GA, 0, 20 , 28], stretch[body, 10, 10, 4]}, 4, 2, 1] flip[obj_] := {-obj[[1]], -obj[[2]]} handle = Map[flip, {{52, 262}, {59, 208}, {208, 216}, {104, 71}, {4, 156}}] fandle=bezier[handle] dispbez[fandle] zap = mkspout[fandle, 12] NPO3[{ translate[stretch[zap,.2,.2,.1],0,-10,30], translate[trip, 0, 0, 39.5], translate[rdish, 0, 0, 15], translate[rcap, 0, 0, 30], translate[GA, 0, 20 , 28], stretch[body, 10, 10, 4]}, 4, 2, 1]