% Test.m4 .PS # `arcto(pos1,pos2,radius,dashed) # line to pos1 with rounded corner towards pos2, similar to postscript arcto' define(`arcto', `H_arcto: Here; X_arcto:`$1'; Y_arcto:`$2' U_arcto: (X_arcto.x-H_arcto.x,X_arcto.y-H_arcto.y) V_arcto: (Y_arcto.x-X_arcto.x,Y_arcto.y-X_arcto.y) L_arcto: (vlength(U_arcto.x,U_arcto.y),vlength(V_arcto.x,V_arcto.y)) S_arcto: (U_arcto.x*V_arcto.y-U_arcto.y*V_arcto.x, \ U_arcto.x*V_arcto.x+U_arcto.y*V_arcto.y) if (S_arcto.x==0) && (S_arcto.y==0) then { S_arcto:(`$3',0) } \ else { S_arcto:(`$3',atan2(S_arcto.x,S_arcto.y)) } a_arcto = S_arcto.x*tan(abs(S_arcto.y)/2) if S_arcto.x*S_arcto.y*L_arcto.x*L_arcto.y == 0 \ then { TX_arcto: X_arcto; TY_arcto: X_arcto; C_arcto: X_arcto } \ else { TX_arcto: a_arcto/L_arcto.x between X_arcto and H_arcto TY_arcto: a_arcto/L_arcto.y between X_arcto and Y_arcto C_arcto: TX_arcto + (vscal_(sign(S_arcto.y)*S_arcto.x/L_arcto.x, -U_arcto.y,U_arcto.x)) } line `$4' from H_arcto to TX_arcto if S_arcto.y >= 0 then { arc `$4' ccw rad `$3' to TY_arcto with .c at C_arcto } \ else {arc `$4' cw rad `$3' to TY_arcto with .c at C_arcto } ') HH: cross(at (0,0)) XX: cross(at (1,0)) YY: cross(at (0,1)) ZZ: cross(at (1,1)) move to HH arcto(XX,YY,.3,dashed) arcto(YY,ZZ,.2,dotted) Q: Here arcto(Q,Q,.25) line to ZZ .PE