Blame


1 b6d98463 2006-04-14 devnull #include <math.h>
2 b6d98463 2006-04-14 devnull #include <stdio.h>
3 b6d98463 2006-04-14 devnull #include "tex.h"
4 b6d98463 2006-04-14 devnull
5 b6d98463 2006-04-14 devnull void
6 b6d98463 2006-04-14 devnull devarc(double x1, double y1, double x2, double y2, double xc, double yc, int r)
7 b6d98463 2006-04-14 devnull {
8 b6d98463 2006-04-14 devnull double t, start, stop;
9 b6d98463 2006-04-14 devnull int rad;
10 b6d98463 2006-04-14 devnull
11 b6d98463 2006-04-14 devnull /* tpic arcs go clockwise, and angles are measured clockwise */
12 b6d98463 2006-04-14 devnull start = atan2(y2-yc, x2-xc);
13 b6d98463 2006-04-14 devnull stop = atan2(y1-yc, x1-xc);
14 b6d98463 2006-04-14 devnull if (r<0) {
15 b6d98463 2006-04-14 devnull t = start; start = stop; stop = t;
16 b6d98463 2006-04-14 devnull }
17 b6d98463 2006-04-14 devnull rad = SCX(sqrt((x1-xc)*(x1-xc)+(y1-yc)*(y1-yc)));
18 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\special{ar %d %d %d %d %6.3f %6.3f}%%\n",
19 b6d98463 2006-04-14 devnull TRX(xc), TRY(yc), rad, rad, -start, -stop);
20 b6d98463 2006-04-14 devnull }
21 b6d98463 2006-04-14 devnull
22 b6d98463 2006-04-14 devnull void
23 b6d98463 2006-04-14 devnull box(double x0, double y0, double x1, double y1)
24 b6d98463 2006-04-14 devnull {
25 b6d98463 2006-04-14 devnull fprintf(TEXFILE," \\special{pa %d %d}",TRX(x0),TRY(y0));
26 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y0));
27 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y1));
28 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y1));
29 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y0));
30 b6d98463 2006-04-14 devnull switch(e1->pen){
31 b6d98463 2006-04-14 devnull case DASHPEN:
32 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break;
33 b6d98463 2006-04-14 devnull case DOTPEN:
34 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break;
35 b6d98463 2006-04-14 devnull case SOLIDPEN:
36 b6d98463 2006-04-14 devnull default:
37 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{fp}%%\n"); break;
38 b6d98463 2006-04-14 devnull }
39 b6d98463 2006-04-14 devnull }
40 b6d98463 2006-04-14 devnull
41 b6d98463 2006-04-14 devnull void
42 b6d98463 2006-04-14 devnull circle(double xc, double yc, double r)
43 b6d98463 2006-04-14 devnull {
44 b6d98463 2006-04-14 devnull int rad = SCX(r);
45 b6d98463 2006-04-14 devnull
46 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\special{ar %d %d %d %d 0.0 6.2832}%%\n",
47 b6d98463 2006-04-14 devnull TRX(xc), TRY(yc), rad, rad);
48 b6d98463 2006-04-14 devnull }
49 b6d98463 2006-04-14 devnull
50 b6d98463 2006-04-14 devnull void
51 b6d98463 2006-04-14 devnull closepl(void)
52 b6d98463 2006-04-14 devnull {
53 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\kern %6.3fin\n }\\vss}%%\n", INCHES(e1->sidex));
54 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\kern %6.3fin\n}\n", INCHES(e1->sidey));
55 b6d98463 2006-04-14 devnull }
56 b6d98463 2006-04-14 devnull
57 b6d98463 2006-04-14 devnull void
58 b6d98463 2006-04-14 devnull disc(double xc, double yc, double r)
59 b6d98463 2006-04-14 devnull {
60 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\special{bk}%%\n");
61 b6d98463 2006-04-14 devnull circle(xc, yc, r);
62 b6d98463 2006-04-14 devnull }
63 b6d98463 2006-04-14 devnull
64 b6d98463 2006-04-14 devnull void
65 b6d98463 2006-04-14 devnull erase(void)
66 b6d98463 2006-04-14 devnull {
67 b6d98463 2006-04-14 devnull }
68 b6d98463 2006-04-14 devnull
69 b6d98463 2006-04-14 devnull void
70 b6d98463 2006-04-14 devnull fill(int num[], double *ff[])
71 b6d98463 2006-04-14 devnull {
72 b6d98463 2006-04-14 devnull double *xp, *yp, **fp, x0, y0;
73 b6d98463 2006-04-14 devnull int i, *n;
74 b6d98463 2006-04-14 devnull n = num;
75 b6d98463 2006-04-14 devnull fp = ff;
76 b6d98463 2006-04-14 devnull while((i = *n++)){
77 b6d98463 2006-04-14 devnull xp = *fp++;
78 b6d98463 2006-04-14 devnull yp = xp+1;
79 b6d98463 2006-04-14 devnull x0 = *xp;
80 b6d98463 2006-04-14 devnull y0 = *yp;
81 b6d98463 2006-04-14 devnull move(x0, y0);
82 b6d98463 2006-04-14 devnull while(--i){
83 b6d98463 2006-04-14 devnull xp += 2;
84 b6d98463 2006-04-14 devnull yp += 2;
85 b6d98463 2006-04-14 devnull vec(*xp, *yp);
86 b6d98463 2006-04-14 devnull }
87 b6d98463 2006-04-14 devnull if (*(xp-2) != x0 || *(yp-2) != y0)
88 b6d98463 2006-04-14 devnull vec(x0, y0);
89 b6d98463 2006-04-14 devnull }
90 b6d98463 2006-04-14 devnull }
91 b6d98463 2006-04-14 devnull
92 b6d98463 2006-04-14 devnull void
93 b6d98463 2006-04-14 devnull frame(double xs, double ys, double xf, double yf)
94 b6d98463 2006-04-14 devnull {
95 b6d98463 2006-04-14 devnull double osidex, osidey;
96 b6d98463 2006-04-14 devnull osidex = e1->sidex;
97 b6d98463 2006-04-14 devnull osidey = e1->sidey;
98 b6d98463 2006-04-14 devnull e1->left = xs * (e0->left + e0->sidex);
99 b6d98463 2006-04-14 devnull e1->bottom = ys* (e0->bottom + e0->sidey);
100 b6d98463 2006-04-14 devnull e1->sidex = (xf-xs) * e0->sidex;
101 b6d98463 2006-04-14 devnull e1->sidey = (yf-ys) * e0->sidey;
102 b6d98463 2006-04-14 devnull e1->scalex *= (e1->sidex / osidex);
103 b6d98463 2006-04-14 devnull e1->scaley *= (e1->sidey / osidey);
104 b6d98463 2006-04-14 devnull }
105 b6d98463 2006-04-14 devnull
106 b6d98463 2006-04-14 devnull void
107 b6d98463 2006-04-14 devnull line(double x0, double y0, double x1, double y1)
108 b6d98463 2006-04-14 devnull {
109 b6d98463 2006-04-14 devnull move(x0, y0);
110 b6d98463 2006-04-14 devnull vec(x1, y1);
111 b6d98463 2006-04-14 devnull }
112 b6d98463 2006-04-14 devnull
113 b6d98463 2006-04-14 devnull void
114 b6d98463 2006-04-14 devnull move(double xx, double yy)
115 b6d98463 2006-04-14 devnull {
116 b6d98463 2006-04-14 devnull e1->copyx = xx;
117 b6d98463 2006-04-14 devnull e1->copyy = yy;
118 b6d98463 2006-04-14 devnull }
119 b6d98463 2006-04-14 devnull
120 b6d98463 2006-04-14 devnull extern double xmin, ymin, xmax, ymax;
121 b6d98463 2006-04-14 devnull
122 b6d98463 2006-04-14 devnull /* tpic TeX coord system uses millinches, printer's points for pensize */
123 b6d98463 2006-04-14 devnull /* positive y downward, origin at upper left */
124 b6d98463 2006-04-14 devnull
125 b6d98463 2006-04-14 devnull #define pHEIGHT 5000.
126 b6d98463 2006-04-14 devnull #define pWIDTH 5000.
127 b6d98463 2006-04-14 devnull #define pPENSIZE 9
128 b6d98463 2006-04-14 devnull #define pPSIZE 10
129 b6d98463 2006-04-14 devnull #define pDLEN .05
130 b6d98463 2006-04-14 devnull struct penvir E[2] = {
131 b6d98463 2006-04-14 devnull {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN},
132 b6d98463 2006-04-14 devnull {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN}
133 b6d98463 2006-04-14 devnull };
134 b6d98463 2006-04-14 devnull struct penvir *e0 = E, *e1 = &E[1];
135 b6d98463 2006-04-14 devnull FILE *TEXFILE;
136 b6d98463 2006-04-14 devnull
137 b6d98463 2006-04-14 devnull void
138 b6d98463 2006-04-14 devnull openpl(void)
139 b6d98463 2006-04-14 devnull {
140 b6d98463 2006-04-14 devnull TEXFILE = stdout;
141 b6d98463 2006-04-14 devnull
142 b6d98463 2006-04-14 devnull space(xmin, ymin, xmax, ymax);
143 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\catcode`@=11\n");
144 b6d98463 2006-04-14 devnull fprintf(TEXFILE, "\\expandafter\\ifx\\csname graph\\endcsname\\relax");
145 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\alloc@4\\box\\chardef\\insc@unt\\graph\\fi\n");
146 b6d98463 2006-04-14 devnull fprintf(TEXFILE, "\\catcode`@=12\n");
147 b6d98463 2006-04-14 devnull fprintf(TEXFILE, "\\setbox\\graph=\\vtop{%%\n");
148 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\baselineskip=0pt \\lineskip=0pt ");
149 b6d98463 2006-04-14 devnull fprintf(TEXFILE, "\\lineskiplimit=0pt\n");
150 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\vbox to0pt{\\hbox{%%\n");
151 b6d98463 2006-04-14 devnull fprintf(TEXFILE, " \\special{pn %d}%%\n", e1->pdiam);
152 b6d98463 2006-04-14 devnull }
153 b6d98463 2006-04-14 devnull
154 b6d98463 2006-04-14 devnull void
155 b6d98463 2006-04-14 devnull range(double x0, double y0, double x1, double y1)
156 b6d98463 2006-04-14 devnull {
157 b6d98463 2006-04-14 devnull e1->xmin = x0;
158 b6d98463 2006-04-14 devnull e1->ymin = y0;
159 b6d98463 2006-04-14 devnull if (x1-x0 < .0000001*e1->sidex)
160 b6d98463 2006-04-14 devnull x1=x0+.0000001;
161 b6d98463 2006-04-14 devnull if (y1-y0 < .0000001*e1->sidey)
162 b6d98463 2006-04-14 devnull y1=y0+.0000001;
163 b6d98463 2006-04-14 devnull e1->scalex = e0->scalex*e1->sidex / (x1 - x0);
164 b6d98463 2006-04-14 devnull e1->scaley = e0->scaley*e1->sidey / (y1 - y0);
165 b6d98463 2006-04-14 devnull }
166 b6d98463 2006-04-14 devnull
167 b6d98463 2006-04-14 devnull void
168 b6d98463 2006-04-14 devnull rmove(double xx, double yy)
169 b6d98463 2006-04-14 devnull {
170 b6d98463 2006-04-14 devnull e1->copyx += xx;
171 b6d98463 2006-04-14 devnull e1->copyy += yy;
172 b6d98463 2006-04-14 devnull }
173 b6d98463 2006-04-14 devnull
174 b6d98463 2006-04-14 devnull void
175 b6d98463 2006-04-14 devnull rvec(double xx, double yy)
176 b6d98463 2006-04-14 devnull {
177 b6d98463 2006-04-14 devnull vec(xx+e1->copyx, yy+e1->copyy);
178 b6d98463 2006-04-14 devnull }
179 b6d98463 2006-04-14 devnull
180 b6d98463 2006-04-14 devnull void
181 b6d98463 2006-04-14 devnull sbox(double x0, double y0, double x1, double y1)
182 b6d98463 2006-04-14 devnull {
183 b6d98463 2006-04-14 devnull fprintf(TEXFILE," \\special{bk}%%\n");
184 b6d98463 2006-04-14 devnull box(x0, y0, x1, y1);
185 b6d98463 2006-04-14 devnull }
186 b6d98463 2006-04-14 devnull
187 b6d98463 2006-04-14 devnull void
188 b6d98463 2006-04-14 devnull vec(double xx, double yy)
189 b6d98463 2006-04-14 devnull {
190 b6d98463 2006-04-14 devnull fprintf(TEXFILE," \\special{pa %d %d}",TRX(e1->copyx),TRY(e1->copyy));
191 b6d98463 2006-04-14 devnull e1->copyx = xx;
192 b6d98463 2006-04-14 devnull e1->copyy = yy;
193 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{pa %d %d}",TRX(xx),TRY(yy));
194 b6d98463 2006-04-14 devnull switch(e1->pen){
195 b6d98463 2006-04-14 devnull case DASHPEN:
196 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break;
197 b6d98463 2006-04-14 devnull case DOTPEN:
198 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break;
199 b6d98463 2006-04-14 devnull case SOLIDPEN:
200 b6d98463 2006-04-14 devnull default:
201 b6d98463 2006-04-14 devnull fprintf(TEXFILE,"\\special{fp}%%\n"); break;
202 b6d98463 2006-04-14 devnull }
203 b6d98463 2006-04-14 devnull }