1 #include "i_figureeight.h"
2 
3 extern int n_strips;
4 
FigureEight(TwoJetVec w,TwoJetVec h,TwoJetVec bend,TwoJet form,TwoJet v)5 TwoJetVec FigureEight(
6   TwoJetVec w, TwoJetVec h, TwoJetVec bend, TwoJet form, TwoJet v
7 ) {
8   TwoJet height;
9   v %= 1;
10   height = (Cos (v*2) + -1) * (-1);
11   if (v > 0.25 && v < 0.75)
12     height = height*-1 + 4;
13   height = height*0.6;
14   h = h + bend*(height*height*(1/64.));
15   return
16     w*Sin (v*2) + (h) * (Interpolate((Cos (v) + -1) * (-2), height, form))
17   ;
18 }
19 
AddFigureEight(ThreeJetVec p,ThreeJet u,TwoJet v,ThreeJet form,ThreeJet scale)20 TwoJetVec AddFigureEight(ThreeJetVec p, ThreeJet u, TwoJet v, ThreeJet form, ThreeJet scale)
21 {
22   ThreeJet size = form*scale;
23   form = form*2 + form*form*-1;
24   TwoJetVec dv = AnnihilateVec(D(p, 1), 1);
25   p = AnnihilateVec(p, 1);
26   TwoJetVec du = Normalize(D(p, 0));
27   TwoJetVec h = Normalize(Cross(du, dv))*TwoJet(size);
28   TwoJetVec w = Normalize(Cross(h, du))*(TwoJet(size)*1.1);
29   return RotateZ(
30     TwoJetVec(p) +
31       FigureEight(w, h, du*D(size, 0)*(D(u, 0)^((double)-1)), form, v),
32     v*(1./n_strips)
33   );
34 }
35