Annotation of OpenXM_contrib2/asir2000/plot/plotp.c, Revision 1.1.1.1
1.1 noro 1: /* $OpenXM: OpenXM/src/asir99/plot/plotp.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
2: #include "ca.h"
3: #include "parse.h"
4: #include "ox.h"
5: #include "ifplot.h"
6:
7: #if defined(sun) && !defined(__svr4__)
8: #define EXP10(a) exp10(a)
9: #else
10: #define EXP10(a) pow(10.0,a)
11: #endif
12:
13: if_print(display,tab,can)
14: DISPLAY *display;
15: double **tab;
16: struct canvas *can;
17: {
18: int ix,iy,width,height;
19: double *px,*px1,*px2;
20: DRAWABLE pix;
21:
22: if ( can->mode == MODE_CONPLOT ) {
23: con_print(display,tab,can); return;
24: }
25: flush();
26: width = can->width; height = can->height; pix = can->pix;
27: for( ix=0; ix<width-1; ix++ )
28: for(iy=0, px=tab[ix], px1 = tab[ix+1], px2 = px+1;
29: iy<height-1 ;iy++, px++, px1++, px2++ )
30: if ( ((*px >= 0) && ((*px1 <= 0) || (*px2 <= 0))) ||
31: ((*px <= 0) && ((*px1 >= 0) || (*px2 >= 0))) ) {
32: DRAWPOINT(display,pix,drawGC,ix,height-iy-1);
33: count_and_flush();
34: }
35: flush();
36: }
37:
38: con_print(display,tab,can)
39: DISPLAY *display;
40: double **tab;
41: struct canvas *can;
42: {
43: int ix,iy,iz,width,height,pas,pai,len;
44: double zstep,z;
45: double *px,*px1,*px2;
46: DRAWABLE pix;
47: POINT *pa,*pa1;
48: struct pa *parray;
49:
50:
51: width = can->width; height = can->height; pix = can->pix;
52: zstep = (can->zmax-can->zmin)/can->nzstep;
53: can->pa = (struct pa *)MALLOC((can->nzstep+1)*sizeof(struct pa));
54: pas = width;
55: pa = (POINT *)ALLOCA(pas*sizeof(POINT));
56: initmarker(can,"Drawing...");
57: for ( z = can->zmin, iz = 0; z <= can->zmax; z += zstep, iz++ ) {
58: marker(can,DIR_Z,iz);
59: pai = 0;
60: for( ix=0; ix<width-1; ix++ )
61: for(iy=0, px=tab[ix], px1 = tab[ix+1], px2 = px+1;
62: iy<height-1 ;iy++, px++, px1++, px2++ )
63: if ( ((*px >= z) && ((*px1 <= z) || (*px2 <= z))) ||
64: ((*px <= z) && ((*px1 >= z) || (*px2 >= z))) ) {
65: if ( pai == pas ) {
66: pa1 = (POINT *)ALLOCA(2*pas*sizeof(POINT));
67: bcopy((char *)pa,(char *)pa1,pas*sizeof(POINT)); pa = pa1;
68: pas += pas;
69: }
70: XC(pa[pai]) = ix; YC(pa[pai]) = height-iy-1; pai++;
71: }
72: can->pa[iz].length = pai;
73: if ( pai ) {
74: pa1 = (POINT *)MALLOC(pai*sizeof(POINT));
75: bcopy((char *)pa,(char *)pa1,pai*sizeof(POINT));
76: can->pa[iz].pos = pa1;
77: }
78: }
79: flush();
80: for ( parray = can->pa, iz = 0; iz <= can->nzstep; iz++, parray++ )
81: for ( pa = parray->pos, len = parray->length, ix = 0; ix < len; ix++ ) {
82: DRAWPOINT(display,pix,drawGC,XC(pa[ix]),YC(pa[ix]));
83: count_and_flush();
84: }
85: flush();
86: }
87:
88: qif_print(display,tab,can)
89: DISPLAY *display;
90: char **tab;
91: struct canvas *can;
92: {
93: int ix,iy,width,height;
94: char *px;
95: DRAWABLE pix;
96:
97: flush();
98: width = can->width; height = can->height; pix = can->pix;
99: for( ix = 0; ix < width; ix++ )
100: for(iy = 0, px = tab[ix]; iy < height ;iy++, px++ )
101: if ( *px ) {
102: DRAWPOINT(display,pix,drawGC,ix,height-iy-1);
103: count_and_flush();
104: }
105: flush();
106: }
107:
108: plot_print(display,can)
109: DISPLAY *display;
110: struct canvas *can;
111: {
112: int len,i;
113: POINT *pa;
114:
115: XDrawLines(display,can->pix,drawGC,
116: can->pa[0].pos,can->pa[0].length,CoordModeOrigin);
117: XFlush(display);
118: }
119:
120: #define D 5
121:
122: pline(display,can,d)
123: DISPLAY *display;
124: struct canvas *can;
125: DRAWABLE d;
126: {
127: double w,w1,k,e,n;
128: int x0,y0,x,y,xadj,yadj;
129: char buf[BUFSIZ];
130: double adjust_scale();
131:
132: if ( can->noaxis )
133: return;
134:
135: xadj = yadj = 0;
136: if ( (can->xmin < 0) && (can->xmax > 0) ) {
137: x0 = (int)((can->width-1)*(-can->xmin/(can->xmax-can->xmin)));
138: DRAWLINE(display,d,dashGC,x0,0,x0,can->height);
139: } else if ( can->xmin >= 0 )
140: x0 = 0;
141: else
142: x0 = can->width-1-D;
143: if ( (can->ymin < 0) && (can->ymax > 0) ) {
144: y0 = (int)((can->height-1)*(can->ymax/(can->ymax-can->ymin)));
145: DRAWLINE(display,d,dashGC,0,y0,can->width,y0);
146: } else if ( can->ymin >= 0 )
147: y0 = can->height-1;
148: else
149: y0 = D;
150: w = can->xmax-can->xmin;
151: w1 = w * DEFAULTWIDTH/can->width;
152: e = adjust_scale(EXP10(floor(log10(w1))),w1);
153: for ( n = ceil(can->xmin/e); n*e<= can->xmax; n++ ) {
154: x = (int)can->width*(n*e-can->xmin)/w;
155: DRAWLINE(display,d,drawGC,x,y0,x,y0-D);
156: sprintf(buf,"%g",n*e);
157: DRAWSTRING(display,d,scaleGC,x+2,y0,buf,strlen(buf));
158: }
159: w = can->ymax-can->ymin;
160: w1 = w * DEFAULTHEIGHT/can->height;
161: e = adjust_scale(EXP10(floor(log10(w1))),w1);
162: for ( n = ceil(can->ymin/e); n*e<= can->ymax; n++ ) {
163: y = (int)can->height*(1-(n*e-can->ymin)/w);
164: DRAWLINE(display,d,drawGC,x0,y,x0+D,y);
165: sprintf(buf,"%g",n*e);
166: if ( can->xmax <= 0 )
167: xadj = TEXTWIDTH(sffs,buf,strlen(buf));
168: DRAWSTRING(display,d,scaleGC,x0-xadj,y,buf,strlen(buf));
169: }
170: }
171:
172: double adjust_scale(e,w)
173: double e,w;
174: {
175: switch ( (int)floor(w/e) ) {
176: case 1:
177: return e/4; break;
178: case 2: case 3:
179: return e/2; break;
180: case 4: case 5: case 6: case 7:
181: return e; break;
182: break;
183: case 8: case 9: case 10: default:
184: return 2*e; break;
185: }
186: }
187:
188: initmarker(can,message)
189: struct canvas *can;
190: char *message;
191: {
192: XawScrollbarSetThumb(can->xdone,0.0,0.0);
193: XawScrollbarSetThumb(can->ydone,1.0,0.0);
194: XFlush(display);
195: }
196:
197: marker(can,dir,p)
198: struct canvas *can;
199: int dir,p;
200: {
201: if ( dir == DIR_X ) {
202: XawScrollbarSetThumb(can->xdone,(float)p/(float)can->width,0.05);
203: count_and_flush();
204: } else if ( dir == DIR_Y ) {
205: XawScrollbarSetThumb(can->ydone,1.0-(float)p/(float)can->height,0.05);
206: count_and_flush();
207: } else {
208: XawScrollbarSetThumb(can->ydone,1.0-(float)p/(float)can->nzstep,0.05);
209: flush();
210: }
211: }
212:
213: define_cursor(w,cur)
214: WINDOW w;
215: CURSOR cur;
216: {
217: XDefineCursor(display,w,cur); flush();
218: }
219:
220: static int flush_count;
221: #if defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__)
222: #define MAX_COUNT 64
223: #else
224: #define MAX_COUNT 32
225: #endif
226:
227: count_and_flush() {
228: if ( ++flush_count == MAX_COUNT )
229: flush();
230: }
231:
232: flush() {
233: flush_count = 0;
234: XFlush(display);
235: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>