Asymptote简介

by 白云蓝天 on 12月 6, 2007

Asymptote学习系列
Asymptote学习系列(1)
Asymptote类似于Metapost 但是语法相对来说比较简单
面向对象 有自己的类C++语法。
软件主页:http://asymptote.sourceforge.net/
安装:
安装很简单,从主页上下载就可以了。如果是windows版的话,在asymptote的安装目录下,建config.asy,输入内容如下:
import settings;
psviewer=”D:\CTeX\Ghostgum\gsview\gsview32.exe”;
pdfviewer=”C:\Program Files\Adobe\Acrobat 7.0\Acrobat\acrobat.exe”;
gs=”D:\CTeX\gs\gs8.51\bin\gswin32.exe”;
python=”python.exe”;

简单测试
运行程序,在命令状态下输入:
>draw((0,0)–(100,100));
你应该就可以从一个启动的ghostview窗口中看到一条对角线了。

当然,你也可以把上面的命令写入一个文件,如test.asy,然后输入
asy -V test
然后你就可以看到目录上生成了test.eps文件,同时启动了一个ghostview窗口显示你的文件(-V参数的作用);

在asymptote中使用中文

//asymptote是一种矢量图形生成工具,提供了一种程序设计语
//言,语法类似C++,公式输入部分支持latex语法。
///////////////////////////////////////////////////////////////////////
texpreamble(“\usepackage{CJK}”);
texpreamble(“\AtBeginDocument{\begin{CJK}{UTF8}{song}}”);
texpreamble(“\AtEndDocument{\clearpage\end{CJK}}”);
///////////////////////////////////////////////////////////////////////

几个入门的例子

draw((0,0)–(100,100));

draw((0,0)–(100,0)–(100,100)–(0,100)–cycle);

size(101,101);
draw((0,0)–(1,0)–(1,1)–(0,1)–cycle);

size(0,3cm);
draw(unitsquare);
label(“$A$”,(0,0),SW);
label(“$B$”,(1,0),SE);
label(“$C$”,(1,1),NE);
label(“$D$”,(0,1),NW);
//S,W,E,N是标准的指南针方向

size(100,0);
draw((1,0){up}..{left}(0,1));

path unitcircle=E..N..W..S..cycle;

//The user can specify explicit control points between two nodes like this:
draw((0,0)..controls (0,100) and (100,100)..(100,0));

draw((100,0){curl 0}..(100,100)..{curl 0}(0,100));

draw((100,0)..tension 2 ..(100,100)..(0,100));
draw((100,0)..tension 2 and 1 ..(100,100)..(0,100));
draw((100,0)..tension atleast 1 ..(100,100)..(0,100));

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^^g,evenodd+yellow,black);

看看每一个的效果吧

Asymptote学习系列(3)
size和unitsize
参考: http://www.artofproblemsolving.com/Wiki/index.php/Asymptote:_Basics

asymptote是基于坐标的图形语言。每个点都表示为(a,b),其中a是x坐标,b是y坐标。

当然,在一个平面上,你可以任意选一个点作为原点,在两个坐标方向上选任意长度作为单位长度。asymptote会在整个作图完成后,自动地把图形调整到输出页面的中心,因此,原点是可以忽略的。在asymptote中,单位长度有个缺省的值1/72英寸(PostScript中一个大点的长度)。如果你不改变图形的缩放比例的话,在asymptote中,(0,0)点和(72,0)点之间就是正好1英寸的距离。如果你要画3cm和图的话,用这个单位就不是很方便。

函数unitsize可以用来指定你的图形的单位长度。如:
unitsize(72); // 当前图形的x,y的单位都是72*(1/72)英寸
unitsize(72,36); // 当前图形的x的单位都是72*(1/72)英寸, y方向是0.5英寸
unitsize(pic,72,36); //图形pic中的x的单位都是72*(1/72)英寸,y方向是0.5英寸
unitsize(3cm); //当前图形的x,y的单位都是3cm
asymptote中有些内定的常量:pt(1/72.72英寸),inch(英寸),cm,mm。运行过 unitsize(72)后,(0,0)到(72,0)间距离就变成了72英寸长度了。

函数size是用来指定你的图形最终的大小是多少。如:
size(5cm,0);
size(5cm,3cm);
size(5cm);
size命令把图形的最终大小给出来了,会忽略unitsize指定的单位大小。即
size(5cm);
unitsize(3cm);
draw(unitsquare);

size(5cm)
unitsize(5cm);
draw(unitsquare);
两组命令会得到同样大小的一个图形。
Asymptote学习系列(4)
基本的数据类型:

asymptote中的基本数据包括

bool 只有 true 和 false 两种状态 true,false,1>2(false)
string 字符串,由两个双引号包含 “HI”,”This is a string”
int 整数
real 浮点数
pair 由两个整数或浮点数组成的数对,表示坐标 (2,3),(2.3,9.0)
triple 由三个整数或浮点数组成的数对,表示坐标 (1,2,3),(4.5,2.3,9.0)
path 一条线,3次样条 (0,0)–(2,3) , (0,1)..(1,1)..(1,0)–cycle
guide 与path一样,只是在连接两个guide的时候,采用光滑连接
picture 由用户坐标表达的画布 currentpicture
frame 由PostScript坐标表达的画面 currentpicture
pen 画笔,由颜色、线型、粗细组成 currentpen , red+dashed , linetype(“6 4″)
void 只用于在函数声明中表示一个函数没有返回或参数
transform 变化,通过’*’号作用在任何可以画的目标上。
rotate(30),shift((2,3)),xscale(9)
Asymptote学习系列(5)
数据类型(续):

pair
pair是由两个实数组成的数对(x,y)。如果你定义了’pair z’, 则你可以用z.x,z.y来引用相应的分量,但不允许直接修改。如:
pair x=(2.0,3.0);
pair y=(x.x,-x.y);
pair z=x+3.0*y;
z.x=0.0; //这是不允许的
预定义的常量:
I=(0,1);
你可以用: z=z.x-I*z.y;
内置的相关函数:
pair conj(pair z)
返回 z 的梯度;
real length(pair z)
返回 z 的模长 |z| 。 如,
pair z=(3,4);
length(z);
结果为5。同样,可以用 abs(pair);
real angle(pair z)
返回z的角度(弧度),取值在 [-pi,pi];
real degrees(pair z, bool warn=true)
返回 z 的角度(度),取值在 [0,360) ;若 warn 为 false 且 z.x=z.y=0 时返回0而不是错误;
pair unit(pair z)
单位化 z ;
pair expi(real angle)
返回一个角度为angle(弧度)的单位向量;
pair dir(real angle)
返回一个角度为angle(度)的单位向量;
real xpart(pair z)
返回 z.x ;
real ypart(pair z)
返回 z.y;
pair realmult(pair z, pair w)
返回 (z.x*w.x,z.y*w.y);
real dot(pair z, pair w)
返回点积 z.x*w.x+z.y*w.y;
pair minbound(pair z, pair w)
返回 (min(z.x,w.x),min(z.y,w.y));
pair maxbound(pair z, pair w)
返回 (max(z.x,w.x),max(z.y,w.y)).

Asymptote学习系列(6)
数据类型(续):

triple
triple是由三个实数组成的数对(x,y,z)。如果你定义了’triple z’, 则你可以用z.x,z.y,z.z来引用相应的分量,但不允许直接修改。

一些内置函数:

real length(triple v)
返回 v 的长度 |v| 。出可以用 abs(triple) ;
real polar(triple v)
返回 v 与 z 轴的弧度;
real azimuth(triple v)
返回 v 与 x 轴的弧度;
real colatitude(triple v)
返回 v 与 z 轴的夹角(度);
real latitude(triple v)
返回 v 与 xy 平面的夹角(度);
real longitude(triple v, bool warn=true)
返回 v 与 x 轴的角度(度);当warn=false且v.x=v.y=0 时会返回0,而不是产生错误;
triple unit(triple v)
单位化向量 v ;
triple expi(real colatitude, real longitude)
返回方向为 (colatitude,longitude) (弧度)的单位向量;
measured in radians;
triple dir(real colatitude, real longitude)
返回方向为 (colatitude,longitude) (度)的单位向量;
real xpart(triple v)
返回 v.x;
real ypart(triple v)
返回 v.y;
real zpart(triple v)
返回 v.z;
real dot(triple u, triple v)
返回内积 u.x*v.x+u.y*v.y+u.z*v.z;
triple cross(triple u, triple v)
返回外积 (u.y*v.z-u.z*v.y,u.z*v.x-u.x*v.z,u.x*v.y-v.x*u.y);
triple minbound(triple u, triple v)
返回 (min(u.x,v.x),min(u.y,v.y),min(u.z,v.z));
triple maxbound(triple u, triple v)
返回 (max(u.x,v.x),max( u.y,v.y),max(u.z,v.z)).

Asymptote学习系列(7)
数据类型(续):

string
string字符串类,由STL string 类实现。与C/C++中的字符串是一致。
内置函数包括:
int length(string s)
int find(string s, string t, int pos=0)
int rfind(string s, string t, int pos=-1)
string insert(string s, int pos, string t)
string erase(string s, int pos, int n)
string substr(string s, int pos, int n=-1)
string reverse(string s)
string replace(string s, string before, string after)
string replace(string s, string[][] table)
string format(string s, int n)
string format(string s, real x)
string time(string format=”%a %b %d %T %Z %Y”)
time();
time(“%a %b %d %H:%M:%S %Z %Y”);
int seconds(string t=””, string format=””)
seconds(“Mar 02 11:12:36 AM PST 2007″,”%b %d %r PST %Y”);
seconds(time(“%b %d %r %z %Y”),”%b %d %r %z %Y”);
seconds(time(“%b %d %r %Z %Y”),”%b %d %r “+time(“%Z”)+” %Y”);
1+(seconds()-seconds(“Jan 1″,”%b %d”))/(24*60*60);
string time(int seconds, string format=”%a %b %d %T %Z %Y”)
string string(real x, int digits=realDigits)
abort(string s);

Asymptote学习系列(8)
数据类型(续):

guide 和 path
guide 和 path 都表示分段的三次曲线,参数t从0变化到n(也就是节点数)。不同的是,guide 是在最后画这前才计算出这条曲线,而path则是在定义的时候就计算好的。这样,guide在做两条曲线连接的时候,就可以得到光滑连接的曲线。
如下所示的例子:
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); 一个点也可以看作是一个长度为0的path,如: path p=(0,2); 构造一个path的最简单方法就是连接两个path或点,常用的算子有: p--q 表示用直线连接p的最后一个点和q的第一个点 p..q 表示用一条Bezier三次样条曲线来连接p和q,这样连接是光滑的 p^^q 它并不真正连接p和q,而是把它们从新参数化,从而使它们成为一条曲线,也就是说画笔从p的最后一个点移到q的第一个点然后再画 在构造path的时候,还可以显式指定控制点,曲率,方向,张力等,如: draw((0,0)..controls (0,100) and (100,100)..(100,0)); draw((100,0)..tension 2 ..(100,100)..(0,100)); // 张力 draw((100,0)..tension 2 and 1 ..(100,100)..(0,100)); draw((100,0)..tension atleast 1 ..(100,100)..(0,100)); draw((100,0){curl 0}..(100,100)..{curl 0}(0,100)); // 指定曲率,0表示直线,1表示圆弧 draw((0,0){up}::(100,25){right}::(200,0){down}); // ::是..tension at least 1.. draw((0,0){up}---(100,25){right}---(200,0){down}; //---表示..tension atleast infinite.. 常量: path unitcircle ; 常用的函数: path circle(pair c, real r); path Circle(pair c, real r, int n=400); //比circle更精确的圆 path arc(pair c, real r, real angle1, real angle2); path arc(pair c, explicit pair z1, explicit pair z2,bool direction=CCW) //CCW表示逆时针,CW表示顺时针 path Arc(pair c, real r, real angle1, real angle2,int n=400); //比arc更精确的圆弧 path ellipse(pair c, real a, real b); //椭圆 int length(path p); p由几个段组成,若p是个封闭的图形,则与p中的节点个数是一样的。 int size(path p); p的节点个数,若p是个封闭的图形,则与length(p)是相等的。 pair point(path p, int t); 若p是个封闭的图形,则返回节点 t mod length(p) 的坐标。否则,返回节点 t 的坐标,t<0时,返回节点0的坐标,t>length(p)时,则返回length(p)处的坐标。
pair point(path p, real t);
与前面类似,不同的是返回的是节点 floor(t) 和节点 floor(t)+1 之间的三次样条曲线在参数
t-floor(t) 处的坐标。若 t 在 [0,length(p)] 之外,且p是个封闭的图形,则先取模 length(p) ,否则,就取相应端点处的坐标。
pair dir(path p, int t, int sign=0);
若 sign < 0 ,返回 p 中节点 t 处的入流切线方向,若 sign > 0 ,则为出流切线方向,若 sign=0 ,则两个方向的平均。若 p 只含一个点,返回 (0,0) 。
pair dir(path p, real t);
返回 p 在节点 floor(t) 和 floor(t)+1 之间的样条曲线在参数 t-floor(t) 处的切线方向。若 p 只有一个点,则返回 (0,0) 。
pair precontrol(path p, int t);
返回 p 在节点 t 处的precontrol控制点。
pair precontrol(path p, real t);
返回 p 在 参数 t 处的有效precontrol控制点
pair postcontrol(path p, int t);
returns the postcontrol point of p at node t.
pair postcontrol(path p, real t);
returns the effective postcontrol point of p at parameter t.
real arclength(path p);
返回 p 的长度
real arctime(path p, real L);
返回从第一个节点开始达到 arclength 为 L 的参数值。
real dirtime(path p, pair z);
返回切线方向为 z 的参数值。若不存在的话,则返回-1。
real reltime(path p, real l);
returns the time on path p at the relative fraction l of its arclength.
pair relpoint(path p, real l);
returns the point on path p at the relative fraction l of its arclength.
pair midpoint(path p);
returns the point on path p at half of its arclength.
path reverse(path p);
返回一条沿 p 反向运动的path。
path subpath(path p, int a, int b);
返回沿 p 的第 a 个节点到第 b 个节点的子路径。若 a < b ,则为反向运动。 path subpath(path p, real a, real b); 与前面类似。 real[] intersect(path p, path q, real fuzz=0); 若 p 和 q 有至少一个交点,则返回一个长度为2的real型数组,其中是相应的路径参数(time)。若没有相交,则返回长度为0的数组。 pair intersectionpoint(path p, path q, real fuzz=0); 返回 p 和 q 的交点坐标: point(p,intersect(p,q,fuzz)[0]) 。 pair[] intersectionpoints(path p, path q); 返回 p 和 q 的所有交点。 slice firstcut(path p, path q); 返回 p 中 在 p 和 q 第一个交点的"前"和"后"两部分。若没有交点,则整个 path 看作是"前"部 struct slice { path before,after; } slice lastcut(path p, path q); 返回 p 中 在 p 和 q 最后一个交点的"前"和"后"两部分。若没有交点,则整个 path 看作是"后"部 path buildcycle(... path[] p); This returns the path surrounding a region bounded by a list of consecutively intersecting paths, following the behaviour of the MetaPost buildcycle command. pair min(path p); returns the pair (left,bottom) for the path bounding box of path p. pair max(path p); returns the pair (right,top) for the path bounding box of path p. bool cyclic(path p); 若 p 是封闭的,则返回 true。 bool straight(path p, int i); 若 p 中节点 i 和 i+1 之间是直线的话,则返回 true。 int windingnumber(path p, pair z); returns the winding number of the cyclic path g relative to the point z. The winding number is positive if the path encircles z in the counterclockwise direction. bool inside(path g, pair z, pen p=currentpen); 若 z 点在由封闭的 g 所包含的区域内的话,返回 true。 Asymptote学习系列(9) 数据类型(续): pen pen是个作图环境,它包括颜色、线型、粗细等,还有line join, fill rule, text alignment, font, font size,pattern, overwrite mode, 及 calligraphic transforms on the pen nib。pen之间可以用"+"号来融合,这会混合两种pen的颜色,对于其它的特性,则会用后面的替代前面的。如一支黄色的画点线的pen,可以用下面的任何一种方法得到: dotted+red+green red+green+dotted red+dotted+green 符号"*"作用到pen上表示对pen的颜色*相应的数,如: red*0.5 颜色 定义pen的颜色的函数包括: pen gray(real g); 灰度笔,其中 g 在 [0,1] 上,0.0 表示黑色,1.0 表示白色。 pen rgb(real r, real g, real b); 用 RGB 颜色构造 pen ,每个变量都在 [0,1] 间。 pen cmyk(real c, real m, real y, real k); 由 CMYK(cyan, magenta, yellow, black) 构造 pen ,同样每个变量在 [0,1] 间。 pen colorless(pen); 得到一个没有颜色的pen(可以用来避免颜色混合)。 real[] colors(pen) 得到pen的颜色的各个分量 一些常量: pen invisible; 不可见的pen,它会调节整个的边界。 还有如下预定义好的颜色可以用: palered,lightred,mediumred,red,heavyred,brown,darkbrown, palegreen,lightgreen,mediumgreen,green,heavygreen,deepgreen,darkgreen paleblue,lightblue,mediumblue,blue,heavyblue,deepblue,darkblue palecyan,lightcyan,mediumcyan,cyan,heavycyan,deepcyan,darkcyan pink,lightmagenta,mediummagenta,magenta,heavymagenta,deepmagenta,darkmagenta paleyellow,lightyellow,mediumyellow,yellow,lightolive,olive,darkolive palegray,lightgray,mediumgray,gray,heavygray,deepgray,darkgray black white orange fuchsia chartreuse springgreen purple royalblue Cyan Magenta Yellow Black cmyk+red cmyk+blue cmyk+green 线型 线型由函数定义: pen linetype(string s, real offset=0,bool scale=true, bool adjust=true) 其中 s 是由空格分开的整数或实数,如下是些预定义的量: pen solid=linetype(""); pen dotted=linetype("0 4"); pen dashed=linetype("8 8"); pen longdashed=linetype("24 8"); pen dashdotted=linetype("8 8 0 8"); pen longdashdotted=linetype("24 8 0 8"); pen Dotted=dotted+1.0; pen Dotted(pen p=currentpen) {return dotted+2*linewidth(p);} s 中的数中,第1个表示用pen画多长,第2个表示不用这个pen画多长,依次下去。 粗细 精细由函数定义: pen linewidth(real). 一支pen与实数的加法"+"定义为: static pen operator +(pen p, real w) {return p+linewidth(w);} static pen operator +(real w, pen p) {return linewidth(w)+p;} 如: pen p=red+1.0; 还有一些其它的特性,请参考帮助文件。 Asymptote学习系列(10) 数据类型(续): transform transform t=(t.x,t.y,t.xx,t.xy,t.yx,t.yy) 把一个点 pair (x,y) 变为点 (x',y') ,其中 x' = t.x + t.xx * x + t.xy * y y' = t.y + t.yx * x + t.yy * y 它和 PostScript 中的 transformation [t.xx t.yx t.xy t.yy t.x t.y] 是一样的。 另外,它可以通过[ * ]号从左边作用在pair、path、guide、pen、transform、frame 和 picture 上。transform 之间可以互相组合,还有个求逆的操作: transform inverse(transform t); 还支持整数的指数操作 [ ^ ] ,如: transform t=shift((0,1)); transform t2=t^2; //表示t操作两次, 常用的函数包括: transform identity(); 单位变换 transform shift(pair z); 移动距离坐标 z; transform shift(real x, real y); 移动距离坐标 (x,y); transform xscale(real x); x方向放大x倍 transform yscale(real y); y方向放大y倍 transform scale(real s); 在x和y方向同时放大s倍 transform slant(real s); 把点 (x,y) 变为 (x+s*y,y); transform rotate(real angle, pair z=(0,0)); 以z为中心旋转 angle 度角 transform reflect(pair a, pair b); 以线 line a--b 为轴,求镜像 shift(transform t) 返回 transforms (t.x,t.y,0,0,0,0) shiftless(transform t) 返回 transforms (0,0,t.xx,t.xy,t.yx,t.yy) Asymptote学习系列(11) 数据类型(续): frame和picture frame 是用PostScript坐标系的画布。通常不会直接用到它,而会使用相同功能的picture。一些常用函数包括: bool empty(frame f) f是否为空 pair min(frame f) 返回f的(left,bottom) pair max(frame f) 返回f的(right,top) void add(frame dest, frame src); void prepend(frame dest, frame src); frame align(frame f, pair align); picture 是在模块'plain'中定义的高层结构,用来提供以用户坐标下的画布。有个缺省的picture是currentpicture ,所有命令的缺省picture参数都是这个currentpicture。前面介绍的 size和unitsize函数的原型是: void size(picture pic=currentpicture, real x, real y=x,bool keepAspect=Aspect); void unitsize(picture pic=currentpicture, real x, real y=x); 其中,若x与y均为0,则会把它当作PostScript坐标系,此时,把pic变换到最后的输出frame时用的是单位变换。若x或y中有一个为0,则不会在这个方向上作限制,它会用与另一个方向相同的大小作变换。若 keepAspect 为 Aspect 或 true 的话,则在x和y方向作协同变换,这样,最后的picture在x方向不会超过x,以及在y方向上不会超过y;若 keepAspect 为 IgnoreAspect 或 false 的话,则picture会在x和y方向上同时放缩,从而最后的picture宽为x,高为y。 还有一些常用的函数包括: void size(picture pic=currentpicture, real xsize, real ysize,pair min, pair max); 这个函数的作用是重新计算pic中的放缩,使得它满足把box(min,max)中的区域变为xsize宽,ysize长。 transform fixedscaling(picture pic=currentpicture, pair min,pair max, pen p=nullpen); 这个函数 void shipout(string prefix=defaultfilename, picture pic,frame preamble=patterns,orientation orientation=orientation,string format="", bool wait=NoWait, bool view=true); void shipout(string prefix=defaultfilename,orientation orientation=orientation,string format="", bool wait=NoWait, bool view=true); 这两个函数可以把pic放入preamble中,并且写入文件prefix中,其中的orientation的取值包括:Portrait,Landscape,Seascape, UpsideDown。 frame pic.fit(real xsize=pic.xsize, real ysize=pic.ysize,bool keepAspect=pic.keepAspect); frame pic.scale(real xsize=this.xsize, real ysize=this.ysize,bool keepAspect=this.keepAspect); 这两个函数用于显式地把pic映射到frame中去。 frame bbox(picture pic=currentpicture, real xmargin=0,real ymargin=xmargin, pen p=currentpen,filltype filltype=NoFill); 这个函数与前两个函数的不同之处在于,它同时还画边框。其中的参数filltype可以设为: FillDraw Fill with the pen used to draw the boundary. FillDraw(real xmargin=0, real ymargin=xmargin, pen p=nullpen) If p is nullpen, fill with the pen used to draw the boundary; otherwise fill with pen p. An optional margin of xmargin and ymargin can be specified. Fill Fill with the drawing pen. Fill(real xmargin=0, real ymargin=xmargin, pen p=nullpen) If p is nullpen, fill with the drawing pen; otherwise fill with pen p.An optional margin of xmargin and ymargin can be specified.NoFill Do not fill. Draw Draw only the boundary. Draw(real xmargin=0, real ymargin=xmargin, pen p=nullpen) If p is nullpen, draw the boundary with the drawing pen; otherwise draw with pen p. An optional margin of xmargin and ymargin can be specified. UnFill Clip the region. UnFill(real xmargin=0, real ymargin=xmargin Clip the region and surrounding margins xmargin and ymargin. RadialShade(pen penc, pen penr) Fill varying radially from penc at the center of the bounding box to penr at the edge. pair min(picture pic); pair max(picture pic); 用于给出pic和边界 pair point(picture pic=currentpicture, pair dir); 用来计算以pic的中心为起点,方向在dir的线交pic的边界的坐标。 pair truepoint(picture pic=currentpicture, pair dir); pair framepoint(picture pic=currentpicture, pair dir); 这两个函数与前面的point类似,framepoint返回的是最后的PostScript坐标。 void add(picture src, bool group=true,filltype filltype=NoFill, bool put=Above); void add(picture dest, picture src, bool group=true,filltype filltype=NoFill, bool put=Above); void add(picture dest, picture src, pair position, bool group=true,filltype filltype=NoFill, bool put=Above); void add(picture src, pair position, bool group=true,filltype filltype=NoFill, bool put=Above); void add(picture dest=currentpicture, frame src, pair position=0,bool group=true, filltype filltype=NoFill,bool put=Above); void add(picture dest=currentpicture, frame src, pair position,pair align, bool group=true, filltype filltype=NoFill,bool put=Above); 这些函数把src放入dest或currentpicture中。 void attach(picture dest=currentpicture, frame src,pair position=0, bool group=true,filltype filltype=NoFill, bool put=Above); void attach(picture dest=currentpicture, frame src,pair position=0, pair align, bool group=true,filltype filltype=NoFill, bool put=Above); 把src放入dest,同时调整dest的大小 path box(frame f, Label L="", real xmargin=0,real ymargin=xmargin, pen p=currentpen,filltype filltype=NoFill, bool put=Above); path ellipse(frame f, Label L="", real xmargin=0,real ymargin=xmargin, pen p=currentpen,filltype filltype=NoFill, bool put=Above); void box(picture pic=currentpicture, Label L,real xmargin=0, real ymargin=xmargin, pen p=currentpen,filltype filltype=NoFill, bool put=Above); 用来在Label,frame或pic周围画一个矩形或椭圆。 void erase(picture pic=currentpicture); save(). restore(). 用来消除,保存,恢复pic的环境 还有更多的函数,都定义在模块plain中。 在pic中,你还可以直接插入PostScript命令和tex命令: void postscript(picture pic=currentpicture, string s); void postscript(picture pic=currentpicture, string s, pair min,pair max) void tex(picture pic=currentpicture, string s); void tex(picture pic=currentpicture, string s, pair min, pair max) Asymptote学习系列(12) 作图命令: 所有的Asymptote图形都是基于4个基本的作图命令:其中的3个PostScript命令draw、fill和clip以它们出现的顺序处理,最后出现的会放在最上面,而label命令可以用于增加文本标签或外部EPS图形,则会放于所有上面的3个PostScript命令上面。 若你想在一个label上作图的话,可以使用layer函数: void layer(picture pic=currentpicture); 它全重新创建一个新的PostScript/Latex图层,所有的图层顺序处理,最后出现的放在最上面。当然在图形内部,label命令还是会在其它3个PostScript命令的上面。 • draw void draw(picture pic=currentpicture, Label L="", path g,align align=NoAlign, pen p=currentpen,arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin,Label legend="", marker marker=nomarker); 用于在pic上画path g,用画笔p。还有些其它的参数,其中意义为: bar : 用来在g两端画条竖线,可取值为 None, BeginBar, EndBar (= Bar), Bars(=BeginBar & EndBar) ,而且它们都可以接受一个real型参数,用来指定竖线的长度(PostScript单位)。 arrowbar : 用来画箭头,可取为: None, Blank, BeginArrow, MidArrow, EndArrow(=Arrow), Arrows ,而且它们可以接受的参数包括:一个real型参数,用来指定大小(PostScript单位);一个real型参数angle用来指定角度; FillDraw, Fill, NoFill, Draw ;一个real型参数position指定位置。 void dot(picture pic=currentpicture, pair z, pen p=currentpen); void dot(picture pic=currentpicture, pair[] z, pen p=currentpen); void dot(picture pic=currentpicture, pair[] x, pair[] y, pen p=currentpen); void dot(picture pic=currentpicture, Label L, pair z, align align=NoAlign,string format=defaultformat, pen p=currentpen) void dot(picture pic=currentpicture, Label L, pen p=currentpen); void dot(picture pic=currentpicture, path g, pen p=currentpen); 用于画点 示例: path line=(0,0)--(5cm,0); draw(line, Arrow(20bp,position=.75)); draw(shift(0,-2cm)* line,Arrow(20bp,40,.75,filltype=NoFill)); position pos=BeginPoint ; pos.position=.75; draw(shift(0,-4cm)*line, BeginArrow(20bp,pos)); draw(shift(0,-6cm)*line, BeginArrow(20bp,40,pos,filltype=NoFill)); path line=(0,0)--(5cm,0); transform T= shift(0,-cm); draw(line,linewidth(1mm),Bars); draw(T^2*line,Bars(5mm)); draw(T^3*line ,linewidth(1mm),Bars(5mm)); draw(T^4* line,dotted+red,Bars); pair O=0; draw(scale(2)*Label( "N",.8red),O,10*N,linewidth(3mm)); draw(scale(2)*Label("S",.8red),O,10* S); draw(scale(2)*Label("E",.8red), O,10*E); draw(scale(2)*Label("W",.8 red),O,10*W); draw(rotate(45)*Label( "NE"),O,5NE); draw(rotate(-45)*Label ("SE"),O,5SE); draw(rotate(-45)* Label("NW"),O,5NW); draw(rotate(45)* Label("SW"),O,5SW);

Leave your comment

Required.

Required. Not published.

If you have one.