%%% %%% File: graphbase.mf %%% mode_setup; def bounds(expr a,b,c,d) = xneg:=a; xpos:=b; yneg:=c; ypos:=d; enddef; def xconv(expr xvalue) = ((xvalue-xneg)/(xpos-xneg))*w enddef; def yconv(expr yvalue) = ((yvalue-yneg)/(ypos-yneg))*h enddef; def head(expr front,back,width,t) = x1:=xpart front;y1:=ypart front; x2:=xpart back; y2:=ypart back; x3:=xpart (z2+(width*(y2-y1)/2,width*(x1-x2)/2)); y3:=ypart (z2+(width*(y2-y1)/2,width*(x1-x2)/2)); x4:=xpart (z2+(width*(y1-y2)/2,width*(x2-x1)/2)); y4:=ypart (z2+(width*(y1-y2)/2,width*(x2-x1)/2)); draw z1{z2-z1}..tension t..z3; draw z1{z2-z1}..tension t..z4; enddef; def arrow(expr tl,hd,hlen) = x1:=xconv(xpart tl);y1:=yconv(ypart tl);x2:=xconv(xpart hd);y2:=yconv(ypart hd); draw z1..z2; head(z2,z2+(2*hlen*(z1-z2)/(length(z1-z2))),1,1); enddef; def axes(expr hlen) = arrow((0,yneg),(0,ypos),hlen); arrow((xneg,0),(xpos,0),hlen); enddef; def curve(text t) = path f;i=0; for a=t: x[incr i]:=xconv(xpart a);y[i]:=yconv(ypart a); if i=1: f:=z[i] else: f:=f..z[i] fi; endfor; draw f; enddef; def xmarks(expr len)(text t) = for a=t: draw (xconv(a),yconv(0)-len)..(xconv(a),yconv(0)+len); endfor; enddef; def ymarks(expr len)(text t) = for a=t: draw (xconv(0)-len,yconv(a))..(xconv(0)+len,yconv(a)); endfor; enddef; def line(expr a,b) = x1:=xconv(xpart a); y1:=yconv(ypart a); x2:=xconv(xpart b); y2:=yconv(ypart b); draw z1..z2; enddef; def point(expr a,b) = x1:=xconv(xpart a); y1:=yconv(ypart a); scl:=b*pt; fill fullcircle scaled scl shifted z1; enddef; def circle(expr center,diam) = x1:=xconv(xpart center);y1:=yconv(ypart center); r:=xconv(diam)-xconv(0); draw fullcircle scaled r shifted z1; enddef; def ellipse(expr center,diamx,diamy,angle) = x1:=xconv(xpart center);y1:=yconv(ypart center); th:=angle; dx:=xconv(diamx)-xconv(0); dy:=yconv(diamy)-yconv(0); draw fullcircle xscaled dx yscaled dy rotated th shifted z1; enddef;