Asymptote's samples and documentation ===================================== .. toctree: :maxdepth: 2 :caption: Contents: Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` Defined colours =============== .. image:: colors.svg 2d objects ========== * Circles:: unitsize(3cm); real radius=0.3; draw(circle((0,0),radius)); draw(circle((1,0),radius), orange); filldraw(circle((2,0),radius), green); filldraw(circle((3,0),radius), green, orange); filldraw(circle((4,0),radius), green, orange+linewidth(3)); .. image:: circles.svg * Linear vs Bezier:: unitsize(2inches); pair A=(0,0), B=(1,0), C=(1,1), D=(0,1); draw(circle((1/2,1/2),.707),blue+linewidth(6)); draw(A--B--C--D--cycle); draw(A..B..C..D..cycle,red+linewidth(2)); .. image:: lin-bez.svg * Linear vs Bezier2:: unitsize(2cm); pair fvalues[]; real eps=pi/5; for (real t=0; t<=2pi; t+=eps) { fvalues.push((t,sin(t))); } path p; for (int k: sequence(fvalues.length)) p=p--fvalues[k]; p=p--cycle; draw(p); path p; for (int k: sequence(fvalues.length)) p=p..fvalues[k]; p=p--cycle; draw(shift(0,-2)*p); import graph; path g=graph(sin,0,2pi); draw(shift(0,-4)*g,linewidth(4)+green); draw(shift(0,-4)*p); .. image:: simplegraph.svg * Protractor and ruler:: size (15cm,0); int[] angles={0,15,30,45,60,75,90,105,120,135,150,165,180}; for (int k: angles) { draw((0,0)--0.9*dir(k)); label("$"+string(k)+"$",dir(k)); } pair lpoint=(1.5,0), incr=(0.2,0); for (int i=0; i<=12; ++i) { pair dpoint=lpoint+i*incr; dot(dpoint); draw(dpoint--dpoint+(0,0.1)); label("$"+string(i)+"$",dpoint,S); } draw(lpoint--lpoint+12*incr); .. image:: protractor.svg * Repeat vs. cycle:: unitsize(1inches); pair A=(2,3/2), B=(0,0), C=(5/2,0); draw(A--B--C--A,linewidth(6)+squarecap+orange); draw(shift((3,0))*(A--B--C--cycle),linewidth(6)+squarecap+lightblue); .. image:: cyclepath.svg * Lindemann rooty-helix:: unitsize(1.4cm); pair X[] = {(0,0),(1,0)}; int lim=86; triple darkgreen=(175,193,36); pen RGB(real r, real g, real b) { return rgb(r/256,g/256,b/256); } for (int n=2; n<=lim; ++n) { X[n] = X[n-1] + 1/sqrt(n-1)*(-X[n-1].y,X[n-1].x); } for (int n=lim-1; n>=0; --n) { filldraw(X[n]--X[n+1]--(0,0)--cycle, RGB(241-2.2*n,256-2.2*n,101-2.2*n)); } for (int n=0; n<=lim; ++n) { filldraw(circle(X[n],0.36),white); label("$\sqrt{"+string(n)+"}$", X[n]); //draw ((0,0)--X[n]); } .. image:: rooty-helix.svg Graphs ====== * Graph of cosine function:: import graph; size (0 ,2.5 inch ); real pi=2*acos(0); real xmin =0, xmax =pi; real ymax =1, ymin = -1; real yvalue=.35, xvalue=acos(yvalue); draw(graph(cos,0,pi)); xaxis(xmin,xmax,Ticks); yaxis(ymin,ymax,LeftTicks); label("$x$",(xmax,0),E); label("$y$",(0,ymax),N); dot((pi,0)); label("$\pi$",(pi,0),N); dot((pi/2,0)); label("$\frac\pi2$",(pi/2,0),N); label("$y=\cos(x)$",(0.6,1),E); label("$y_0$", (0,yvalue),W,red); label("$x_0$", (xvalue,0), S,red); label("$(x_0,y_0)$", (xvalue,yvalue), NE); path p=(0,yvalue)--(xvalue,yvalue)--(xvalue,0); draw(p,red); .. image:: cosine.svg * Area under curve:: import graph; unitsize(1inch); real f(real x) {return exp(-x^2);} real xmin=-2, xmax=2; real ymin=-.3, ymax=1.3; path g=graph(f,xmin,xmax, operator ..); path h=(xmax,f(xmax))--(xmax,0)--(xmin,0); fill(g--h--cycle,lightyellow); draw(g); label("$f(x)=e^{-x^2}$", (xmin,.7),.5*N); draw((xmin,.7){SSE}..{SE}(-.8,f(-.8)),Arrow); label("Area $=\sqrt\pi$",(xmax,.7),.5*N); draw((xmax,.7){S}..{W}(.3,.3),Arrow); xaxis(xmin,xmax); yaxis(ymin,ymax); // need to fix layer problem with the axes draw((xmin,0)--(xmax,0)); draw((0,ymin)--(0,ymax)); .. image:: exp2.svg * Shift and rotate:: unitsize(1cm); path vane=(0,0)--(1,-.25)--(1,.25)--cycle; path mill=vane--rotate(90)*vane--rotate(180)*vane--rotate(270)*vane--cycle; filldraw(mill,red,blue); filldraw(shift(2.5,0)*mill,orange,blue); filldraw(shift(5,0)*rotate(45)*mill,yellow,blue); filldraw(rotate(45)*shift(5,0)*mill,green,blue); filldraw(shift(8,0)*scale(1.5)*mill,purple,blue); .. image:: windmill.svg * Polar graphs with shift and rotate:: import graph; size(0,100); real f(real t) {return cos(2*t);} path g=polargraph(f,-pi,pi,operator ..)--cycle; filldraw(g,red); filldraw(shift((2.5,0))*g,yellow); filldraw(shift((5,0))*rotate(45)*g,lightgreen); .. image:: polargraph.svg * Implicit plot:: unitsize(5cm); import contour; import graph; yaxis(ymin=-1.5,ymax=1.5,Ticks(Step=0.5,step=0.1)); xaxis(xmin=-1.5,xmax=1.5,Ticks(Step=0.5,step=0.1)); real f(real x, real y) {return x^2-x*y+y^2;} draw(contour(f,(-2,-2),(2,2), new real[] {1}, operator ..),red); .. image:: ellipse-contour.svg Geometric constructions ======================= * Triangle centres:: unitsize(0.6inches); defaultpen(linewidth(2)); pair A=(6,0), B=(2,3), C=(1.1,0); pair PerpPoint(pair X, pair Y, pair Z) { // Return point U on X--Y perp to Z--U real t = dot(X-Y,Z-Y)/dot(X-Y,X-Y); pair U = t*X + (1-t)*Y; dot(U,red+linewidth(6)); return U; } draw (A--B--C--cycle); draw(C--PerpPoint(A,B,C),red); draw(B--PerpPoint(A,C,B),red); draw(A--PerpPoint(B,C,A),red); dot(A,linewidth(6)); dot(B,linewidth(6)); dot(C,linewidth(6)); label("$A$",A,S); label("$B$",B,N); label("$C$",C,S); label("Perpendicular",0.5*(A+C),S); A=A+(5.5,0); B=B+(5.5,0); C=C+(5.5,0); pair AA=(B+C)/2; pair BB=(A+C)/2; pair CC=(A+B)/2; dot(A,linewidth(6)); dot(B,linewidth(6)); dot(C,linewidth(6)); draw(A--AA,purple); draw(B--BB,purple); draw(C--CC,purple); draw (A--B--C--cycle); dot(AA,linewidth(6)+purple); dot(BB,linewidth(6)+purple); dot(CC,linewidth(6)+purple); label("$A$",A,S); label("$B$",B,N); label("$C$",C,S); label("Side bisector",0.5*(A+C),S); A=A+(5.5,0); B=B+(5.5,0); C=C+(5.5,0); draw (A--B--C--cycle); label("$A$",A,S); label("$B$",B,N); label("$C$",C,S); label("Angle bisector",0.5*(A+C),S); real AB=length(A-B), AC=length(A-C), BC=length(B-C); real t=AC/(AB+AC); pair D=t*B+(1-t)*C; draw(D--A, green); dot(D,linewidth(8)+green); real t=AB/(BC+AB); pair D=t*C+(1-t)*A; draw(D--B, green); dot(D,linewidth(8)+green); real t=BC/(AC+BC); pair D=t*A+(1-t)*B; draw(D--C, green); dot(D,linewidth(8)+green); dot(A,linewidth(6)); dot(B,linewidth(6)); dot(C,linewidth(6)); .. image:: trianglecentres.svg * Five set Venn diagram:: unitsize(.6inch); path ellipse(pair c, real a, real b) { return shift(c)*scale(a,b)*unitcircle; } real radius=1.5, excen=2.05; path E = ellipse((1.2,.2),excen*radius,radius); path [] P ; for (int k=0; k<5; ++k) P[k]=rotate(k*72)*E; pen [] C = { rgb(.45,0,0), rgb(0,.45,0), rgb(0,0,.45), rgb(.30,.30,0), rgb(.30,0,.30), rgb(0,.30,.30) }; //col_lev=colour level real col_lev=.22; //pen [] C = { // cmyk(col_lev,col_lev,0,0), cmyk(0,col_lev,col_lev,0), cmyk(0,0,col_lev,col_lev), // cmyk(col_lev,0,col_lev,0), cmyk(0,col_lev,0,col_lev), cmyk(col_lev,0,0,col_lev) // }; picture pic; for (int k=0; k<5; ++k) { fill(P[k],C[k]); for (int l=0; l=0) { pair dpoint=origin+i*deltay; dot(dpoint); draw(dpoint--dpoint+(ticlength,0)); label("$"+string(i)+"$",dpoint,W); --i; } for (int k: sequence(n+1)) { dot((k,k),red); } draw(origin--origin+n*deltay); .. image:: iterate.svg * :: unitsize(1cm); pair O=(0,0), A=(6,0), B=(3,3*sqrt(3)); pair C=2/3*O+1/3*A, D=2/3*A+1/3*B, E=2/3*B+1/3*O; pair F=1/3*O+1/2*A+1/6*B; draw(O--A--B--cycle); draw(C--D--E--cycle); draw(E--F); pair [] P={O,A,B,C,D,E,F}; for (int k:sequence(P.length)) dot(P[k]); .. image:: triangles.svg * US and Canadian flags:: unitsize(2cm); pen usflagred=rgb(178/256,34/256,52/256); pen usflagblue=rgb(60/256,59/256,110/256); real flagheight=2.0, flagwidth=3.8, unionheight=7/13*flagheight, unionwidth=2/5*flagwidth; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path union_outline=scale(unionwidth,unionheight)*unitsquare; path stripe=scale(flagwidth,1/13*flagheight)*unitsquare; pair union_origin=(0,6/13*flagheight); real starhshift=unionwidth/12, starvshift=unionheight/10; currentpen=linewidth(0.2pt); // 5 star with diameter 2 and vertex at (0,1) path star=dir(90)--dir(234)--dir(18)--dir(162)--dir(306)--cycle; path smallstar=scale(0.0616)*star; void draw_usaflag(real r, real s) { for (int k: sequence(13)) if (k%2==0) fill(shift(r,s)*shift(0,k/13*flagheight)*stripe,usflagred); fill(shift(r,s)*shift(union_origin)*union_outline, usflagblue); for (int i: sequence(1,11)) for (int j: sequence(1,9)) if ((i+j)%2==0) fill(shift(r,s)*shift(union_origin+(i*starhshift,j*starvshift))*smallstar,white); draw(shift(r,s)*flag_outline); } draw_usaflag(0,0); pen canadared=rgb(235/256,45/256,55/256); real flagwidth=4, flagheight=2; path flag_outline=scale(flagwidth,flagheight)*unitsquare; path cbar1=scale(1,2)*unitsquare, cbar2=shift(3,0)*cbar1; path mapleleafleft= (0,-102) --(-5,-102)--(-2,-56) {dir(87)}..{dir(190)} (-8,-53) --(-51,-61)--(-45,-45){dir(70)}..{dir(141)} (-46,-41)--(-94,-3) --(-82,1) {dir(25)}..{dir(108)} (-81,6) --(-90,34) --(-63,29) {dir(348)}..{dir(67)} (-59,30) --(-54,43) --(-33,20) {dir(313)}..{dir(101)} (-27,23) --(-38,76) --(-21,62) {dir(330)}..{dir(63)} (-16,67) --(0,100); path mapleleafright=reflect((0,0),(0,1))*reverse(mapleleafleft); path mapleleaf=mapleleafleft--mapleleafright--cycle; void draw_canadaflag(real r, real s) { fill(shift(r,s)*cbar1,canadared); fill(shift(r,s)*cbar2,canadared); fill(shift(r,s)*shift(2,1)*scale(.008)*mapleleaf,canadared); draw(shift(r,s)*flag_outline); } draw_canadaflag(5,0); .. image:: flag.svg * Infile settings:: settings.outformat="png"; settings.render=8; settings.prc=false; defaultrender.merge=true; settings.autobillboard=false; settings.embed=false; settings.tex="pdflatex"; settings.toolbar=false; * New pens:: unitsize(2.5cm); pen mypen=fontsize(32pt)+blue+Palatino(); defaultpen(NewCenturySchoolBook()+fontsize(15pt)); label("Newpen",(1,1),mypen); label("Default",(1,0.5)); draw(box((0,0),(2,1.5)),mypen+red+linewidth(3)); .. image:: newpen.svg Three dimensional figures ========================= * Plane surface:: import graph3; unitsize(2cm); currentprojection=oblique; triple u=(2,0,2),v=(0,2,0),w=(1,1/2,0); path3 g=plane(u,v,w); dot(u); label("$u$",u,E); dot(v); label("$v$",v,E); dot(w); label("$w$",w,W); dot(u+w); label("$u+w$",u+w,E); dot(v+w); label("$v+w$",v+w,E); dot(u+v+w); label("$u+v+w$",u+v+w,E); draw(g); draw(surface(g),lightgreen,nolight); axes3("\(x\)","\(y\)","\(z\)",(0,0,0),(4,3,2)); .. image:: plane-points.svg * Three planes:: import graph3; unitsize(4cm); currentprojection=perspective(11,2,-9); currentprojection=perspective(14.5,3.2,1.1); //currentprojection=oblique; real A,B,C,D; real f(real x, real y) { return (D-A*x-B*y)/C;} // equation of plane triple F(real x, real y) {return (x,y,f(x,y));} // point above (x,y) A=1; B=1; C=1; D=2; triple u=F(2,0), v=F(0,2), w=F(0.5,0.5); path3 g1=plane(u-w,v-w,w); draw(surface(g1),paleblue,nolight); draw(g1,linewidth(0.85)); label("\(x+y+z=2\)",F(0,2.0),NE,blue); A=1; B=2; C=1; D=3; triple u=F(2,0), v=F(0,2), w=F(0.5,0.5); path3 g2=plane(u-w,v-w,w); draw(surface(g2),lightyellow,nolight); draw(g2,linewidth(0.75)); label("\(x+2y+z=3\)",F(0,2),E,olive); A=1; B=2; C=-3; D=3; triple u=F(2,0), v=F(0,2), w=F(0.5,0.5); path3 g3=plane(u-w,v-w,w); draw(surface(g3),lightgreen,nolight); draw(g3,linewidth(0.75)); label("\(x+2y-3z=3\)",F(0,2),NE,heavygreen); triple [] s1,s2,s3; s1=intersectionpoints(g1,g2); draw(s1[0]--s1[1],linewidth(1)); s2=intersectionpoints(g1,g3); draw(s2[0]--s2[1],linewidth(1)); s3=intersectionpoints(g2,g3); draw(s3[0]--s3[1],linewidth(1)); triple t; t=intersectionpoint(s1[0]--s1[1],s2[0]--s2[1]); dot(t,red+linewidth(5.75)); triple u=(3,2.5,-0.2); draw(u--t, Arrow3,Margin3(1,2)); label("$(x,y,z)=(\frac34,1,\frac14)$",u,E); axes3("\(x\)","\(y\)","\(z\)",(0,0,0),(4,3,2)); .. image:: ThreePlanesPoint.svg * Three planes, no intersection:: import graph3; size(500); currentprojection=orthographic(-5.3,-4.1,8.8); currentlight=White; defaultpen(1); // Change default pen width to 1bp real A,B,C=1,D; real f(real x, real y) { return (D-A*x-B*y)/C;} // equation of plane triple F(real x, real y) {return (x,y,f(x,y));} // point above (x,y) A=2; B=-1; C=1; D=1; triple u=F(1,1), w=F(-1.2,-1), v=0.55*F(-1,1)+0.45*w; path3 g1=plane(u-w,v-w,w); draw(surface(g1),lightblue,nolight); draw(g1); label("\(x-y+z=1\)",w,E,blue); A=1; B=1; C=1; D=2; triple u=F(1,1), v=F(-1,1), w=F(-1.2,-1); path3 g2=plane(u-w,v-w,w); draw(g2); draw(surface(g2),grey,nolight); label("\(x+y+z=2\)",w,E,heavygrey); A=4; B=1; C=3; D=3; triple u=F(1,1), v=F(-1,1), w=F(-1.2,-1); path3 g3=plane(u-w,v-w,w); draw(g3); draw(surface(g3),green,nolight); label("\(4x+y+3z=3\)",w,E,deepgreen); triple [] s1,s2,s3; s1=intersectionpoints(g1,g2); draw(s1[0]--s1[1]); s2=intersectionpoints(g1,g3); draw(s2[0]--s2[1]); s3=intersectionpoints(g2,g3); draw(s3[0]--s3[1]); axes3("\(x\)","\(y\)","\(z\)",(0,0,0),(1,1,3)); .. image:: ThreePlanesNoSolution.svg * Three parallel planes:: import graph3; unitsize(4cm); currentprojection=orthographic(-6.2,-4.3,9.7); currentlight=White; real A,B,C=1,D; real f(real x, real y) { return (D-A*x-B*y)/C;} // equation of plane triple F(real x, real y) {return (x,y,f(x,y));} // point above (x,y) A=2; B=-1; C=1; D=1; //path3 g1=plane(F(1,0)-F(-2,-2),F(-1,0)-F(-2,-2),F(-2,-2)); triple w=F(-2,-2), u=F(1,0)-w, v=F(-1,0)-w; path3 g1=plane(u,v,w); draw(surface(g1),lightblue,nolight); draw(g1); label("\(2x-y+z=1\)",F(-2,-2),E,deepblue); A=2; B=-1; C=1; D=2; triple w=F(-2,-2), u=F(1,0)-w, v=F(-1,0)-w; path3 g2=plane(u,v,w); draw(g2); draw(surface(g2),grey,nolight); label("\(2x-y+z=2\)",F(-2,-2),E,deepgrey); A=2; B=-1; C=1; D=3; triple w=F(-2,-2), u=F(1,0)-w, v=F(-1,0)-w; path3 g3=plane(u,v,w); draw(g3); draw(surface(g3),green,nolight); label("\(2x-y+z=3\)",F(-2,-2),E,deepgreen); axes3("\(x\)","\(y\)","\(z\)",(-1,-1,-1),(1.5,1,4)); .. image:: ThreeParallelPlanes.svg * Three intersecting planes:: import graph3; unitsize(8cm); currentprojection=orthographic(7,3.31,-9.91); currentlight=White; defaultpen(1); // Change default pen width to 1bp path3 Plane(triple a, triple b, triple c) { return plane(c-b,a-b,b); // return path for plane with sides a--b--c } triple[] P={(6/7,3/7,-2/7), (1,1,0), (3/7,12/7,-1/7)}; triple dirvec=(2,1,-3); real t=1.25; triple[] Q={P[0]+t*dirvec, P[1]+t*dirvec, P[2]+t*dirvec}; real eps=0.15, p=1+eps, q=-eps; path3 p1=Plane((p*P[0]+q*P[1]), (p*P[1]+q*P[0]), (p*Q[1]+q*Q[0])); draw(p1); draw(surface(p1),heavygrey,nolight); path3 p2=Plane(p*P[0]+q*P[2], (p*P[2]+q*P[0]), (p*Q[2]+q*Q[0])); draw(surface(p2),green,nolight); draw(p2); path3 p3=Plane(p*P[1]+q*P[2], p*P[2]+q*P[1], p*Q[2]+q*Q[1]); draw(surface(p3),lightblue,nolight); draw(p3); draw(P[0]--Q[0]^^P[1]--Q[1]^^P[2]--Q[2]); label("\(2x-y+z=1\)", P[1]--P[2],NE, deepblue); label("\(x+y+z=2\)", P[0]--P[1],NW, deepgrey); label("\(4x+y+3z=3\)",Q[0]--Q[2],2SE,deepgreen); axes3("\(x\)","\(y\)","\(z\)",(0,0,0),(1,1,1.1)); .. image:: ThreePlanesNoSolution2.svg