=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/plot/calc.c,v retrieving revision 1.10 retrieving revision 1.13 diff -u -p -r1.10 -r1.13 --- OpenXM_contrib2/asir2000/plot/calc.c 2014/05/12 16:54:40 1.10 +++ OpenXM_contrib2/asir2000/plot/calc.c 2017/09/04 01:57:53 1.13 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/plot/calc.c,v 1.9 2013/12/19 06:04:09 saito Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/plot/calc.c,v 1.12 2017/08/31 04:21:48 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -68,7 +68,7 @@ void calc(double **tab,struct canvas *can,int nox){ Obj fr,g,t,s; if(!nox)initmarker(can,"Evaluating..."); - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + todouble((Obj)can->formula,&fr); xstep=(can->xmax-can->xmin)/can->width; ystep=(can->ymax-can->ymin)/can->height; MKReal(1.0,rx); MKReal(1.0,ry); // dummy real @@ -101,7 +101,7 @@ void calcq(double **tab,struct canvas *can,int nox){ Obj fr,gm,t,s; Real r,rx,ry; - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + todouble((Obj)can->formula,&fr); MKReal(1.0,rx); MKReal(1.0,ry); // dummy real BDY(rx)=can->xmin; substr(CO,0,fr,can->vx,can->xmin?(Obj)rx:0,&t); devalr(CO,t,&gm); @@ -139,7 +139,7 @@ void calcb(double **tab,struct canvas *can,int nox){ Obj fr,gm,tm,sm; Real r,rx,ry; - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + todouble((Obj)can->formula,&fr); MKReal(1.0,rx); MKReal(1.0,ry); // dummy real BDY(rx)=can->xmin; substr(CO,0,fr,can->vx,can->xmin?(Obj)rx:0,&tm); devalr(CO,tm,&gm); @@ -373,6 +373,60 @@ void usubstqp(P p,Q r,Q *v){ } } +Num tobf(Num,int); + +void plotcalcbf(struct canvas *can){ + Obj fr,s,t; + Num xmin,xmax,ymin,ymax,xstep; + Num u,v,ha,dx,dy,x; + Num *tab; + Real r; + Q w,h1; + int ix; + POINT *pa; + double rr; + Q prec; + NODE arg; + + STOQ(can->prec,prec); arg = mknode(1,prec); Psetprec(arg,&t); + evalr(CO,(Obj)can->formula,can->prec,&fr); + MKReal(can->xmin,r); xmin = tobf((Num)r,can->prec); + MKReal(can->xmax,r); xmax = tobf((Num)r,can->prec); + MKReal(can->ymin,r); ymin = tobf((Num)r,can->prec); + MKReal(can->ymax,r); ymax = tobf((Num)r,can->prec); + STOQ(can->width,w); + subbf(xmax,xmin,&dx); divbf(dx,(Num)w,&xstep); + tab=(Num *)MALLOC(can->width*sizeof(Num)); + for(ix=0,x=xmin;ixwidth;ix++){ + substr(CO,0,fr,can->vx,(Obj)x,(Obj *)&s); + evalr(CO,(Obj)s,can->prec,&t); + if(t&&(OID(t)!=O_N)) + error("plotcalcbf : invalid evaluation"); + tab[ix]=(Num)t; + addbf(x,xstep,&u); x = u; + } + if(!cmpbf(ymax,ymin)){ + for(ymax=ymin=tab[0],ix=1;ixwidth;ix++){ + if(cmpbf(tab[ix],ymax)>0)ymax=tab[ix]; + if(cmpbf(tab[ix],ymin)<0)ymin=tab[ix]; + } + can->ymax=ToReal(ymax);can->ymin=ToReal(ymin); + } + subbf(ymax,ymin,&dy); + can->pa=(struct pa *)MALLOC(sizeof(struct pa)); + can->pa[0].length=can->width; + can->pa[0].pos=pa=(POINT *)MALLOC(can->width*sizeof(POINT)); + STOQ(can->height-1,h1); + for(ix=0;ixwidth;ix++){ + XC(pa[ix])=ix; + subbf(ymax,tab[ix],&u); divbf(u,dy,&v); mulbf(v,(Num)h1,&u); + rr = ToReal(u); + if(rr>MAXSHORT)YC(pa[ix])=MAXSHORT; + else if(rr<-MAXSHORT)YC(pa[ix])=-MAXSHORT; + else YC(pa[ix])=(long)rr; + } +} + void plotcalc(struct canvas *can){ //plot,memory_plot,plotover,plot_resize double x,xmin,xstep,ymax,ymin,dy,*tab,usubstrp(); @@ -381,7 +435,11 @@ void plotcalc(struct canvas *can){ Obj fr,t,s; POINT *pa; - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + if ( can->prec ) { + plotcalcbf(can); + return; + } + todouble((Obj)can->formula,&fr); w=can->width;h=can->height; xmin=can->xmin;xstep=(can->xmax-can->xmin)/w; tab=(double *)ALLOCA(w*sizeof(double)); @@ -419,6 +477,53 @@ void plotcalc(struct canvas *can){ } void polarcalc(struct canvas *can){ + double xmax,xmin,ymax,ymin,dx,dy,pmin,pstep,tr,p,*tabx,*taby; + double usubstrp(); + int i,nstep,w,h; + POINT *pa; + Real r; + Obj fr,t,s; + + todouble((Obj)can->formula,&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;ivx,p?(Obj)r:0,&s); + devalr(CO,(Obj)s,&t); + if(t&&(OID(t)!=O_N||NID((Num)t)!=N_R)) + error("polarcalc : 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;ixmax)xmax=tabx[i]; + if(tabx[i]ymax)ymax=taby[i]; + if(taby[i]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;iformula,(Obj)r,&fr); + todouble((Obj)can->formula,&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)); @@ -476,7 +581,7 @@ void ineqncalc(double **tab,struct canvas *can,int nox V vx,vy; if(!nox) initmarker(can,"Evaluating..."); - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + todouble((Obj)can->formula,&fr); vx=can->vx;vy=can->vy; w=can->width;h=can->height; xmin=can->xmin;xstep=(can->xmax-can->xmin)/w; @@ -508,7 +613,7 @@ void itvcalc(double **mask, struct canvas *can, int no Obj fr,g,t,s; idv=can->division; - MKReal(1.0,r); mulr(CO,(Obj)can->formula,(Obj)r,&fr); + todouble((Obj)can->formula,&fr); vx=can->vx; vy=can->vy; xstep=(can->xmax-can->xmin)/can->width; ystep=(can->ymax-can->ymin)/can->height;