2007年12月7日星期五

矢量绘图语言Asymptote(一)

Asymptote是从MetaPost扩展而来的矢量数学绘图语言。它使用浮点数运算,支持三维图形,使用类似C++语法。Asymptote的很多语法和MetaPost类似,但是也有不同。下面简单介绍它的使用方法。假设Asymptote命令存在文件test.asy中,则执行下面的命令可以生成eps文件:
asy -V test
其中-V参数会自动打开一个PostScript浏览窗口,这样可以立即浏览生成的图形。
  1. 简单直线图形
    Asymptote代码生成的图像
    draw((0,0)--(100,0)--(100,100)
    --(0,100)--cycle);
    size(0,3cm);
    draw(unitsquare);
    unitsize(2cm,3cm);
    draw(unitsquare);
    label("$A$",(0,0),SW);
    label("$B$",(1,0),SE);
    label("$C$",(1,1),NE);
    label("$D$",(0,1),NW);
  2. 曲线图形
    Asymptote代码生成的图像
    draw((0,0){up}..(100,25){right}..(200,0){down});
    draw((0,0){up}::(100,25){right}::(200,0){down});
    size(0,100);
    path unitcircle=E..N..W..S..cycle;
    path g=scale(2)*unitcircle;
    filldraw(unitcircle^^reverse(g),yellow,black);
    size(200);
    
    real mexican(real x)
    {return (1-8x^2)*exp(-(4x^2));}
    
    int n=30;
    real a=1.5;
    real width=2a/n;
    
    guide hat;
    path solved;
    
    for (int i=0; i<n; ++i) {
      real t=-a+i*width;
      pair z=(t,mexican(t));
      hat=hat..z;
      solved=solved..z;
    }
    
    draw(hat);
    dot(hat,red);
    draw(solved,dashed);
  3. graph module
    Asymptote代码生成的图像
    import graph;
    size(150,0);
    
    real f(real x) {return exp(x);}
    pair F(real x) {return (x,f(x));}
    
    xaxis("$x$");
    yaxis("$y$",0);
    
    draw(graph(f,-4,2,operator ..),red);
    
    labely(1,E);
    label("$e^x$",F(1),SE);