/* -*-ePiX-*- */
#include "epix.h"
using namespace ePiX;

// MAX^2 = radius of plot
const double MAX(1.5);

// complex square root in polar coordinates
P f(double u, double v)
{
  return P(u*u*Cos(v), u*u*Sin(v), u*Cos(0.5*v));
}

// restrictions of sqrt to real axis, unit circle
P sqrt_re(double t) { return f(t,0); }
P sqrt_im(double t) { return f(1,t); }

int main() {
  picture(P(-4, -4), P(4, 2), "4x3in");

  begin();

  camera.filter(RGB_Neutral());

  backing(Magenta(0.1));
  set_crop();

  revolutions();
  label(P(xmin(), ymax()), P(2,-2), "Branches of $\\sqrt{z}$", br);

  camera.at(6, -2, 2);
  camera.range(4);
  domain R(P(0,0), P(MAX,2), mesh(16, 80), mesh(16, 160));

  // transparent branch
  pen(Green(0.7), "0.15pt");
  scenery surf(f, R.resize2(1,2));

  fill(White(0.7));
  pen(Black());
  // opaque branch
  surf.add(f, R.resize2(0,1));

  surf.draw();
  nofill();
  // boundary curve, unit circle, axes, grid, labels
  bbold(Red());

  plot(sqrt_re, -MAX, 0, 30);

  bold(Blue());
  arrow(P(0,0,0), P(2,0,0));
  arrow(P(0,0,0), P(0,2,0));

  label_color(Blue());
  label(P(2,0,0), P(0,-4), "$\\mathrm{Re}\\,z$", b);
  label(P(0,2,0), P(4, 0), "$\\mathrm{Im}\\,z$", r);

  bbold(Yellow());
  plot(sqrt_re, 0, MAX, 30);

  pst_format();
  end();
}
