#include #include #include "tex.h" void devarc(double x1, double y1, double x2, double y2, double xc, double yc, int r) { double t, start, stop; int rad; /* tpic arcs go clockwise, and angles are measured clockwise */ start = atan2(y2-yc, x2-xc); stop = atan2(y1-yc, x1-xc); if (r<0) { t = start; start = stop; stop = t; } rad = SCX(sqrt((x1-xc)*(x1-xc)+(y1-yc)*(y1-yc))); fprintf(TEXFILE, " \\special{ar %d %d %d %d %6.3f %6.3f}%%\n", TRX(xc), TRY(yc), rad, rad, -start, -stop); } void box(double x0, double y0, double x1, double y1) { fprintf(TEXFILE," \\special{pa %d %d}",TRX(x0),TRY(y0)); fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y0)); fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y1)); fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y1)); fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y0)); switch(e1->pen){ case DASHPEN: fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break; case DOTPEN: fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break; case SOLIDPEN: default: fprintf(TEXFILE,"\\special{fp}%%\n"); break; } } void circle(double xc, double yc, double r) { int rad = SCX(r); fprintf(TEXFILE, " \\special{ar %d %d %d %d 0.0 6.2832}%%\n", TRX(xc), TRY(yc), rad, rad); } void closepl(void) { fprintf(TEXFILE, " \\kern %6.3fin\n }\\vss}%%\n", INCHES(e1->sidex)); fprintf(TEXFILE, " \\kern %6.3fin\n}\n", INCHES(e1->sidey)); } void disc(double xc, double yc, double r) { fprintf(TEXFILE, " \\special{bk}%%\n"); circle(xc, yc, r); } void erase(void) { } void fill(int num[], double *ff[]) { double *xp, *yp, **fp, x0, y0; int i, *n; n = num; fp = ff; while((i = *n++)){ xp = *fp++; yp = xp+1; x0 = *xp; y0 = *yp; move(x0, y0); while(--i){ xp += 2; yp += 2; vec(*xp, *yp); } if (*(xp-2) != x0 || *(yp-2) != y0) vec(x0, y0); } } void frame(double xs, double ys, double xf, double yf) { double osidex, osidey; osidex = e1->sidex; osidey = e1->sidey; e1->left = xs * (e0->left + e0->sidex); e1->bottom = ys* (e0->bottom + e0->sidey); e1->sidex = (xf-xs) * e0->sidex; e1->sidey = (yf-ys) * e0->sidey; e1->scalex *= (e1->sidex / osidex); e1->scaley *= (e1->sidey / osidey); } void line(double x0, double y0, double x1, double y1) { move(x0, y0); vec(x1, y1); } void move(double xx, double yy) { e1->copyx = xx; e1->copyy = yy; } extern double xmin, ymin, xmax, ymax; /* tpic TeX coord system uses millinches, printer's points for pensize */ /* positive y downward, origin at upper left */ #define pHEIGHT 5000. #define pWIDTH 5000. #define pPENSIZE 9 #define pPSIZE 10 #define pDLEN .05 struct penvir E[2] = { {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN}, {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN} }; struct penvir *e0 = E, *e1 = &E[1]; FILE *TEXFILE; void openpl(void) { TEXFILE = stdout; space(xmin, ymin, xmax, ymax); fprintf(TEXFILE,"\\catcode`@=11\n"); fprintf(TEXFILE, "\\expandafter\\ifx\\csname graph\\endcsname\\relax"); fprintf(TEXFILE, " \\alloc@4\\box\\chardef\\insc@unt\\graph\\fi\n"); fprintf(TEXFILE, "\\catcode`@=12\n"); fprintf(TEXFILE, "\\setbox\\graph=\\vtop{%%\n"); fprintf(TEXFILE, " \\baselineskip=0pt \\lineskip=0pt "); fprintf(TEXFILE, "\\lineskiplimit=0pt\n"); fprintf(TEXFILE, " \\vbox to0pt{\\hbox{%%\n"); fprintf(TEXFILE, " \\special{pn %d}%%\n", e1->pdiam); } void range(double x0, double y0, double x1, double y1) { e1->xmin = x0; e1->ymin = y0; if (x1-x0 < .0000001*e1->sidex) x1=x0+.0000001; if (y1-y0 < .0000001*e1->sidey) y1=y0+.0000001; e1->scalex = e0->scalex*e1->sidex / (x1 - x0); e1->scaley = e0->scaley*e1->sidey / (y1 - y0); } void rmove(double xx, double yy) { e1->copyx += xx; e1->copyy += yy; } void rvec(double xx, double yy) { vec(xx+e1->copyx, yy+e1->copyy); } void sbox(double x0, double y0, double x1, double y1) { fprintf(TEXFILE," \\special{bk}%%\n"); box(x0, y0, x1, y1); } void vec(double xx, double yy) { fprintf(TEXFILE," \\special{pa %d %d}",TRX(e1->copyx),TRY(e1->copyy)); e1->copyx = xx; e1->copyy = yy; fprintf(TEXFILE,"\\special{pa %d %d}",TRX(xx),TRY(yy)); switch(e1->pen){ case DASHPEN: fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break; case DOTPEN: fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break; case SOLIDPEN: default: fprintf(TEXFILE,"\\special{fp}%%\n"); break; } }