Plan 9 from Bell Labs’s /usr/web/sources/extra/art/art2pic

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#!/bin/rc
awk '
function fabs(a){ return a<0?-a:a; }
function pldist(x, y, x0, y0, x1, y1,   xd, yd, xe, ye, dd, de, dsq){
	xd=x1-x0; yd=y1-y0;
	xe=x-x0;  ye=y-y0;
	dd=xd*xd+yd*yd;
	de=xd*xe+yd*ye;
	if(dd<1e-10) return sqrt(xe*xe+ye*ye);
	dsq=xe*xe+ye*ye-de*de/dd;
	if(dsq<1e-10) return 0;
	return sqrt(dsq);
}
function bezier(x0, y0, x1, y1, x2, y2, x3, y3){
	if(pldist(x1, y1, x0, y0, x3, y3)<.005){
		if(pldist(x2, y2, x0, y0, x3, y3)<.005){
			printf("line from (%g,%g) to (%g,%g)\n", x0, y0, x3, y3);
			return;
		}
	}
	bezier(x0, y0, .5*(x0+x1), .5*(y0+y1), .25*(x0+2*x1+x2), .25*(y0+2*y1+y2),
		.125*(x0+3*(x1+x2)+x3), .125*(y0+3*(y1+y2)+y3));
	bezier(.125*(x0+3*(x1+x2)+x3), .125*(y0+3*(y1+y2)+y3),
		 .25*(x1+2*x2+x3), .25*(y1+2*y2+y3), .5*(x2+x3), .5*(y2+y3), x3, y3);
}
BEGIN {
	printf(".PS\n");
}
/^a/ {
	p0x=($2+$4)/2.; p0y=($3+$5)/2.;
	p1x=($2+$6)/2.; p1y=($3+$7)/2.;
	d0x=$5-$3; d0y=$2-$4;
	d1x=$7-$3; d1y=$2-$6;
	den=d1x*d0y-d0x*d1y;
	if(fabs(den)<1e-5) alpha=0
	else alpha=((p1y-p0y)*d1x-(p1x-p0x)*d1y)/den;
	x=p0x+alpha*d0x-$2; y=p0y+alpha*d0y-$3;
	rad=sqrt(x*x+y*y);
	printf("arc ");
	if(NF>=9){
		if($9~"<>") printf("<-> ");
		else if($9~"<") printf("<- ");
		else if($9~">") printf("-> ");
		if($9~"-") printf("dashed ");
		if($9~"\\.") printf("dotted ");
	}
	if(($4-$2)*($5+$3)+($6-$4)*($7+$5)+($2-$6)*($3+$7)>=0) printf("cw");
	else printf("ccw");
	printf(" from (%g,%g) to (%g,%g) rad %g;\n", $2, $3, $6, $7, rad);
}
/^b/ {
	printf("box wid %g ht %g at (%g,%g);\n", fabs($2-$4), fabs($3-$5), ($2+$4)/2, ($3+$5)/2);
}
/^c/ {
	printf("circle at (%g,%g) rad %g;\n", $2, $3, $4);
}
/^G/ {
	printf("define grp%s {[\n", $2);
}
/^;/ {
	printf("]}\n");
}
/^g/{
	printf("grp%s() with (0,0) at (%g,%g);\n", $2, $3, $4);
}
/^l/{
	printf("line ");
	if(NF>=7){
		if($7~"<>") printf("<-> ");
		else if($7~"<") printf("<- ");
		else if($7~">") printf("-> ");
		if($7~"-") printf("dashed ");
		if($7~"\\.") printf("dotted ");
	}
	printf("from (%g,%g) to (%g,%g);\n", $2, $3, $4, $5);
}
/^t/{
	x=$2;
	y=$3;
	font=$4;
	sub("t [^ ]* [^ ]* [^ ]* ", "");
	printf("\"%s\" at (%g,%g);\n", $0, x, y);
	next
}
/^s/{
	ax=1; ay=2;
	bx=3; by=4;
	cx=5; cy=6;
	dx=7; dy=8;
	do{
		if(ax<3){
			x0=$bx; y0=$by;
			x1=(2*$bx+$cx)/3; y1=(2*$by+$cy)/3;
		}
		else{
			x0=($ax+2*$bx+$cx)/4; y0=($ay+2*$by+$cy)/4;
			x1=($ax+6*$bx+5*$cx)/12; y1=($ay+6*$by+5*$cy)/12;
		}
		if(dx>NF-1){
			x2=($bx+2*$cx)/3; y2=($by+2*$cy)/3;
			x3=$cx; y3=$cy;
		}
		else{
			x2=(5*$bx+6*$cx+$dx)/12; y2=(5*$by+6*$cy+$dy)/12;
			x3=($bx+2*$cx+$dx)/4; y3=($by+2*$cy+$dy)/4;
		}
		bezier(x0, y0, x1, y1, x2, y2, x3, y3);
		ax=bx; ay=by;
		bx=cx; by=cy;
		cx=dx; cy=dy;
		dx+=2; dy+=2;
	}while(by<NF);
}
END{
	printf(".PE\n");
}
' $1

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].