53 lines
1.8 KiB
Plaintext
53 lines
1.8 KiB
Plaintext
%%%
|
|
%%% 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;
|