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

double tmax(1), tmin(-1), k(0.2);

P fa(double t)
{
  return P(k*t*t*t, t);
}

P fb(double t)
{
  return P(-k*t*t*t, t);
}

P fc(double t)
{
  return P(k*t*t, t);
}

P fd(double t)
{
  return P(-k*t*t, t);
}

void place(const screen& scr, double t)
{
  P loc(t, 0.6), dX(0.08, 0.4);
  inset(scr, loc - dX, loc + dX);
}

int main()
{
  picture(P(0, 0), P(2, 1), "4.5 x 2.25in");

  begin();
  P pO(0,0), pX(xmax(), 0), pY(0, ymax()), tail, head;

  bold();

  line(pO, pX);
  line(pO, pY);

  label(pO, P(0, -4), "$O$", b);
  label(pX, P(0, -4), "$X$", b);
  label(pY, P(-2, 0), "$Y$", l);

  screen scr1(P(-k, -1), P(k, 1)), scr2(P(-k, -1), P(k, 1)),
    scr3(P(-k, -1), P(k, 1)), scr4(P(-k, -1), P(k, 1));

  // (a)
  activate(scr1);
  tail = fa(tmin);
  head = fa(tmax);

  line(tail&E_1, head&E_1);
  line(P(0, tmin), P(0, tmax));

  line(tail, tail&E_1);
  line(head, head&E_1);

  plot(fa, tmin, tmax, 40);
  label(P(0,0), P(-2,2), "$P$", tl);

  label(tail, P(-2,0), "$Q$", bl);
  label(head, P( 2, 0), "$Q$", tr);

  label(tail&E_1, P(-2,0), "$R$", l);
  label(head&E_1, P( 2,0), "$R$", r);

  label(P(0, -1), P(0, -12), "(\\textit{a})", b);
  deactivate(scr1);

  // (b)
  activate(scr2);
  tail = fb(tmin);
  head = fb(tmax);

  line(tail&E_1, head&E_1);
  line(P(0, tmin), P(0, tmax));

  line(tail, tail&E_1);
  line(head, head&E_1);

  plot(fb, tmin, tmax, 40);
  label(P(0,0), P(2,2), "$P$", tr);

  label(tail, P( 2,0), "$Q$", br);
  label(head, P(-2, 0), "$Q$", tl);

  label(tail&E_1, P( 2,0), "$R$", r);
  label(head&E_1, P(-2,0), "$R$", l);

  label(P(0, -1), P(0, -12), "(\\textit{b})", b);
  deactivate(scr2);

  // (c)
  tmax = 0.9;
  k = 0.3;
  activate(scr3);
  tail = fc(tmin);
  head = fc(tmax);

  line(P(0,0), tail&E_1);
  line(P(0, tmin), P(0, tmax));

  line(tail, tail&E_1);
  line(head, head&E_1);

  plot(fc, tmin, tmax, 40);
  label(P(0,0), P(-2,0), "$P$", l);

  label(tail, P(2,0), "$Q$", br);
  label(head, P(2, 0), "$Q$", tr);

  label(tail&E_1, P(2,0), "$R$", r);
  label(head&E_1, P(-2,2), "$R$", tl);

  label(P(0, -1), P(0, -12), "(\\textit{c})", b);
  deactivate(scr3);

  // (d)
  activate(scr4);
  tail = fd(tmin);
  head = fd(tmax);

  line(P(0,0), tail&E_1);
  line(P(0, tmin), P(0, tmax));

  line(tail, tail&E_1);
  line(head, head&E_1);

  plot(fd, tmin, tmax, 40);
  label(P(0,0), P(2,0), "$P$", r);

  label(tail, P(-2,0), "$Q$", bl);
  label(head, P(-2, 0), "$Q$", tl);

  label(tail&E_1, P(-2,0), "$R$", l);
  label(head&E_1, P( 2,2), "$R$", tr);

  label(P(0, -1), P(0, -12), "(\\textit{d})", b);
  deactivate(scr4);

  place(scr1, 0.25);
  place(scr2, 0.75);
  place(scr3, 1.25);
  place(scr4, 1.75);

  tikz_format();
  end();
}
