plot.c (2783B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include "grap.h" 5 #include "y.tab.h" 6 7 void line(int type, Point p1, Point p2, Attr *desc) /* draw a line segment */ 8 { 9 fprintf(tfd, "%s %s from %s", 10 type==LINE ? "line" : "arrow", desc_str(desc), xyname(p1)); 11 fprintf(tfd, " to %s", xyname(p2)); /* 'cause xyname is botched */ 12 fprintf(tfd, "\n"); 13 range(p1); 14 range(p2); 15 } 16 17 void circle(double r, Point pt) /* draw a circle */ 18 { 19 if (r > 0.0) 20 fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt)); 21 else 22 fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt)); 23 range(pt); 24 } 25 26 char *xyname(Point pt) /* generate xy name macro for point p */ 27 { 28 static char buf[200]; 29 Obj *p; 30 31 p = pt.obj; 32 if (p->log & XFLAG) { 33 if (pt.x <= 0.0) 34 ERROR "can't take log of x coord %g", pt.x FATAL; 35 logit(pt.x); 36 } 37 if (p->log & YFLAG) { 38 if (pt.y <= 0.0) 39 ERROR "can't take log of y coord %g", pt.y FATAL; 40 logit(pt.y); 41 } 42 sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y); 43 return buf; /* WATCH IT: static */ 44 } 45 46 void pic(char *s) /* fire out pic stuff directly */ 47 { 48 while (*s == ' ') 49 s++; 50 fprintf(tfd, "%s\n", s); 51 } 52 53 int auto_x = 0; /* counts abscissa if none provided */ 54 55 void numlist(void) /* print numbers in default way */ 56 { 57 Obj *p; 58 Point pt; 59 int i; 60 static char *spot = "\\(bu"; 61 Attr *ap; 62 63 p = pt.obj = lookup(curr_coord, 1); 64 if (nnum == 1) { 65 nnum = 2; 66 num[1] = num[0]; 67 num[0] = ++auto_x; 68 } 69 pt.x = num[0]; 70 if (p->attr && p->attr->sval) 71 spot = p->attr->sval; 72 for (i = 1; i < nnum; i++) { 73 pt.y = num[i]; 74 if (p->attr == 0 || p->attr->type == 0) { 75 ap = makesattr(tostring(spot)); 76 plot(ap, pt); 77 } else 78 next(p, pt, p->attr); 79 } 80 nnum = 0; 81 } 82 83 void plot(Attr *sl, Point pt) /* put stringlist sl at point pt */ 84 { 85 fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt)); 86 range(pt); 87 freeattr(sl); 88 } 89 90 void plotnum(double f, char *fmt, Point pt) /* plot value f at point */ 91 { 92 char buf[100]; 93 94 if (fmt) { 95 sprintf(buf, fmt, f); 96 free(fmt); 97 } else if (f >= 0.0) 98 sprintf(buf, "%g", f); 99 else 100 sprintf(buf, "\\-%g", -f); 101 fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt)); 102 range(pt); 103 } 104 105 void drawdesc(int type, Obj *p, Attr *desc, char *s) /* set line description for p */ 106 { 107 p->attr = desc; 108 p->attr->sval = s; 109 if (type == NEW) { 110 p->first = 0; /* so it really looks new */ 111 auto_x = 0; 112 } 113 } 114 115 void next(Obj *p, Point pt, Attr *desc) /* add component to a path */ 116 { 117 char *s; 118 119 if (p->first == 0) { 120 p->first++; 121 fprintf(tfd, "L%s: %s\n", p->name, xyname(pt)); 122 } else { 123 fprintf(tfd, "line %s from L%s to %s; L%s: Here\n", 124 desc_str(desc->type ? desc : p->attr), 125 p->name, xyname(pt), p->name); 126 } 127 if (p->attr && (s=p->attr->sval)) { 128 /* BUG: should fix size here */ 129 fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt)); 130 } 131 range(pt); 132 }