Annotation of OpenXM_contrib2/asir2000/plot/plotp.c, Revision 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>