#include "epix2.h"
using namespace ePiX2;

Point torus(double u, double v)
{
  double r(0.5), R(1.+r*Cos(u));
  return Point(R*Cos(v), R*Sin(v), r*Sin(u));
}

Point f(double t)
{
  return torus(t/60.0, t/140.0);
  //return Point(Sin(0.02*M_PI*t), Sin(0.03*M_PI*t), Cos(0.01*M_PI*t));
}

Point g(double t)
{
  return torus(0.25+t/60.0, t/140.0);
  //return Point(Sin(0.02*M_PI*t), Sin(0.03*M_PI*t), Cos(0.01*M_PI*t));
}

int main() {

  World world;
  World layer;

  Camera camera;
  Picture picture(Pair(-2,-2), Pair(2,2), "6x6in");

  // Ink lt_green(Green(1.2)), dk_green(Green(0.6));
  Duo_Pen green(Green(1.2), "2pt", Green(0.6), "4pt");
  Duo_Pen blue(Blue(1.5), "2pt", Blue(0.8), "4pt");
  Duo_Pen neon(Red(1.5), "2pt", Red(0.6), "4pt");

  // border
  Polygon border(Vector(Origin, 2, 2, 0), Vector(Origin, -2, 2, 0), 4);
  layer << border;
  layer.photo(picture, camera);


  world << Circle().stroke(neon);
  rotations();

  for (int i=0; i<420; ++i)
    world << Segment(f(i), f(i+1)).stroke(green)
	  << Segment(g(i), g(i+1)).stroke(blue);

  camera.at(Point(2, 6, 3));

  world.fog(0.75,6);

  world.photo(picture, camera);
  picture.crop();

  print(picture, "knots.eepic", PSTricks());
}
