#include "i_figureeight.h"

extern int n_strips;

TwoJetVec FigureEight(
  TwoJetVec w, TwoJetVec h, TwoJetVec bend, TwoJet form, TwoJet v
) {
  TwoJet height;
  v %= 1;
  height = (Cos (v*2) + -1) * (-1);
  if (v > 0.25 && v < 0.75)
    height = height*-1 + 4;
  height = height*0.6;
  h = h + bend*(height*height*(1/64.));
  return
    w*Sin (v*2) + (h) * (Interpolate((Cos (v) + -1) * (-2), height, form))
  ;
}

TwoJetVec AddFigureEight(ThreeJetVec p, ThreeJet u, TwoJet v, ThreeJet form, ThreeJet scale)
{
  ThreeJet size = form*scale;
  form = form*2 + form*form*-1;
  TwoJetVec dv = AnnihilateVec(D(p, 1), 1);
  p = AnnihilateVec(p, 1);
  TwoJetVec du = Normalize(D(p, 0));
  TwoJetVec h = Normalize(Cross(du, dv))*TwoJet(size);
  TwoJetVec w = Normalize(Cross(h, du))*(TwoJet(size)*1.1);
  return RotateZ(
    TwoJetVec(p) +
      FigureEight(w, h, du*D(size, 0)*(D(u, 0)^((double)-1)), form, v),
    v*(1./n_strips)
  );
}
