#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);
}


Hosted by uCoz