.PS
# Egg.m4
# https://tex.stackexchange.com/questions/74168/how-can-i-draw-an-egg-using-tikz
threeD_init
NeedDpicTools

define Eggshape { (0.78*cos(($2)/4)*sin($2),-cos($2))*($1) } # -pi < arg2 < pi

  size = 2
  npts = 41

  HL: Eggshape(size*0.4,-pi_*3/4)  # Highlight
  P: Eggshape(size,pi_/4)
  d = zabs(P)
  nlines = int(d/lthick*1.5)
                            # This way of blending colors is not the
                            # simplest for a single postprocessor but it
                            # works for multiple postprocessors, e.g. SVG
define(`Orange',`1,   0.5, 0')
define(`Gray',  `0.5, 0.5, 0.5')
define(`White', `1,   1,   1')

define(`eggblend',
 `sum3D(sprod3D($1,Orange),
  sum3D(sprod3D($2,White),
        sprod3D($3,Gray)))')

define(`normalize',`($1)/($1+$2+$3), ($2)/($1+$2+$3), ($3)/($1+$2+$3)')

define EggLine {
  for i=0 to npts do {
    P[i]: HL*(1-($1))+Eggshape(size*($1),i/npts*twopi_-pi_) }
  fitcurve(P,npts,outlined rgbstring($2,$3,$4))
  }

  ShadeObject(EggLine, nlines,
    0,    eggblend(normalize(0.3,    1,    0)),
    0.2,  eggblend(normalize(0.5,  0.5,    0)),
    0.5,  eggblend(normalize(0.5,  0.4,  0.2)),
    1,    eggblend(normalize(0.5,    0,  0.7))
    )

.PE
