|
|
1.1 root 1: #include <stdio.h>
2: #include <math.h>
3: #include "pen.h"
4: #define SEGS 256
5: #define ROUND(a) a>0?a+.5:a-.5
6: double sinp, cosp;
7: int place();
8: fill(num,ff)
9: int num[];
10: double *ff[];
11: {
12: register struct seg *sp;
13: register double x, y;
14: int sgap;
15: double slant;
16: struct seg *in, *spend;
17: struct seg ss[4];
18: int so;
19: double X, Y, xyt, **fp;
20: int ymin;
21: int M, *n;
22: double *xpp, *ypp;
23: int fx, fy, flag;
24:
25: if(!internal){
26: in = (struct seg *)malloc((unsigned)(SEGS*sizeof(struct seg)));
27: if(in == 0){
28: fprintf(stderr,"not enough space for fill segments\n");
29: return(1);
30: }
31: spend = in + (SEGS-2);
32: }
33: else {
34: in = ss;
35: spend = &ss[3];
36: }
37: sinp = cos(e1->pslant);
38: cosp = sin(e1->pslant);
39: n = num;
40: fp = ff;
41: sp = in;
42: ymin = 4000;
43: while((M = *n++)){
44: xpp = *fp++;
45: ypp = xpp + 1;
46: x = SCX(*xpp);
47: y = SCY(*ypp);
48: if (cosp) {
49: xyt = sinp * x - cosp * y;
50: y = cosp * x + sinp * y;
51: y = ROUND(y);
52: x = ROUND(xyt);
53: }
54: fx = x;
55: fy = y;
56: flag = 0;
57: while(--M){
58: xpp += 2;
59: ypp += 2;
60: X = SCX(*xpp);
61: Y = SCY(*ypp);
62: if (cosp) {
63: xyt = sinp * X - cosp * Y;
64: Y = cosp * X + sinp * Y;
65: Y = ROUND(Y);
66: X = ROUND(xyt);
67: }
68: check:
69: if ( (Y > y) || (Y==y && X > x)){
70: sp->x = X;
71: sp->y = Y;
72: sp->X = x;
73: sp->Y = y;
74: }
75: else {
76: sp->x = x;
77: sp->y = y;
78: sp->X = X;
79: sp->Y = Y;
80: }
81: x=X;
82: y=Y;
83: sp->stat = 1;
84: if(Y < ymin)
85: ymin = Y;
86: if ( sp->y == sp->Y) {
87: if(sp > in){
88: if ((sp-1)->y == (sp-1)->Y && (sp-1)->y == sp->y) {
89: if (sp->x == (sp - 1)->X) {
90: (sp - 1)->X = sp->X;
91: sp--;
92: } else if (sp->X == (sp - 1)->x) {
93: (sp - 1)->x = sp->x;
94: sp--;
95: }
96: }
97: }
98: }
99: if(sp++ > spend){
100: fprintf(stderr, "Too many sides\n");
101: return(0);
102: }
103: if((M==1) && (flag == 0)){
104: X = fx;
105: Y = fy;
106: flag = 1;
107: goto check;
108: }
109: }
110: }
111: sgap = e0->pgap;
112: slant = e0->pslant;
113: e0->pgap = e1->pgap;
114: e0->pslant = e1->pgap;
115: esave = e1;
116: penUp();
117: fprintf(pltout,"SP %d LT; ",(e1->brush>0)?e1->brush:1);
118: e1 = e0;
119: so = sp - in;
120: realfill(so, in, ymin);
121: e0->pgap = sgap;
122: e0->pslant = slant;
123: e1 = esave;
124: if(e1->brush > 0 && e1->brush != e1->pen)
125: fprintf(pltout,"SP %d ",e1->pen);
126: if(e1->pentype > 0)
127: fprintf(pltout,"LT%d; ",e1->pentype);
128: if(!internal)
129: free(in);
130: return(1);
131: }
132: double xcut();
133: realfill(so, s, yymin)
134: int so, yymin;
135: struct seg *s;
136: {
137: register struct seg *sp, *s1, *s2, *st;
138: register int yb;
139: struct seg *sfin;
140:
141: sfin = s1 = s + so - 1;
142: for (sp = s; sp <= sfin; sp++) {
143: if (sp->stat){
144: if (sp->y == sp->Y){
145: if (sp < sfin) {
146: s2 = sp+1;
147: while(s2<=sfin && s2->y==s2->Y){
148: if (sp->X == s2->x)
149: sp->X = s2->X;
150: else if (sp->x == s2->X)
151: sp->x = s2->x;
152: s2++->stat = 0;
153: }
154: }
155: else s2 = sp;
156: if (s1->y == sp->y &&s2->y == sp->y)
157: sp->stat = 0;
158: else if (s1->Y == sp->y && s2->Y == sp->y)
159: sp->stat = 0;
160: }
161: }
162: s1 = sp;
163: }
164:
165: qsort(s, so, sizeof(struct seg), place);
166: sfin++;
167: s1 = s;
168: yb = s1->y;
169: for(sp=s; yb <= sp->y;sp++);
170: s2 = sp - 1;
171: for (; yb >= yymin; yb--) {
172: if (!(yb % e1->pgap))
173: draw(yb, s1, s2);
174: for (st = s1; st <= s2; st++) {
175: if (st->stat)
176: if (yb <= st->Y)
177: st->stat = 0;
178: }
179: if (sp >= sfin)
180: continue;
181: for (; yb <= (sp->y + 1) && sp < sfin; sp++) {
182: for (st = s1; st <= s2; st++) {
183: if (sp->y == st->Y) {
184: if (sp->x == st->X)
185: st->stat = 0;
186: else if (sp->Y == sp->y && sp->X == st->X)
187: st->stat = 0;
188: }
189: }
190: }
191:
192: s2 = sp - 1;
193: while (!(s1->stat) && s1 < sfin)
194: s1++;
195: }
196: }
197: draw(y, pr1, pr2)
198: int y;
199: struct seg *pr1, *pr2;
200: {
201: register struct seg *pr;
202: register double *xp;
203: double x[32], yy, yi, yii, xi, xii, xj;
204: double *xpe;
205: for(pr=pr1, xp=x; pr <= pr2;pr++){
206: if (pr->stat)
207: if (pr->y != pr->Y){
208: *xp++ = xcut(y, pr->x, pr->y, pr->X, pr->Y);
209: if(xp > &x[31])
210: fprintf(stderr, "Too many intersections\n");
211: }
212: }
213: xpe = xp;
214: if(xpe < &x[1])
215: return;
216: do {
217: xj = 0;
218: for(xp=x+1;xp<xpe;xp++){
219: if(*(xp-1) > *xp){
220: xj = *(xp-1);
221: *(xp-1) = *xp;
222: *xp = xj;
223: }
224: }
225: } while(xj);
226: yy = y;
227: for(xp=x; xp<xpe;xp++){
228: xj = *xp++;
229: if (!cosp)
230: line(xj, (double)yy/e1->scale, *xp, (double)yy/e1->scale);
231: else {
232: xi = sinp * xj + cosp * yy;
233: yi = -cosp * xj + sinp * yy;
234: xii = sinp * *xp + cosp * yy;
235: yii = -cosp * *xp + sinp * yy;
236: line(xi, (double)yi/e1->scale, xii, (double)yii/e1->scale);
237: }
238: }
239:
240: }
241:
242:
243: double xcut(y, x1, y1, x2, y2)
244: {
245: register double dx, dy, xy, x;
246: if (y1 == y2) {
247: x = x1 > x2 ? x1 : x2;
248: return(x);
249: }
250: dy = y1 - y2;
251: dx = x1 - x2;
252: xy = (float)y1 * x2 - x1 * (float)y2;
253: x = (y * dx + xy) / dy;
254: return(x);
255: }
256: place(p1, p2)
257: struct seg *p1, *p2;
258: {
259: if(p1->y > p2->y)
260: return(-1);
261: else if(p1->y < p2->y)
262: return(1);
263: else if(p1->x > p2->x)
264: return(-1);
265: else if(p1->x < p2->x)
266: return(1);
267: else if(p1->X > p2->X)
268: return(-1);
269: else if(p1->X < p2->X)
270: return(1);
271: else if(p1->Y > p2->Y)
272: return(-1);
273: else if(p1->Y < p2->Y)
274: return(1);
275: else return(0);
276: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.