pair coilpoint(real lambda, real r, real t)
{
 return (2.0*lambda*t+r*cos(t),r*sin(t));
}

guide coil(guide g=nullpath, real lambda, real r, real a, real b, int n)
{
 real width=(b-a)/n;
 for(int i=0; i <= n; ++i) {
   real t=a+width*i;
   g=g..coilpoint(lambda,r,t);
 }
 return g;
}

void drawspring(real x, string label) {
 real r=8;
 real t1=-pi;
 real t2=10*pi;
 real lambda=(t2-t1+x)/(t2-t1);
 pair b=coilpoint(lambda,r,t1);
 pair c=coilpoint(lambda,r,t2);
 pair a=b-20;
 pair d=c+20;

 draw(a--b,BeginBar(2*barsize()));
 draw(c--d);
 draw(coil(lambda,r,t1,t2,100));
 dot(d);

 pair h=20*I;
 draw(label,a-h--d-h,red,Arrow,Bars,PenMargin);
}