Figure Asymptote animations -- 017

Show animations/fig0180.asy on Github.
Generated with Asymptote 3.00-0.
Categories : Animation
Tags : #Animation | #Label | #Geometry

import labelpath;
import animate;
animation A;

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);
}

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 reels}", (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 reels}", (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 < 20; ++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.

erase();

A.movie();