2012年3月20日火曜日

Asymptoteの練習2 三角形とその分割

コーシーの積分定理の証明中に出てくる三角形の図をAsymptoteを使って作図してみました。
未だに使い方がよくわかっていないのと、プログラミングの素養が全くないので
こんな図を書くのにも数時間かかってしまいました。

size(4cm);

defaultpen(fontsize(12pt));

int n=3;
pair[][] a = new pair[n][n];
path p=(-0.5,0)--(0.5,0);

// 三角形の頂点
a[0][0]=(3,7);
a[1][0]=(0,0);
a[2][0]=(8,3);

// 三角形の線分の中点
for(int i=1; i<n; ++i){
  for(int j=0; j<n; ++j){
    a[j%n][i]=(a[(j+1)%n][i-1]+a[(j+2)%n][i-1])/2;
  }
}


// 分割された三角形の辺の描画
for(int j=0; j<n; ++j){
  draw(a[j%n][0]--a[(j+2)%n][1],MidArrow(SimpleHead,3.5,angle=25));
  draw(a[j%n][1]--a[(j+2)%n][0],MidArrow(SimpleHead,3.5,angle=25));
  draw(a[j%n][1]--a[(j+2)%n][1]);
}

// 中央の三角形の矢印
for(int j=0; j<n; ++j){
draw(shift(a[j%n][2]+rotate(90)*(unit(a[(j+1)%n][1]-a[(j+2)%n][1])/3))*rotate(degrees(a[(j+1)%n][1]-a[(j+2)%n][1]))*p,Arrow(SimpleHead,3.5,angle=25));
draw(shift(a[j%n][2]+rotate(90)*(unit(a[(j+2)%n][1]-a[(j+1)%n][1])/3))*rotate(degrees(a[(j+2)%n][1]-a[(j+1)%n][1]))*p,Arrow(SimpleHead,3.5,angle=25));
}


label("$a$",a[0][0],N);
label("$b$",a[1][0],SW);
label("$c$",a[2][0],E);
label("$a^\prime$",a[0][1],0.1SE);
label("$b^\prime$",a[1][1],NE);
label("$c^\prime$",a[2][1],WNW);