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