[BACK]Return to calc.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / plot

Diff for /OpenXM_contrib2/asir2000/plot/calc.c between version 1.3 and 1.6

version 1.3, 2000/08/22 05:04:30 version 1.6, 2002/08/02 08:59:47
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/plot/calc.c,v 1.2 2000/08/21 08:31:50 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/plot/calc.c,v 1.5 2001/10/09 01:36:27 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
   #include "parse.h"
 #include "ifplot.h"  #include "ifplot.h"
 #include <math.h>  #include <math.h>
 #if PARI  #if PARI
 #include "genpari.h"  #include "genpari.h"
 #endif  #endif
   
 double usubstrp(P,double);  #ifndef MAXSHORT
   #define MAXSHORT ((short)0x7fff)
   #endif
   
 void calc(tab,can)  void calc(double **tab,struct canvas *can,int nox)
 double **tab;  
 struct canvas *can;  
 {  {
         double x,y,xmin,ymin,xstep,ystep;          double x,y,xmin,ymin,xstep,ystep;
         int ix,iy;          int ix,iy;
Line 68  struct canvas *can;
Line 69  struct canvas *can;
         V vx,vy;          V vx,vy;
         Obj t,s;          Obj t,s;
   
         initmarker(can,"Evaluating...");          if ( !nox ) initmarker(can,"Evaluating...");
         MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr);          MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr);
         vx = can->vx;          vx = can->vx;
         vy = can->vy;          vy = can->vy;
Line 79  struct canvas *can;
Line 80  struct canvas *can;
         for( ix = 0, x = xmin; ix < w ; ix++, x += xstep ) {          for( ix = 0, x = xmin; ix < w ; ix++, x += xstep ) {
 #if 0  #if 0
                 MKReal(x,r); substp(CO,fr,vx,(P)r,&g);                  MKReal(x,r); substp(CO,fr,vx,(P)r,&g);
                 marker(can,DIR_X,ix);                  if ( !nox ) marker(can,DIR_X,ix);
                 for( iy = 0, y = ymin; iy < h ; iy++, y += ystep )                  for( iy = 0, y = ymin; iy < h ; iy++, y += ystep )
                         tab[ix][iy] = usubstrp(g,y);                          tab[ix][iy] = usubstrp(g,y);
 #endif  #endif
                 BDY(rx) = x; substr(CO,0,fr,vx,x?(P)rx:0,&t); devalr(CO,t,&g);                  BDY(rx) = x; substr(CO,0,fr,vx,x?(Obj)rx:0,&t);
                 marker(can,DIR_X,ix);                  devalr(CO,t,&g);
                   if ( !nox ) marker(can,DIR_X,ix);
                 for( iy = 0, y = ymin; iy < h ; iy++, y += ystep ) {                  for( iy = 0, y = ymin; iy < h ; iy++, y += ystep ) {
                         BDY(ry) = y;                          BDY(ry) = y;
                         substr(CO,0,g,vy,y?(P)ry:0,&t); devalr(CO,t,&s);                          substr(CO,0,g,vy,y?(Obj)ry:0,&t);
                           devalr(CO,t,&s);
                         tab[ix][iy] = ToReal(s);                          tab[ix][iy] = ToReal(s);
                 }                  }
         }          }
 }  }
   
 double usubstrp(p,r)  double usubstrp(P p,double r)
 P p;  
 double r;  
 {  {
         double t;          double t;
         DCP dc;          DCP dc;
Line 118  double r;
Line 119  double r;
         return t;          return t;
 }  }
   
 void qcalc(tab,can)  void qcalc(char **tab,struct canvas *can)
 char **tab;  
 struct canvas *can;  
 {  {
         Q dx,dy,w,h,xstep,ystep,c,q1,q2;          Q dx,dy,w,h,xstep,ystep,c,q1;
         P g,g1,f1,f2,x,y,t,s;          P g,g1,f1,f2,x,y,t,s;
         DCP dc;  
         int ix,iy;          int ix,iy;
         int *a,*pa;          int *a,*pa;
         char *px;  
         VECT ss;          VECT ss;
   
   
Line 147  struct canvas *can;
Line 144  struct canvas *can;
                         for ( iy = 0; iy < can->height; iy++ )                          for ( iy = 0; iy < can->height; iy++ )
                                 tab[ix][iy] = 1;                                  tab[ix][iy] = 1;
                 else if ( !NUM(g1) ) {                  else if ( !NUM(g1) ) {
                         strum(CO,g1,&ss); seproot(ss,0,can->height,a);                          sturmseq(CO,g1,&ss); seproot(ss,0,can->height,a);
                         for ( iy = 0, pa = a; iy < can->height; iy++, pa++ )                          for ( iy = 0, pa = a; iy < can->height; iy++, pa++ )
                                 if ( *pa < 0 || (*(pa+1) >= 0 && (*pa > *(pa+1))) )                                  if ( *pa < 0 || (*(pa+1) >= 0 && (*pa > *(pa+1))) )
                                         tab[ix][iy] = 1;                                          tab[ix][iy] = 1;
Line 161  struct canvas *can;
Line 158  struct canvas *can;
                         for ( ix = 0; ix < can->width; ix++ )                          for ( ix = 0; ix < can->width; ix++ )
                                 tab[ix][iy] = 1;                                  tab[ix][iy] = 1;
                 else if ( !NUM(g1) ) {                  else if ( !NUM(g1) ) {
                         strum(CO,g1,&ss); seproot(ss,0,can->width,a);                          sturmseq(CO,g1,&ss); seproot(ss,0,can->width,a);
                         for ( ix = 0, pa = a; ix < can->width; ix++, pa++ )                          for ( ix = 0, pa = a; ix < can->width; ix++, pa++ )
                                 if ( *pa < 0 || (*(pa+1) >= 0 && (*pa > *(pa+1))) )                                  if ( *pa < 0 || (*(pa+1) >= 0 && (*pa > *(pa+1))) )
                                         tab[ix][iy] = 1;                                          tab[ix][iy] = 1;
Line 169  struct canvas *can;
Line 166  struct canvas *can;
         }          }
 }  }
   
 strum(vl,p,rp)  void sturmseq(VL vl,P p,VECT *rp)
 VL vl;  
 P p;  
 VECT *rp;  
 {  {
         P g1,g2,q,r,s;          P g1,g2,q,r,s;
         P *t;          P *t;
Line 213  VECT *rp;
Line 207  VECT *rp;
         *rp = ret;          *rp = ret;
 }  }
   
 seproot(s,min,max,ar)  void seproot(VECT s,int min,int max,int *ar)
 VECT s;  
 int min,max;  
 int *ar;  
 {  {
         P f;          P f;
         P *ss;          P *ss;
Line 256  int *ar;
Line 247  int *ar;
         seproot(s,k,j,ar);          seproot(s,k,j,ar);
 }  }
   
 numch(s,n,a0)  int numch(VECT s,Q n,Q a0)
 VECT s;  
 Q n,a0;  
 {  {
         int len,i,c;          int len,i,c;
         Q a;          Q a;
Line 276  Q n,a0;
Line 265  Q n,a0;
         return c;          return c;
 }  }
   
 usubstqp(p,r,v)  void usubstqp(P p,Q r,Q *v)
 P p;  
 Q r;  
 Q *v;  
 {  {
         Q d,d1,a,b,t;          Q d,d1,a,b,t;
         DCP dc;          DCP dc;
Line 302  Q *v;
Line 288  Q *v;
         }          }
 }  }
   
 void plotcalc(can)  void plotcalc(struct canvas *can)
 struct canvas *can;  
 {  {
         double x,xmin,xstep,ymax,ymin,dy;          double x,xmin,xstep,ymax,ymin,dy;
         int ix;          int ix;
Line 324  struct canvas *can;
Line 309  struct canvas *can;
         for( ix = 0, x = xmin; ix < w ; ix++, x += xstep ) {          for( ix = 0, x = xmin; ix < w ; ix++, x += xstep ) {
                 /* full substitution */                  /* full substitution */
                 BDY(rx) = x;                  BDY(rx) = x;
                 substr(CO,0,fr,can->vx,x?(P)rx:0,&s); devalr(CO,(Obj)s,&t);                  substr(CO,0,fr,can->vx,x?(Obj)rx:0,&s);
                   devalr(CO,(Obj)s,&t);
                 if ( t && (OID(t)!=O_N || NID((Num)t)!=N_R) )                  if ( t && (OID(t)!=O_N || NID((Num)t)!=N_R) )
                         error("plotcalc : invalid evaluation");                          error("plotcalc : invalid evaluation");
                 tab[ix] = ToReal((Num)t);                  tab[ix] = ToReal((Num)t);
Line 348  struct canvas *can;
Line 334  struct canvas *can;
         can->pa[0].length = w;          can->pa[0].length = w;
         can->pa[0].pos = pa = (POINT *)MALLOC(w*sizeof(POINT));          can->pa[0].pos = pa = (POINT *)MALLOC(w*sizeof(POINT));
         for ( ix = 0; ix < w; ix++ ) {          for ( ix = 0; ix < w; ix++ ) {
 #ifndef MAXSHORT  
 #define MAXSHORT ((short)0x7fff)  
 #endif  
                 double t;                  double t;
   
                 XC(pa[ix]) = ix;                  XC(pa[ix]) = ix;
Line 360  struct canvas *can;
Line 343  struct canvas *can;
                 else if ( t < -MAXSHORT )                  else if ( t < -MAXSHORT )
                         YC(pa[ix]) = -MAXSHORT;                          YC(pa[ix]) = -MAXSHORT;
                 else                  else
                         YC(pa[ix]) = t;                          YC(pa[ix]) = (long)t;
           }
   }
   
   void polarplotcalc(struct canvas *can)
   {
           double xmax,xmin,ymax,ymin,dx,dy,pmin,pstep;
           int i,nstep;
           double usubstrp();
           int w,h;
           double tr,p;
           double *tabx,*taby;
           POINT *pa;
           Real r;
           Obj fr,t,s;
   
           MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr);
           w = can->width; h = can->height; nstep = can->nzstep;
           pmin = can->zmin; pstep = (can->zmax-can->zmin)/nstep;
           tabx = (double *)ALLOCA(nstep*sizeof(double));
           taby = (double *)ALLOCA(nstep*sizeof(double));
           MKReal(1,r); /* dummy real number */
           for( i = 0, p = pmin; i < nstep ; i++, p += pstep ) {
                   /* full substitution */
                   BDY(r) = p;
                   substr(CO,0,fr,can->vx,p?(Obj)r:0,&s);
                   devalr(CO,(Obj)s,&t);
                   if ( t && (OID(t)!=O_N || NID((Num)t)!=N_R) )
                           error("polarplotcalc : invalid evaluation");
                   tr = ToReal((Num)t);
                   tabx[i] = tr*cos(p);
                   taby[i] = tr*sin(p);
           }
           xmax = xmin = tabx[0];
           ymax = ymin = taby[0];
           for ( i = 1; i < nstep; i++ ) {
                   if ( tabx[i] > xmax ) xmax = tabx[i];
                   if ( tabx[i] < xmin ) xmin = tabx[i];
                   if ( taby[i] > ymax ) ymax = taby[i];
                   if ( taby[i] < ymin ) ymin = taby[i];
           }
           can->xmax = xmax; can->xmin = xmin;
           can->ymax = ymax; can->ymin = ymin;
           dx = xmax-xmin;
           dy = ymax-ymin;
           can->pa = (struct pa *)MALLOC(sizeof(struct pa));
           can->pa[0].length = nstep;
           can->pa[0].pos = pa = (POINT *)MALLOC(w*sizeof(POINT));
           for ( i = 0; i < nstep; i++ ) {
                   XC(pa[i]) = (w-1)*(tabx[i]-xmin)/dx;
                   YC(pa[i]) = (h-1)*(ymax-taby[i])/dy;
         }          }
 }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.6

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>