void strmar (gadouble xx1, gadouble yy1, gadouble xx2, gadouble yy2) { gadouble dir; dir = atan2(yy2-yy1,xx2-xx1); gxplot (xx2,yy2,3); gxplot (xx2+0.05*cos(dir+a150),yy2+0.05*sin(dir+a150),2); gxplot (xx2,yy2,3); gxplot (xx2+0.05*cos(dir-a150),yy2+0.05*sin(dir-a150),2); gxplot (xx2,yy2,3); }
void chksid (void) { gaint *f1,*f4; gaint i,j; gadouble x,y; f1 = flgh; f4 = flgv; for (j=1; j<=jmax; j++) { for (i=1; i<=imax; i++) { if (i<imax) { if (*f1==1) gxcolr(1); else if (*f1==7) gxcolr(3); else if (*f1==8) gxcolr(8); else if (*f1==9) gxcolr(4); else if (*f1==0) gxcolr(15); else gxcolr(2); gxconv((gadouble)i,(gadouble)j,&x,&y,3); gxplot(x,y,3); gxconv((gadouble)(i+1),(gadouble)j,&x,&y,3); gxplot(x,y,2); } if (j<jmax) { if (*f4==1) gxcolr(1); else if (*f4==7) gxcolr(3); else if (*f4==8) gxcolr(8); else if (*f4==9) gxcolr(4); else if (*f4==0) gxcolr(15); else gxcolr(2); gxconv((gadouble)i,(gadouble)j,&x,&y,3); gxplot(x,y,3); gxconv((gadouble)i,(gadouble)(j+1),&x,&y,3); gxplot(x,y,2); } f1++; f4++; } } gxfrme (0); }
void gxstrm (gadouble *u, gadouble *v, gadouble *c, gaint is, gaint js, char *umask, char *vmask, char *cmask, gaint flag, gadouble *shdlvs, gaint *shdcls, gaint shdcnt, gaint den) { gadouble x,y,xx,yy; gadouble *up, *vp, *cp, cv1,cv2,cv; gadouble uv1,uv2,uv,vv1,vv2,vv,auv,avv,xsav,ysav,xold=0.0,yold=0.0; gadouble fact,rscl,xxsv,yysv; gaint i,ii,jj,ii1,ij1,i2,j2,ipt,acnt,icol,scol,dis; gaint *it,siz,iacc,iisav,iscl,imn,imx,jmn,jmx,iz,jz,iss,jss,bflg; char *upmask,*vpmask,*cpmask; scol = -9; icol = 1; /* Figure out the interval for the flag grid */ i = is; if (js>i) i = js; iscl = 200/i; iscl = iscl + den - 5; if (iscl<1) iscl=1; if (iscl>10) iscl=10; fact = 0.5/((gadouble)iscl); rscl = (gadouble)iscl; /* Allocate memory for the flag grid */ iss = is*iscl; jss = js*iscl; siz = iss*jss; it = (gaint *)malloc(sizeof(gaint) * siz); if (it==NULL) { printf ("Cannot allocate memory for streamline function\n"); return; } for (i=0; i<siz; i++) *(it+i) = 0; /* Loop through flag grid to look for start of streamlines. To start requires no streams drawn within surrounding flag boxes. */ i2 = 0; j2 = 0; for (i=0; i<siz; i++) { dis = 2; if (den<5) dis = 3; if (den>5) dis = 1; imn = i2-dis; imx = i2+dis+1; jmn = j2-dis; jmx = j2+dis+1; if (imn<0) imn = 0; if (imx>iss) imx = iss; if (jmn<0) jmn = 0; if (jmx>jss) jmx = jss; iacc = 0; for (jz=jmn; jz<jmx; jz++) { ipt = jz*iss+imn; for (iz=imn; iz<imx; iz++) { iacc = iacc + *(it+ipt); ipt++; } } if (iacc==0) { x = ((gadouble)i2)/rscl; y = ((gadouble)j2)/rscl; xsav = x; ysav = y; gxconv (x+1.0,y+1.0,&xx,&yy,3); gxplot (xx,yy,3); xxsv = xx; yysv = yy; iisav = -999; iacc = 0; acnt = 0; bflg = 0; while (x>=0.0 && x<(gadouble)(is-1) && y>=0.0 && y<(gadouble)(js-1)) { ii = (gaint)x; jj = (gaint)y; xx = x - (gadouble)ii; yy = y - (gadouble)jj; up = u + jj*is+ii; upmask = umask + jj*is+ii; vp = v + jj*is+ii; vpmask = vmask + jj*is+ii; if (*upmask==0 || *(upmask+1)==0 || *(upmask+is)==0 || *(upmask+is+1)==0) break; if (*vpmask==0 || *(vpmask+1)==0 || *(vpmask+is)==0 || *(vpmask+is+1)==0) break; if (flag) { cp = c + jj*is+ii; cpmask = cmask + jj*is+ii; if (*cpmask==0 || *(cpmask+1)==0 || *(cpmask+is)==0 || *(cpmask+is+1)==0) icol = 15; else { cv1 = *cp + (*(cp+1)-*cp)*xx; cv2 = *(cp+is) + (*(cp+is+1)-*(cp+is))*xx; cv = cv1 + (cv2-cv1)*yy; icol = gxshdc(shdlvs,shdcls,shdcnt,cv); } if (icol!=scol && icol>-1) gxcolr(icol); scol = icol; } uv1 = *up + (*(up+1)-*up)*xx; uv2 = *(up+is) + (*(up+is+1)-*(up+is))*xx; uv = uv1 + (uv2-uv1)*yy; vv1 = *vp + (*(vp+1)-*vp)*xx; vv2 = *(vp+is) + (*(vp+is+1)-*(vp+is))*xx; vv = vv1 + (vv2-vv1)*yy; auv = fabs(uv); avv=fabs(vv); if (auv<0.1 && avv<0.1) break; if (auv>avv) { vv = vv*fact/auv; uv = uv*fact/auv; } else { uv = uv*fact/avv; vv = vv*fact/avv; } x = x + uv; y = y + vv; ii1 = (gaint)(x*rscl); ij1 = (gaint)(y*rscl); ii1 = ij1*iss + ii1; if (ii1<0 || ii1>=siz) break; if (*(it+ii1)==1) break; if (ii1!=iisav && iisav>-1) *(it+iisav) = 1; if (ii1==iisav) iacc++; else iacc = 0; if (iacc>10) break; iisav = ii1; gxconv (x+1.0,y+1.0,&xx,&yy,3); if (icol>-1) { if (bflg) { gxplot(xold,yold,3); bflg=0; } gxplot (xx,yy,2); } else bflg = 1; xold = xx; yold = yy; acnt++; if (acnt>20) { if (icol>-1) strmar (xxsv,yysv,xx,yy); acnt = 0; } xxsv = xx; yysv = yy; } bflg = 0; x = xsav; y = ysav; gxconv (x+1.0,y+1.0,&xx,&yy,3); gxplot (xx,yy,3); xxsv = xx; yysv = yy; iisav = -999; iacc = 0; acnt = 19; while (x>=0.0 && x<(gadouble)(is-1) && y>=0.0 && y<(gadouble)(js-1)) { ii = (gaint)x; jj = (gaint)y; xx = x - (gadouble)ii; yy = y - (gadouble)jj; up = u + jj*is+ii; upmask = umask + jj*is+ii; vp = v + jj*is+ii; vpmask = vmask + jj*is+ii; if (*upmask==0 || *(upmask+1)==0 || *(upmask+is)==0 || *(upmask+is+1)==0) break; if (*vpmask==0 || *(vpmask+1)==0 || *(vpmask+is)==0 || *(vpmask+is+1)==0) break; if (flag) { cp = c + jj*is+ii; cpmask = cmask + jj*is+ii; if (*cpmask==0 || *(cpmask+1)==0 || *(cpmask+is)==0 || *(cpmask+is+1)==0) icol = 15; else { cv1 = *cp + (*(cp+1)-*cp)*xx; cv2 = *(cp+is) + (*(cp+is+1)-*(cp+is))*xx; cv = cv1 + (cv2-cv1)*yy; icol = gxshdc(shdlvs,shdcls,shdcnt,cv); } if (icol!=scol && icol>-1) gxcolr(icol); scol = icol; } uv1 = *up + (*(up+1)-*up)*xx; uv2 = *(up+is) + (*(up+is+1)-*(up+is))*xx; uv = uv1 + (uv2-uv1)*yy; vv1 = *vp + (*(vp+1)-*vp)*xx; vv2 = *(vp+is) + (*(vp+is+1)-*(vp+is))*xx; vv = vv1 + (vv2-vv1)*yy; auv = fabs(uv); avv=fabs(vv); if (auv<0.1 && avv<0.1) break; if (auv>avv) { vv = vv*fact/auv; uv = uv*fact/auv; } else { uv = uv*fact/avv; vv = vv*fact/avv; } x = x - uv; y = y - vv; ii1 = (gaint)(x*rscl); ij1 = (gaint)(y*rscl); ii1 = ij1*iss + ii1; if (ii1<0 || ii1>=siz) break; if (*(it+ii1)==1) break; if (ii1!=iisav && iisav>-1) *(it+iisav) = 1; if (ii1==iisav) iacc++; else iacc = 0; if (iacc>10) break; iisav = ii1; gxconv (x+1.0,y+1.0,&xx,&yy,3); if (icol>-1) { if (bflg) { gxplot(xold,yold,3); bflg=0; } gxplot (xx,yy,2); } else bflg = 1; xold = xx; yold = yy; acnt++; if (acnt>20) { if (icol>-1) strmar(xx,yy,xxsv,yysv); acnt = 0; } xxsv = xx; yysv = yy; } } i2++; if (i2==iss) { i2 = 0; j2++; } } free (it); }