/* replacement for pltroff.c to call Pixel Machine PIClib Ellipses are drawn as circles and splines as straight lines. */ #include #include #include "pic.h" #include "/usr/hyper/include/piclib.h" #include "libpixel/tek.h" double rangex, rangey; /* probably already available inside pic somewhere */ double textht; extern int dbg; int frameno; char progname[] = "picpixel"; arrow(x0, y0, x1, y1, w, h, ang, nhead) /* draw arrow (without shaft) */ double x0, y0, x1, y1, w, h, ang; /* head wid w, len h, rotated ang */ int nhead; /* and drawn with nhead lines */ { double alpha, rot, drot, hyp; float dx, dy; int i; rot = atan2(w / 2, h); hyp = sqrt(w/2 * w/2 + h * h); alpha = atan2(y1-y0, x1-x0) + ang; if (nhead < 2) nhead = 2; for (i = nhead-1; i >= 0; i--) { drot = 2 * rot / (double) (nhead-1) * (double) i; dx = hyp * cos(alpha + PI - rot + drot); dy = hyp * sin(alpha + PI - rot + drot); line(x1+dx, y1+dy, x1, y1); } } /*-----------new code----------*/ printlf(line,name) int line; char *name; { } fillstart(v) /* this works only for postscript, for now */ double v; { } fillend() { } troff(s) char *s; { } space(x0, y0, x1, y1) /* set limits of page */ double x0, y0, x1, y1; { int minx, maxx, miny, maxy, square; double midx = .5*(x0+x1); double midy = .5*(y0+y1); double r; rangex = x1 - x0; rangey = y1 - y0; r = .6*((rangex>rangey)? rangex: rangey); range(midx-r,midy-r,midx+r,midy+r); frame(.2,0.,1.2,1.); PICget_viewport(&minx, &maxx, &miny, &maxy); square = maxx-minx+1; if( square > maxy-miny+1 ) square = maxy-miny+1; textht = .07*(1023./square)*r; if(frameno++) ppause(); } dot() { disc(e1->copyx,e1->copyy,.005/(rangex+rangey)); } label(s, t, nh) /* text s of type t nh half-lines up */ char *s; int t, nh; { char *p, *malloc(); double width=0.53; if (t & ABOVE) nh++; else if (t & BELOW) nh--; if (nh) rmove(0.,.5*nh*textht); t &= ~(ABOVE|BELOW); rmove(0.,-.2*textht); /* tek 4014 correction */ if (t & LJUST) { text2(s); } else { if (t & RJUST) { rmove(-width*strlen(s)*textht,0.); text2(s); } else { /* CENTER */ rmove(-0.5*width*strlen(s)*textht,0.); text2(s); } } } spline(x, y, n, p, dashed, ddval) double x, y; float *p; double n; /* sic */ int dashed; double ddval; { double x2, y2; int k, j; for(k=0, j=0; kscalex; register int n; dx = x1 - xc; dy = y1 - yc; rd = sqrt(dx * dx + dy * dy); dprintf("\narc x2 y2: %g %g\n",x2,y2); if (rd < quantum) { move(xc, yc); vec(xc, yc); return(0); } dph = acos(1.0 - (quantum / rd)); if (dph > PI/4) dph = PI/4; ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx); if (ph < 0) ph += 2*PI; if (rr < 0) ph = 2*PI - ph; if (ph < dph) line(x1, y1, x2, y2); else { n = ph / dph; if(n<2) n = 2; dph = ph / n; a = cos(dph); b = sin(dph); if (rr < 0) b = -b; move(x1, y1); while ((n--) > 0) { xnext = dx * a - dy * b; dy = dx * b + dy * a; dx = xnext; vec(dx + xc, dy + yc); dprintf("\narc vec to: %g %g\n", dx + xc, dy + yc); } vec(x2,y2); } } /******** end of code to be discarded *******/ text2(s) char *s; { double x, y; x = SCX(e1->copyx); y = SCY(e1->copyy); PICpush_transform(); PICtranslate(x,y,0.); (void)PICvector_text(s); PICpop_transform(); }