% --- start of displayed preamble in the book ---

% --- end of displayed preamble in the book ---
defaultfont:="ptmr8r";
warningcheck:=0;
beginfig(1)
% Fraser's Spiral
% D. Roegel 29 April 2007

numeric u;
u=2.7cm;

vardef twisted_cord(expr i,twist,a,col)=
 save qa,qb,qc,P,ratio;
 path qa,qb,qc;
 pair P[];
 ratio=0.8;
 P1=A[i];
 P2=radius(i)*dir((1+i/2)*da);
 P3=radius(i)*dir((1+i/2-shift)*da);
 P5=B[i-1] rotated da;
 P6=radius(i)*dir((2+i/2)*da);
 P7=radius(i)*dir((2+i/2-shift)*da);
 P0=.5[P2,P7];
 P21=arclength((.5[ratio,1])[P1,P2]--origin)*unitvector(P0);
 P22=arclength((.5[ratio,1])[P5,P7]--origin)*unitvector(P0);

 P12=P2 rotatedaround(P0,twist);
 P13=P3 rotatedaround(P0,twist);
 P16=P6 rotatedaround(P0,twist);
 P17=P7 rotatedaround(P0,twist);
 P23=P21 rotatedaround(P0,twist);
 P24=P22 rotatedaround(P0,twist);


 P14=ratio[P1,P12];
 P18=ratio[P5,P17];

 qa=P1--P12--P13--cycle;
 qb=P5--P16--P17--cycle;
 qc=P14--P12...P24...P18--P17..P23..cycle;
 fill qa rotated a withcolor col;
 fill qb rotated a withcolor col;
 fill qc rotated a withcolor col;
enddef;

def circle(expr r)=
 fullcircle scaled 2r
enddef;

def radius(expr i)=
 (((i+10*i*i)/1000)*u)
enddef;

color cola,colb;
cola=.9(1,1,0);
colb=.8white;

cola:=.9(1,1,0);
colb:=.7green;

nc=16;
n=16;
da=360/n;
shift=0.4;
path p[];
pair A[],B[];

%beginfig(1);

 fill unitsquare shifted (-.5,-.5) scaled 3u withcolor cola;
 z0=origin ;
 if false:
 for i=1 upto nc:
   draw circle(radius(i));
 endfor;

 pickup pencircle scaled 5pt;
 for i=1 upto nc:
   for j=1 upto n:
     draw radius(i)*dir((j+i/2)*da) withcolor red;
     draw radius(i)*dir((j+i/2-shift)*da) withcolor green;
   endfor;
 endfor;

 pickup pencircle scaled .5;

 fi;


 p1=(radius(1)*dir((1+1/2-shift)*da))
 for i=2 upto nc:
   ..(radius(i)*dir((1+i/2-shift)*da))
 endfor;
 p2=p1 rotated (shift*da);
 p3=(radius(1)*dir((1+1/2-shift)*da))
 for i=2 upto nc:
   ..(radius(i)*dir((1-i/2-shift)*da))
 endfor;
 p4=p3 rotated (shift*da);

 if false:
 for j=1 upto n:
   draw p1 rotated (j*da);
   draw p2 rotated (j*da);
   draw p3 rotated (j*da);
   draw p4 rotated (j*da);
 endfor;
 fi;

 p5=p1--(reverse p2)--cycle;
 %fill p5 withcolor .8white;
 p6=p2--(reverse (p1 rotated da))--cycle;
 %fill p6 withcolor .8green;

 p7=p3--(reverse p4)--cycle;
 %fill p7 withcolor .8blue;
 p8=p4--(reverse (p3 rotated da))--cycle;
 %fill p8 withcolor .8red;

 for j=1 upto n:
   fill p7 rotated (j*da) withcolor colb;
 endfor;
 for j=1 upto n:
   fill p5 rotated (j*da) withcolor colb;
 endfor;


 pickup pencircle scaled 5pt;
 for i=1 upto nc-1:
   A[i]=p1 intersectionpoint (p4 rotated (i*da));
   B[i]=p2 intersectionpoint (p3 rotated (i*da+da));
   %draw A[i] withcolor (1,1,0);
   %draw B[i] withcolor (1,0,1);
 endfor;

 pickup pencircle scaled .5;
 for i=2 upto nc-1:
   for j=1 upto n:
     twisted_cord(i,3,j*da,(i/nc)[colb,black]);
   endfor;
 endfor;

 clip currentpicture to unitsquare shifted (-.5,-.5) scaled 3u;

 picture lab;
 % intentionally slightly shifted to the right
 lab=thelabel(btex Fraser's spiral etex,z0+.1u*right);
 unfill bbox lab;
 draw lab withcolor red;

%endfig;

%end

endfig;
end;