Asymptoteでアニメーションを作る

Asymptoteでアニメーションをつくってみた。

赤い四角形が360°回転する

import animation;
size(10cm);

animation A;
path a=unitsquare;
for(real i=0;i<360;i+=10){
  save();
  draw(rotate(i)*a,red);
  A.add();
  restore();
}

A.movie();

ラベル付きの正三角形を120°まわす。

import animation;
size(5cm);
animation A;

path triangle=(0,1)--rotate(120)*(0,1)--rotate(-120)*(0,1)--cycle;

for (real i=0; i<=120; i+=5){
  save();
  draw(rotate(i)*triangle);
  label("A",rotate(i)*(0,1),red);
  label("B",rotate(i)*rotate(120)*(0,1),green);
  label("C",rotate(i)*rotate(-120)*(0,1),blue);
  A.add();
  restore();
}
A.movie();

ラベル付の立方体をZ軸を中心に回す

倍率の変動を止めるために2の座標に白点をおいてしまっている。
他にやり方を知らないorz

import animation;
import bsp;
size(10cm);
animation A;

triple a1=(1,1,1);
triple a2=(-1,-1,-1);
triple b1=(-1,1,1);
triple b2=(1,-1,-1);
triple c1=(1,1,-1);
triple c2=(-1,-1,1);
triple d1=(1,-1,1);
triple d2=(-1,1,-1);

currentprojection=perspective(6,5,3);
transform3 h=scale3(2.0);
draw(h*a1,white);
draw(h*a2,white);
draw(h*b1,white);
draw(h*b2,white);
draw(h*c1,white);
draw(h*c2,white);
draw(h*d1,white);
draw(h*d2,white);

triple mid=(-1,0,1);
/*
#i<=120|240
triple mid=(1,1,1);
triple mid=(-1,1,1);
triple mid=(1,-1,1);
triple mid=(-1,-1,1);
#i<=90 | 180 | 270
triple mid=(0,0,1);
triple mid=(0,1,0);
triple mid=(1,0,0);
#i<=180
triple mid=(0,1,1);
triple mid=(1,0,1);
triple mid=(1,1,0);
triple mid=(1,-1,0);
triple mid=(1,0,-1);
triple mid=(-1,0,1);
*/

for (real i=0; i<=180; i+=5){
  save();
  transform3 r=rotate(i,mid);
  transform3 k=scale3(1.1);
  draw(r*(mid--scale3(-1)*mid));
  label("o",k*r*mid);
  label("o",k*r*scale3(-1)*mid);
  draw(r*(a1--a2),red+2);
  draw(r*(b1--b2),green+2);
  draw(r*(c1--c2),blue+2);
  draw(r*(d1--d2),purple+2);
  draw(r*shift(-1,-1,-1)*scale3(2)*unitbox,gray);
  label("1",k*r*a1,red);
  label("1",k*r*a2,red);
  label("2",k*r*b1,green);
  label("2",k*r*b2,green);
  label("3",k*r*c1,blue);
  label("3",k*r*c2,blue);
  label("4",k*r*d1,purple);
  label("4",k*r*d2,purple);
  A.add();
  restore();
}
A.movie(delay=100);

/*
A.movie(loops=10,delay=50);
*/

追記 2009/03/10 09:45:14:

size(10cm)->size(10cm,10cm,10cm)とするとエラーが止まる。