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