#include #include #include #define MAXLPCM 20 int plot(double xp, double yp, int md); int penatr(int mpen, int icol, int ityp, double thick); int newpen(int npen); int qpatr(int mpen, int *lcol, int *ltyp, double *wthick); int pcstr(double xp, double yp, double chi, char *text, double ang, int ns); /***************************************************/ /* static variables and internal subroutines */ /***************************************************/ static double sxo, syo, szi, szj, scs, ss[5], wd1, wd2, dci, dcj; static unsigned char cp[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 }; static unsigned char *mm1, *mm2; static char fval[13]; static float vc; static int kdir=0, icol1, icol2, imx, jmx, kc, kpen, npen, ihsz, mbuf; static void moveto(double x, double y) { if (kdir == 2) plot(y, x, 3); else plot(x, y, 3); } static void drawto(double x, double y) { if (kdir == 2) plot(y, x, 2); else plot(x, y, 2); } static void drw1cont(float *v, int ih, int il, int j, int m) { static int mn[16] = { 8,4,0,12, 12,0,4,8, 0,12,8,4, 4,8,12,0 }; unsigned char *pm1, *pm2; int i, mp, md, khv; float *vp, v0, v1; double dv, frac, x, y, xr, yr, r, rr; i = ih*8+il-1; vp = v+j*imx+i; khv = (m%8)/4+1; mp = 0; pm1=mm1; pm2=mm2; if (npen != kpen) { if (kpen < 4) { npen = kpen; penatr(0, icol1, npen, wd1); } else { npen = kpen; penatr(0, icol2, npen-4, wd2); } } while (khv != 0) { if (khv == 1) { v0 = *vp; v1 = *(vp+1); dv = (v1-v0)/dci; } else { v0 = *vp; v1 = *(vp+imx); dv = (v1-v0)/dcj; } if ((kc<=0) || ((int)dv==0)) { frac = (vc-v0)/(v1-v0); x = sxo+szi*i; y = syo+szj*j; if (khv == 1) x = x + szi*frac; else y = y + szj*frac; if (mp == 0) { xr = x; yr = y; mp = 1; } else { if (mp == 1) { moveto(xr, yr); mp = 2; } drawto(x, y); } } else mp = 0; while (khv != 0) { switch (++m) { case 1: case 11: khv = 2; break; case 7: case 13: khv = 1; break; case 6: j--; pm1 -= ihsz; pm2 -= ihsz; vp -=imx; khv = 2; break; case 2: j++; pm1 += ihsz; pm2 += ihsz; vp +=imx; khv = 1; break; case 3: case 9: j--; pm1 -= ihsz; pm2 -= ihsz; vp -=imx; case 14: i++; if (++il > 7) { il = 0; pm1++; pm2++; } vp++; khv = 2; break; case 5: case 15: j++; pm1 += ihsz; pm2 += ihsz; vp +=imx; case 10: i--; if (--il < 0) { il = 7; pm1--; pm2--; } vp--; khv = 1; break; default: khv = 0; } if ((khv==1) && (*pm1 & cp[il])) { *pm1 = *pm1 ^ cp[il]; m = mn[m]; break; } if ((khv==2) && (*pm2 & cp[il])) { *pm2 = *pm2 ^ cp[il]; m = mn[m]; break; } } } if ((kc==0) && (scs>0.)) { m = m/4; x = x+ss[m]; y = y+ss[m-1]; if (kdir == 2) pcstr(y, x, scs, &fval[4], (3-m)*90., -8); else pcstr(x, y, scs, &fval[4], (m-2)*90., -8); } } /*********************/ /* conts / contx */ /*********************/ int conts(double xorg, double yorg, double wide, double high, int imax, int jmax, double csize) { if ((wide==0.) || (high==0.)) { fprintf(stderr, "conts: area size invalid\n"); return(-1); } if ((imax>1) && (jmax>1)) { kdir = 1; imx = imax; jmx = jmax; } else if ((imax<-1) && (jmax<-1)) { kdir = 2; imx = -jmax; jmx = -imax; } if (kdir == 0) { fprintf(stderr, "conts: array size rejected\n"); return(-1); } ihsz = (imx+9)/8; mbuf = ihsz*(jmx*2+2); if (mbuf > 1048576) { fprintf(stderr, "conts: huge array (%d)*(%d)\n", imx, jmx); } if (kdir == 1) { sxo = xorg; syo = yorg; szi = wide/(imx-1); szj = high/(jmx-1); } else { sxo = yorg; syo = xorg; szi = high/(imx-1); szj = wide/(jmx-1); } scs = csize; ss[3] = ((kdir==1)? (scs/12.): -(scs/12.)); ss[2] = scs/2.; ss[1] = -ss[3]; ss[0] = -ss[2]; ss[4] = ss[0]; return(0); } int contx(float *v, float undef, int istep, int lcapt, int lml, int lmh, int kln) { int j, i, ih, il, ihmx; int ispen, klnt, klnp, klnc, iv, kv, ke; float vmin, vmax, *vp, *vpe, *vp1, *vp2; unsigned char *pbf; if ((istep<=0) || (lcapt==0) || (lml>lmh) || (kln<0) || (kln>16)) { fprintf(stderr, "contx: parameter value invalid\n"); return(-1); } if (kdir == 0) { fprintf(stderr, "contx: invalid array size\n"); return(-1); } if ((pbf=calloc(mbuf,1)) == NULL) { fprintf(stderr, "contx: memory allocation fail\n"); return(-1); } ihmx = (imx+9)/8; vpe = v+(imx*jmx); for (vp=v; vp= vpe) { fprintf(stderr, "contx: no valid data exist\n"); return(-1); } while (++vp < vpe) { if (*vp != undef) { if (*vp < vmin) vmin = *vp; else if (*vp > vmax) vmax = *vp; } } kv = (int)(vmin/istep); if (vmin > 0.) kv++; ke = (int)(vmax/istep); if (vmax > 0.) ke++; dci = szi*MAXLPCM*istep; dcj = szj*MAXLPCM*istep; ispen = qpatr(1,&icol1,&klnt,&wd1); qpatr(2,&icol2,&klnt,&wd2); klnt = (kln % 10); klnp = (klnt-1)%3+1; klnc = ((klnt<4)? klnp: ((klnt<7)? 0: -1)); if (kln >= 10) klnc += 4; npen = -1; while (kv < ke) { iv = istep*kv; vc = (float)iv; kc = (abs(kv) % lcapt); kv++; if ((ivlmh)) continue; if ((kc==0) && (klnc<0)) continue; if (lcapt < 0) kc = -kc; if (kc == 0) { kpen = klnc; sprintf(fval, "%11d.", iv); } else kpen = klnp; for (vp=v,vp1=v+1,vp2=v+imx,j=0; j=vc) && (*vp1=vc)) *mm1 = *mm1 | cp[il]; } if (((j+1) != jmx) && (*vp2 != undef)) { if ((*vp>=vc) && (*vp2=vc)) *mm2 = *mm2 | cp[il]; } } } } for (j=0; j