Post Scriptum language

// Example 4 

procedure arrow( tailx, taily, tipx, tipy, 
		 halfthickness,
		 halfheadthickness,
		 headlength ) {
	newpath();
	halfthickness = halfthickness/2;
	halfheadthickness = halfheadthickness/2;
	dx = tipx-tailx;
	dy = tipy-taily;
	arrowlength = sqrt( dy*dy + dx*dx );
	angle = atan( dy, dx );
	base = arrowlength - headlength;
	savematrix = currentmatrix( matrix() );
	translate( tailx, taily );
	rotate( angle );
	moveto( 0, -halfthickness );
	lineto( base, -halfthickness );
	lineto( base, -halfheadthickness );
	lineto( arrowlength, 0 );
	lineto( base, halfheadthickness );
	lineto( base, halfthickness );
	lineto( 0, halfthickness );
	closepath();
	setmatrix( savematrix );
}

arrow( 318, 340, 72, 340, 10, 30, 72 );
fill();

arrow( 382, 400, 542, 560, 72, 232, 116 );
setlinewidth( 3 );
stroke();

arrow( 400, 300, 400, 90, 90, 200, 100 * sqrt(3) );
setrgbcolor( 1, 0.3, 0.3 );
fill();

showpage();