Asymptote/Command/graph/vectorfield

Draw a vectorfield along a path:

void vectorfield(picture pic=, path g, int n, path vector(real), real arrowsize= , real arrowlength= , pen p= );

Example: import graph; defaultpen(0.5); size(400,200);

real arrowsize=1.5mm; real arrowlength=15;

vector ampere=new path(real x){ return (0,0)--arrowlength*(-1)*(2-3*cos(2*pi*x)^2)*(cos(2*pi*x),sin(2*pi*x)) };

vector tait=new path(real x){ return (0,0)--arrowlength*(-1)*(-cos(2*pi*x),sin(2*pi*x)); };

vector grassmann=new path(real x){ return (0,0)--arrowlength*(-1)*(0,sin(2*pi*x)); };

path p=unitcircle; int n=24; pen celmpen=currentpen+2; path cell=(-0.4,0)--(0.4,0);

draw(p); vectorfield(p,n,ampere,arrowsize); draw(cell,celmpen,Arrow(4)); draw(shift(0,-1)*cell,celmpen,Arrow(4)); dot((0,0)); dot((0,-1));

label("Amp\`ere",(0,-1),S);

p=shift(3,0)*p; cell=shift(3,0)*cell; draw(p);

vectorfield(p,n,grassmann,arrowsize); dot((3,0)); dot((3,-1)); label("Grassmann",(3,-1),S); draw(cell,celmpen,Arrow(4)); draw(shift(0,-1)*cell,celmpen,Arrow(4));

p=shift(3,0)*p; cell=shift(3,0)*cell; draw(p);

vectorfield(p,n,tait,arrowsize); dot((6,0)); dot((6,-1)); label("Tait",(6,-1),S); draw(cell,celmpen,Arrow(4)); draw(shift(0,-1)*cell,celmpen,Arrow(4));