Asymptote’s samples and documentation

Indices and tables

Defined colours

_images/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));
    
_images/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));
    
_images/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);
    
_images/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);
    
_images/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);
    
_images/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]);
        }
    
_images/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);
    
_images/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));
    
_images/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);
    
_images/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);
    
_images/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);
    
_images/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));
    
_images/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<k; ++l) {
        fill(pic, P[k], C[k]+C[l]);
        clip(pic,P[l]);
        add(pic);
        for (int m=0; m<l; ++m) {
            fill(pic, P[k], C[k]+C[l]+C[m]);
            clip(pic,P[l]); clip(pic,P[m]);
            add(pic);
            for (int n=0; n<m; ++n) {
                fill(pic, P[k], C[k]+C[l]+C[m]+C[n]);
                clip(pic,P[l]); clip(pic,P[m]); clip(pic,P[n]);
                add(pic);
            }
        }
        }
    }
    fill(pic, P[0], C[0]+C[1]+C[2]+C[3]+C[4]);
    clip(pic,P[1]); clip(pic,P[2]); clip(pic,P[3]); clip(pic,P[4]);
    add(pic);
    
_images/venn-5.svg

Programming constructs

  • Loop constructs:

    unitsize(0.3inches);
    
    pair origin=(0,0), deltax=(1,0), deltay=(0,1);
    int n=10;
    real ticlength=0.3;
    
    for (int i=0; i<=n; ++i) {
        pair dpoint=origin+i*deltax;
        dot(dpoint);
        draw(dpoint--dpoint+(0,ticlength));
        label("$"+string(i)+"$",dpoint,S);
        }
    
    draw(origin--origin+n*deltax);
    
    int i=n;
    while (i>=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);
    
_images/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]);
    
_images/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);
    
_images/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));
    
_images/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));
    
_images/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));
    
_images/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));
    
_images/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));
    
_images/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));
    
_images/ThreePlanesNoSolution2.svg