#include#include #include #include #include #include void mashtab (float * ,float *,float * ,int * , int *); minless(float); float ratg (float, float); float ratl (float, float); float alg (float); void graphn (); float x[2][4000],y[2][4000]; void main( int argc, char *argv[] ) { FILE *fl; register i,j; int grd=EGA,grm=EGAHI; int nlines=1; int np[5]; float b[4]={0,0,0,0}; int col[5]={7,7,7,7,7}; int coordgr[4]={20,20,600,330}; char str[255]; unsigned long time; int q; float tmp; if( argc == 2 ) { if( (fl=fopen(argv[1],"r")) == NULL ) exit(0) ; nlines=1; } else { puts("enter number of graphics (1 or 2)"); scanf("%d",&nlines); fflush(stdin); for (j=0 ; j < nlines ; j++) { do { puts("enter file name:"); gets(str); str[strlen(str)]=0; fl=fopen(str,"r"); } while(fl==NULL); } } for(j=0 ; j < nlines ; j++) { char answer; puts("ignore delta x? (y/n)"); do answer = getch(); while (answer!='y' && answer!='n'); for (i=0;!feof(fl);i++) { fscanf(fl,"%f %f",&x[j][i],&y[j][i]); if (i > 3998) break; } np[j]=i-1; if (answer=='y') { x[j][0]=0; for (i=1;i < np[j];i++) x[j][i]=x[j][i-1]+1; } } i=registerbgidriver(EGAVGA_driver); initgraph(&grd,&grm,""); beg: cleardevice(); graphn(x,y,nlines,np,col,coordgr,b); setcolor(RED); outtextxy(10,330,"ESC or change? (y or <-,->,+,-)"); for (;;) {q=getch();if (q!=0) break;} if (q=='0') { b[0]=b[1]=b[2]=b[3]=0; goto beg; } if (q=='y') { outtextxy(10,340,"enter coordinates x1,x2,y1,y2"); scanf("%f %f %f %f",&b[0],&b[1],&b[2],&b[3]); goto beg; } if (q==77) { tmp=b[1]; b[1]+=((b[1]-b[0])*.5); b[0]+=((tmp-b[0])*.5); goto beg; } if (q==75) { tmp=b[1]; b[1]-=((b[1]-b[0])*.5); b[0]-=((tmp-b[0])*.5); goto beg; } if (q==72) { tmp=b[3]; b[3]+=((b[3]-b[2])*.5); b[2]+=((tmp-b[2])*.5); goto beg; } if (q==80) { tmp=b[3]; b[3]-=((b[3]-b[2])*.5); b[2]-=((tmp-b[2])*.5); goto beg; } if (q==43) { b[1]-=((b[1]-b[0])*.5); b[3]-=((b[3]-b[2])*.5); goto beg; } if (q==45) { b[1]+=((b[1]-b[0])*.5); b[3]+=((b[3]-b[2])*.5); goto beg; } closegraph(); } void graphn (float xx[2][4000],float yy[2][4000],int nlines,int *npoints, int *col,int *coordgr,float *bound) { int xm,ym; float xmax,ymax,xmin,ymin,gstepx,gstepy,l,ll,kx,ky; int nx,ny,j,i,ii,npmax=0,npx,npxx,npyy,npp,nppn; char str[255]; xm=640; ym=350; for (i=0;i < nlines;i++) if (npoints[i] > npmax) npmax=npoints[i]; { xmax=xx[0][0]; xmin=xx[0][0]; ymax=yy[0][0]; ymin=yy[0][0]; for(j=0;j < nlines;j++) { npx=j*npmax; for(i=0;i < npoints[j];i++) { if (xmax <=xx[j][i]) xmax=xx[j][i]; else if (xmin >= xx[j][i]) xmin=xx[j][i]; if (ymax <= yy[j][i]) ymax=yy[j][i]; else if (ymin >= yy[j][i]) ymin=yy[j][i]; } } } if (bound[1] > bound[0]) { xmin=bound[0]; xmax=bound[1]; } else { bound[0]=xmin; bound[1]=xmax; } if (bound[3] > bound[2]) { ymin=bound[2]; ymax=bound[3]; } else { bound[2]=ymin; bound[3]=ymax; } if(xmax==xmin) return; mashtab(&xmax, &xmin, &gstepx, &nx, &npxx); mashtab(&ymax, &ymin, &gstepy, &ny, &npyy); setcolor(3); /* вертикальная сетка*/ l=(xmax-xmin)/nx; ll=(coordgr[2]-coordgr[0]-30.)/nx; sprintf(str,"%4.0f",xmax); setcolor(col[0]); outtextxy(coordgr[2]-9,coordgr[3]-7,str); for(i=0;i < nx;i++) { sprintf(str,"%4.0f",xmin+l*i); outtextxy(coordgr[0]+ll*i+18,coordgr[3]-7,str); moveto(coordgr[0]+30.+ll*i,coordgr[3]-15); lineto( coordgr[0]+30.+ll*i,coordgr[1]); } l=(ymax-ymin)/ny; ll=(coordgr[3]-coordgr[1]-15.)/ny; sprintf(str,"%4.0f",ymin); outtextxy(coordgr[0],coordgr[3]-18,str); for(i=1;i <= ny;i++) { sprintf(str,"%.3f",ymax-l*(i-1)); outtextxy(coordgr[0],coordgr[1]+ll*(i-1)-4,str); moveto(coordgr[0]+30.,coordgr[1]+ll*i); lineto (coordgr[2],coordgr[1]+ll*i); } kx=(xmax-xmin)/(coordgr[2]-coordgr[0]-30); ky=-(ymax-ymin)/(coordgr[3]-coordgr[1]-15); /* Уточнение физических размеров графика*/ for(j=0;j < nlines;j++) { /*c построение графика*/ setcolor(col[j]); moveto ( (xx[j][0]-xmin)/kx+coordgr[0]+30,-(ymax-yy[j][0])/ky+coordgr[1]); for(i =1;i < npoints[j];i++) { lineto((xx[j][i]-xmin)/kx+coordgr[0]+30,-(ymax-yy[j][i])/ky+coordgr[1]); } } } float ratg (float x, float n) { return ( (int)(x / n + .9999999) * n); } float ratl (float x, float n) { return (minless(x/n) * n); } float alg (float x) { if (x==0) return 0; else return(log10(x)); } void mashtab (xmax, xmin, gstep, n, n_d) /* 'допустимые значения шагов*/ float * xmax,* xmin, * gstep; int * n, *n_d; { float h[4],delta,delta1; int k,i,numb,n_l[4]; h[0] = 1; n_l[0]=1; h[1] = .5; n_l[1]=2; h[2] = .25; n_l[2]=3; h[3] = .2; n_l[3]=2; delta = * xmax - * xmin; k = minless(alg(delta)); //printf("\nmashtab\nxmin=%f, xmax=%f",*xmin,*xmax); //printf("delta=%f,pow(10,k)=%f",delta,pow(10,k)); //printf("\ndelta/pow(10,k)=%f",delta/pow(10,k)); delta1 = delta /pow(10, k) + 1.; //printf("\ndelta1=%.20f",delta1); delta1=(int)delta1; if (delta1 >= 5) { * gstep = 1; * n_d=2; } else for (i = 1;i < 4;i++) { numb = (int)(delta1 / h[i] + .999999); if (numb > 11) goto m1; if (numb > 5) { *gstep = h[i]; *n_d = n_l[i]+1; goto m1; } } m1: /* 'xmin = ближайшему меньшему кратному шагу*/ * gstep = * gstep * pow(10,k); * xmin = ratl(*xmin, *gstep); * xmax = ratg(*xmax, *gstep); * n = (int)( (* xmax - * xmin) / * gstep+.5); // if(fmult(* xmax,n_d)==0) *n_d=0; //printf("\nxmin=%f, xmax=%f, gstep=%f, n=%d, n_p=%d",*xmin,*xmax,*gstep,*n,*n_d); } minless(float x) { if ( x <= 0 & (int)x!=x ) return(int)(x-1.); else return(int)(x); }