// pdf version of this animation: fig0180.pdf
import labelpath;
import animate;
animation A;
texpreamble("\usepackage[dvips,pdfpagemode=FullScreen]{hyperref}");
settings.outformat="pdf";
settings.tex="pdflatex";
defaultpen(fontsize(12pt));
size(16cm,0);
usepackage("mathrsfs, amsfonts,amsmath,amssymb");
picture pic, pic1, pic2, pic3;
real u=1, Y=2*pi+0.5;
pair yM=(u,Y*u), ym=(u,-Y*u);
path cle=scale(u)*unitcircle;
path arcg=arc((0,0),1.5*u,115,155);
void addtick(picture pic=currentpicture, Label L, pair z, pair dir=E, pen p=currentpen)
{
transform R=rotate(degrees(dir));
real width=1.5mm;
Label L=L.copy();
L.position(z);
L.align(NoAlign,E);
L.align.dir=R*L.align.dir*1.3*width/mm;
L.p(p);
pic.add(new void(frame f, transform t) {
path g=(-width,0)--(width,0);
picture opic;
draw(opic,shift(t*z)*R*g,p);
add(f,opic.fit());
});
add(pic,L);
}
path roll(picture pic=currentpicture, real x, int nb=50)
{
real stp=x/(nb-1);
return operator --(...
sequence(new guide(int t){
real tt=t*stp;
return shift(expi(tt))*((x-tt)*(-sin(tt),cos(tt)));
},nb));
}
pair EW(int sign){return sign > 0 ? E : W;}
string pm(int sign){return sign > 0 ? "" : "-";}
pen p(int sign){return sign > 0 ? red : blue;}
pen pw(int sign){return p(sign)+(sign > 0 ? currentpen : white);}
// Define common picture
draw(scale(1.25)*"+", arcg, Arrow());
dot("$0$", point(cle,0));
draw((-u,0)--(u,0)^^(0,-u)--(0,u));
draw("$1$",(0,0)--point(cle,1.5),Arrows(FillDraw(white)));
pic.add(currentpicture);// Save the common picture in 'pic'.
// Starting picture 1
draw((u,0)--yM, linewidth(bp)+p(1), Arrow(TeXHead));
draw(ym--(u,0), linewidth(bp)+p(-1));
arrow("\underline{Axe des réels}",(u,-0.75*Y*u),W,1cm);
real x=2.2, y=-x, maxe=2*pi+0.2;
addtick(Label("$1$",align=E), (u,1), p(1));
addtick(Label("$\frac{\pi}{2}$",align=E), (u,pi/2), p(1));
addtick(Label("$\pi$",align=E), (u,pi), p(1));
addtick(Label("$\frac{3\pi}{2}$",align=E), (u,3pi/2), p(1));
addtick(Label("$2\pi$",align=E), (u,2pi), p(1));
addtick(Label("$-1$",align=W), (u,-1), p(-1));
addtick(Label("$-\frac{\pi}{2}$",align=W), (u,-pi/2), p(-1));
addtick(Label("$-\pi$",align=W), (u,-pi), p(-1));
addtick(Label("$-\frac{3\pi}{2}$",align=W), (u,-3pi/2), p(-1));
addtick(Label("$-2\pi$",align=W), (u,-2pi), p(-1));
draw(Label("$\mathscr{C}$",Relative(0.625)), cle,linewidth(bp));
A.add();
erase();
// Define the common picture for rolling part.
picture picanim(int sign)
{
picture opic=pic.copy();
pen pmoins=sign > 0 ? p(-1) : p(-1)+white;
draw(opic, (u,0)--yM, bp+white+p(1), Arrow(TeXHead));
draw(opic, ym--(u,0), linewidth(bp)+pmoins);
arrow(opic,"\underline{Axe des réels}", (u,-0.75*Y*u), W, 1cm);
addtick(opic, Label("$1$",align=E), (u,1), white+p(1));
addtick(opic, Label("$\frac{\pi}{2}$",align=E), (u,pi/2), white+p(1));
addtick(opic, Label("$\pi$",align=E), (u,pi), white+p(1));
addtick(opic, Label("$\frac{3\pi}{2}$",align=E), (u,3pi/2), white+p(1));
addtick(opic, Label("$2\pi$",align=E), (u,2*pi), white+p(1));
addtick(opic, Label("$-1$",align=W), (u,-1), pmoins);
addtick(opic, Label("$-\frac{\pi}{2}$",align=W), (u,-pi/2), pmoins);
addtick(opic, Label("$-\pi$",align=W), (u,-pi), pmoins);
addtick(opic, Label("$-\frac{3\pi}{2}$",align=W), (u,-3pi/2), pmoins);
addtick(opic, Label("$-2\pi$",align=W), (u,-2*pi), pmoins);
return opic;
}
erase();
pic2=picanim(1);
int nb=50; // Number of picture for rolling.
real step=maxe/nb;
for (int sign=1; sign > -2; sign -= 2) {// Rolling axis part (1 for positive values, -1 for ...);
guide r1,rpis2, rpi, rpi32, rpi2;
pair z;
for (int i=0; i <= nb ; ++i) {
real t=sign*i*step; // Where is the tangency.
if(sign > 0) draw(Label("$\mathscr{C}$",Relative(0.625)), cle,linewidth(bp));
path tg=i == nb ? cle : arc((0,0),u,0,degrees(t)); // The rolled part.
path g=u*expi(t)--shift(u*expi(t))*((Y-abs(t))*u*expi(sign*pi/2+t)); // The straight part.
draw(g,linewidth(bp)+p(sign), sign > 0 ? Arrow(TeXHead) : None);
if(t > 0) {
if(abs(t) <= 1) {
z=arcpoint(g, (1-abs(t))*u);
addtick(Label(pm(sign)+"$1$",align=EW(sign)), z, expi(sign), p(sign));
r1=r1..z;
} else addtick(Label(pm(sign)+"$1$",align=EW(sign), UnFill),
u*(cos(sign),sin(sign)), dir(degrees(sign*1.0)), p(sign));}
draw(r1, dashed+p(sign));
if(abs(t) <= pi/2) {
z=arcpoint(g,(pi/2-abs(t))*u);
addtick(Label("$"+pm(sign)+"\frac{\pi}{2}$",align=EW(sign)), z, expi(t), p(sign));
rpis2=rpis2..z;
} else addtick(Label("$"+pm(sign)+"\frac{\pi}{2}$",align=EW(sign), UnFill),
(0,sign*u), sign*N, p(sign));
draw(rpis2, dashed+p(sign));
if(abs(t) <= pi) {
z=arcpoint(g,(pi-abs(t))*u);
addtick(Label("$"+pm(sign)+"\pi$",align=EW(sign)), z, expi(t), p(sign));
rpi=rpi..z;
} else addtick(Label("$"+pm(sign)+"\pi$",align=EW(sign), UnFill),
(-u,0), W, p(sign));
draw(rpi,dashed);
if(abs(t) <= 3*pi/2) {
z=arcpoint(g,(3pi/2-abs(t))*u);
addtick(Label("$"+pm(sign)+"\frac{3\pi}{2}$",align=EW(sign)), z, expi(t), p(sign));
rpi32=rpi32..z;
} else addtick(Label("$"+pm(sign)+"\frac{3\pi}{2}$",align=EW(sign), UnFill),
(0,-sign*u), sign*S, p(sign));
draw(rpi32, dashed+p(sign));
if(abs(t)-2*pi < -1e-5) {
z=arcpoint(g,(2*pi-abs(t))*u);
addtick(Label("$"+pm(sign)+"2\pi$",align=EW(sign)), z, expi(t), p(sign));
rpi2=rpi2..z;
} else addtick(Label("$"+pm(sign)+"2\pi$",align=(sign > 0 ? 2 : 1)*EW(sign), UnFill),
(u,0), E, p(sign));
draw(rpi2, dashed+p(sign));
if(i == nb && sign == 1) {
draw(tg,linewidth(2*bp)+p(sign));
pic3.add(currentpicture);
add(pic2);
pic2=picanim(-1);
pic2.add(pic3);
} else add(pic2); // Add the common picture 'pic2'.
draw(tg,linewidth(bp)+p(sign));
A.add();
if(sign > 0 || i != nb) erase();
}
}
for (int i=0; i < 10; ++i) A.add();
clip(scale(1.6)*cle);
for (int i=0; i < 10; ++i) A.add();
eval(quote{
addtick(Label("$-\pi$",align=EW(-1), UnFill), (-u,0), W, p(-1));
addtick(Label("$-2\pi$",align=EW(-1), UnFill), (u,0), E, p(-1));
defaultfilename='temp_';
shipout(currentpicture.fit(scale(2cm)));},true);
pair center=(min(currentpicture)+max(currentpicture))/2;
int n=20;
for (int i=0; i <= n; ++i) {
erase();
label(scale(1+1.25*i/n)*graphic("temp_.pdf"),i/n*center);
A.add();
}
for (int i=0; i < 20; ++i) A.add();
for (int i=0; i < 10; ++i) A.add(A.pictures[0]); // Add the first picture in the animation.
A.movie();