| version 1.18, 2005/12/21 23:18:16 |
version 1.35, 2018/06/12 07:03:36 |
|
|
| * 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/plotf.c,v 1.17 2005/05/18 03:27:00 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/plot/plotf.c,v 1.34 2018/03/29 01:32:55 noro Exp $ |
| */ |
*/ |
| #include "ca.h" |
#include "ca.h" |
| #include "parse.h" |
#include "parse.h" |
| #include "ox.h" |
#include "ox.h" |
| #include "ifplot.h" |
#include "ifplot.h" |
| |
|
| void Pifplot(), Pconplot(), Pplotover(), Pplot(), Parrayplot(), Pdrawcircle(); |
int validate_ox_plot_stream(int); |
| void Ppolarplot(); |
void ListCheck(char *,LIST); |
| void Pmemory_ifplot(),Pmemory_conplot(),Pmemory_plot(); |
void Pplot(NODE,Obj *); |
| void Popen_canvas(), Pclear_canvas(), Pdraw_obj(), Pdraw_string(); |
void Ppolarplot(NODE,Obj *); |
| void Pox_rpc(); |
void Pobj_cp(NODE,Obj *),Parrayplot(NODE,Obj*),Pdrawcircle(NODE,Obj*); |
| void Pox_cmo_rpc(); |
void Pifplot(NODE,Obj *),Pconplot(NODE,Obj *),Pplotover(NODE,Obj *); |
| |
void Pmemory_ifplot(NODE,Obj *),Pmemory_conplot(NODE,Obj *); |
| |
void Pmemory_plot(NODE,Obj *); |
| |
void ifplot_main(NODE,int,char *,Obj *); |
| |
void plot_main(NODE,int,char *,Obj *); |
| |
void conplot_main(NODE,int,Obj *); |
| |
|
| struct ftab plot_tab[] = { |
void Popen_canvas(NODE,Obj *),Pclear_canvas(NODE,Obj *),Pdraw_obj(NODE,Obj *); |
| {"ifplot",Pifplot,-7}, |
void Pdraw_string(NODE,Obj *); |
| {"memory_ifplot",Pmemory_ifplot,-6}, |
void Pox_rpc(NODE,Obj *), Pox_cmo_rpc(NODE,Obj *); |
| {"conplot",Pconplot,-8}, |
|
| {"memory_conplot",Pmemory_conplot,-7}, |
//NG |
| {"plot",Pplot,-6}, |
#if defined(INTERVAL) |
| {"memory_plot",Pmemory_plot,-5}, |
void Pitvifplot(NODE, Obj *); |
| {"polarplot",Ppolarplot,-6}, |
#endif |
| {"plotover",Pplotover,-4}, |
void PifplotD(NODE,Obj *),PifplotQ(NODE,Obj *),PifplotB(NODE,Obj *); |
| {"drawcircle",Pdrawcircle,5}, |
void PineqnD(NODE,Obj *), PineqnQ(NODE,Obj *), PineqnB(NODE,Obj *); |
| {"open_canvas",Popen_canvas,-3}, |
void PineqnandD(NODE,Obj *), PineqnandQ(NODE,Obj *), PineqnandB(NODE,Obj *); |
| {"clear_canvas",Pclear_canvas,2}, |
void PineqnorD(NODE,Obj *), PineqnorQ(NODE,Obj *), PineqnorB(NODE,Obj *); |
| {"draw_obj",Pdraw_obj,-4}, |
void PineqnxorD(NODE,Obj *), PineqnxorQ(NODE,Obj *), PineqnxorB(NODE,Obj *); |
| {"draw_string",Pdraw_string,-5}, |
void PconplotD(NODE,Obj *),PconplotQ(NODE,Obj *),PconplotB(NODE,Obj *); |
| |
void PpolarplotD(NODE,Obj *); |
| |
void PplotoverD(NODE,Obj *),PplotoverQ(NODE,Obj *),PplotoverB(NODE,Obj *); |
| |
void ifplot_mainNG(NODE,char *,Obj *); |
| |
void conplot_mainNG(NODE,char *,Obj *); |
| |
void plotover_mainNG(NODE,char *,Obj *); |
| |
|
| |
struct ftab plot_tab[]={ |
| |
{PLOT,Pplot,-7}, |
| |
#if defined(INTERVAL) |
| |
{ITVIFPLOT,Pitvifplot,-8}, |
| |
#endif |
| |
{OBJ_CP,Pobj_cp,4}, |
| |
{POLARPLOT,Ppolarplot,-6}, |
| |
{POLARPLOTD,PpolarplotD,-7}, |
| |
{IFPLOT,Pifplot,-7}, |
| |
{IFPLOTD,PifplotD,-8}, |
| |
{IFPLOTQ,PifplotQ,-8}, |
| |
{IFPLOTB,PifplotB,-8}, |
| |
{INEQN,PineqnD,-8}, |
| |
{INEQND,PineqnD,-8}, |
| |
{INEQNQ,PineqnQ,-8}, |
| |
{INEQNB,PineqnB,-8}, |
| |
{INEQNAND,PineqnandD,-4}, |
| |
{INEQNDAND,PineqnandD,-4}, |
| |
{INEQNQAND,PineqnandQ,-4}, |
| |
{INEQNBAND,PineqnandB,-4}, |
| |
{INEQNOR,PineqnorD,-4}, |
| |
{INEQNDOR,PineqnorD,-4}, |
| |
{INEQNQOR,PineqnorQ,-4}, |
| |
{INEQNBOR,PineqnorB,-4}, |
| |
{INEQNXOR,PineqnxorD,-4}, |
| |
{INEQNDXOR,PineqnxorD,-4}, |
| |
{INEQNQXOR,PineqnxorQ,-4}, |
| |
{INEQNBXOR,PineqnxorB,-4}, |
| |
{CONPLOT,Pconplot,-7}, |
| |
{CONPLOTD,PconplotD,-8}, |
| |
{CONPLOTB,PconplotB,-8}, |
| |
{CONPLOTQ,PconplotQ,-8}, |
| |
{PLOTOVER,Pplotover,-4}, |
| |
{PLOTOVERD,PplotoverD,-4}, |
| |
{PLOTOVERQ,PplotoverQ,-4}, |
| |
{PLOTOVERB,PplotoverB,-4}, |
| |
{MEMORY_IFPLOT,Pmemory_ifplot,-7}, |
| |
{MEMORY_CONPLOT,Pmemory_conplot,-7}, |
| |
{MEMORY_PLOT,Pmemory_plot,-7}, |
| |
{DRAWCIRCLE,Pdrawcircle,6}, |
| |
{OPEN_CANVAS,Popen_canvas,-3}, |
| |
{CLEAR_CANVAS,Pclear_canvas,2}, |
| |
{DRAW_OBJ,Pdraw_obj,-4}, |
| |
{DRAW_STRING,Pdraw_string,-5}, |
| |
{0,0,0}, |
| |
}; |
| |
char *pfn[]={ |
| |
IFPLOT,CONPLOT,PLOT,INTERACTIVE,POLARPLOT,PLOTOVER, |
| |
IFPLOTD,IFPLOTQ,IFPLOTB,INEQND,INEQNQ,INEQNB, |
| |
INEQNDAND,INEQNQAND,INEQNBAND, |
| |
INEQNDOR,INEQNQOR,INEQNBOR, |
| |
INEQNDXOR,INEQNQXOR,INEQNBXOR, |
| |
CONPLOTD,CONPLOTQ,CONPLOTB,ITVIFPLOT, |
| |
PLOTOVERD,PLOTOVERQ,PLOTOVERB, |
| |
MEMORY_IFPLOT,MEMORY_CONPLOT,MEMORY_PLOT,ARRAYPLOT,OPEN_CANVAS, |
| |
DRAWCIRCLE,DRAW_OBJ,DRAW_STRING,OBJ_CP,CLEAR_CANVAS,POLARPLOTD}; |
| /* |
/* |
| {"arrayplot",Parrayplot,2}, |
IFPLOT:0,CONPLOT:1,PLOT:2,INTERACTIVE:3,POLARPLOT:4,PLOTOVER:5, |
| |
IFPLOTD:6,IFPLOTQ:7,IFPLOTB:8,INEQND:9,INEQNQ:10,INEQNB:11, |
| |
INEQNDAND:12,INEQNQAND:13,INEQNBAND:14, |
| |
INEQNDOR:15,INEQNQOR:16,INEQNBOR:17, |
| |
INEQNDXOR:18,INEQNQXOR:19,INEQNBXOR:20, |
| |
CONPLOTD:21,CONPLOTQ:22,CONPLOTB:23,ITVIFPLOT:24, |
| |
PLOTOVERD:25,PLOTOVERQ:26,PLOTOVERB:27, |
| |
MEMORY_IFPLOT:28,MEMORY_CONPLOT:29,MEMORY_PLOT:30,ARRAYPLOT:31, |
| |
OPEN_CANVAS:32,DRAWCIRCLE:33,DRAW_OBJ:34,DRAW_STRING:35,OBJ_CP:36, |
| |
CLEAR_CANVAS:37,POLARPLOTD:38 |
| */ |
*/ |
| {0,0,0}, |
int modeNO(char *fn){ |
| }; |
int i; |
| |
char **z; |
| |
for(i=0,z=pfn;*z!=NULL;z++,i++)if(!strcmp(fn,*z))return i; |
| |
return -1; |
| |
} |
| |
|
| void Popen_canvas(NODE arg,Q *rp) |
void Popen_canvas(NODE arg,Obj *rp){ |
| { |
Q w300,s_id; |
| Q w300,s_id; |
LIST geom; |
| LIST geom; |
int stream; |
| int stream; |
NODE n,n0; |
| NODE n,n0; |
STRING fname,wname; |
| STRING fname,wname; |
|
| |
|
| geom = 0; wname = 0; stream = -1; |
geom=0;wname=0;stream=-1; |
| for ( ; arg; arg = NEXT(arg) ) |
for(;arg;arg=NEXT(arg)) |
| if ( !BDY(arg) ) |
if(!BDY(arg)) stream=0; |
| stream = 0; |
else switch (OID(BDY(arg))){ |
| else |
case O_LIST: |
| switch ( OID(BDY(arg)) ) { |
geom=(LIST)BDY(arg); |
| case O_LIST: |
break; |
| geom = (LIST)BDY(arg); |
case O_N: |
| break; |
stream=QTOS((Q)BDY(arg)); |
| case O_N: |
break; |
| stream = QTOS((Q)BDY(arg)); break; |
case O_STR: |
| case O_STR: |
wname=(STRING)BDY(arg); |
| wname = (STRING)BDY(arg); break; |
break; |
| default: |
default: |
| error("open_canvas : invalid argument"); break; |
error("open_canvas : invalid argument"); |
| } |
break; |
| /* open_canvas in ox_plot requires |
} |
| [s_id (Q), |
stream=validate_ox_plot_stream(stream); |
| geom=[xsize,ysize] (LIST), |
STOQ(stream,s_id); |
| wname=name (STRING)] |
if(!geom){ |
| */ |
STOQ(300,w300); |
| |
MKNODE(n0,w300,0); |
| stream = validate_ox_plot_stream(stream); |
MKNODE(n,w300,n0); |
| STOQ(stream,s_id); |
MKLIST(geom,n); |
| if ( !geom ) { |
} |
| STOQ(300,w300); |
MKSTR(fname,OPEN_CANVAS); |
| MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
arg=mknode(4,s_id,fname,geom,wname); |
| } |
Pox_cmo_rpc(arg,rp); |
| MKSTR(fname,"open_canvas"); |
*rp=(Obj)s_id; |
| arg = mknode(4,s_id,fname,geom,wname); |
|
| Pox_cmo_rpc(arg,rp); |
|
| *rp = s_id; |
|
| } |
} |
| |
|
| void ifplot_main(NODE arg,int is_memory, Obj *rp); |
void Pifplot(NODE arg,Obj *rp){ifplot_main(arg,0,IFPLOT,rp);} |
| |
void Pmemory_ifplot(NODE arg,Obj *rp){ifplot_main(arg,1,IFPLOT,rp);} |
| |
|
| void Pifplot(NODE arg,Obj *rp) |
void ifplot_main(NODE arg,int is_memory,char *fn,Obj *rp){ |
| { |
Q m2,p2,w300,s_id; |
| ifplot_main(arg,0,rp); |
NODE defrange; |
| } |
LIST xrange,yrange,zrange,range[2],list,geom=0; |
| |
VL vl,vl0; |
| |
V v[2],av[2]; |
| |
int stream,ri,i,sign; |
| |
Obj poly; |
| |
P var; |
| |
NODE n,n0; |
| |
STRING fname,wname; |
| |
Obj t; |
| |
int found_f; |
| |
|
| void Pmemory_ifplot(NODE arg,Obj *rp) |
STOQ(-2,m2);STOQ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n); |
| { |
poly=0;vl=0;geom=0;wname=0;stream=-1;ri=0;xrange=0;yrange=0;zrange=0; |
| ifplot_main(arg,1,rp); |
v[0]=v[1]=0; |
| |
found_f = 0; |
| |
for(;arg;arg=NEXT(arg)) |
| |
if(!BDY(arg)){ |
| |
if ( !found_f ) { |
| |
poly = 0; |
| |
found_f = 1; |
| |
} else stream=0; |
| |
} else |
| |
switch(OID(BDY(arg))){ |
| |
case O_P: |
| |
poly=(Obj)BDY(arg); |
| |
get_vars_recursive((Obj)poly,&vl); |
| |
for(vl0=vl,i=0;vl0;vl0=NEXT(vl0)){ |
| |
if(vl0->v->attr==(pointer)V_IND){ |
| |
if(i>=2)error("ifplot : invalid argument"); |
| |
else v[i++]=vl0->v; |
| |
} |
| |
} |
| |
found_f = 1; |
| |
break; |
| |
case O_LIST: |
| |
list=(LIST)BDY(arg); |
| |
if(OID(BDY(BDY(list)))==O_P) |
| |
if(ri>1) error("ifplot : invalid argument"); |
| |
else range[ri++]=list; |
| |
else if ( geom ) |
| |
error("ifplot : Two geometries are specified. Probably a variable is missing."); |
| |
else |
| |
geom=list; |
| |
break; |
| |
case O_N: |
| |
if ( !found_f ) { |
| |
poly = (Obj)BDY(arg); |
| |
found_f = 1; |
| |
} else stream=QTOS((Q)BDY(arg)); |
| |
break; |
| |
case O_STR: |
| |
wname=(STRING)BDY(arg);break; |
| |
default: |
| |
error("ifplot : invalid argument");break; |
| |
} |
| |
if(!found_f) error("ifplot : invalid argument"); |
| |
switch(ri){ |
| |
case 0: |
| |
if(!v[1]) error("ifplot : please specify all variables"); |
| |
MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n); |
| |
MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n); |
| |
break; |
| |
case 1: |
| |
if(!v[1]) error("ifplot : please specify all variables"); |
| |
av[0]=VR((P)BDY(BDY(range[0]))); |
| |
if(!poly || NUM(poly) || v[0]==av[0]){ |
| |
xrange=range[0]; |
| |
MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n); |
| |
} else if(v[1]==av[0]){ |
| |
MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n); |
| |
yrange=range[0]; |
| |
} else error("ifplot : invalid argument"); |
| |
break; |
| |
case 2: |
| |
av[0]=VR((P)BDY(BDY(range[0]))); |
| |
av[1]=VR((P)BDY(BDY(range[1]))); |
| |
if(!poly || NUM(poly) || (((v[0]==av[0])&&(!v[1]||v[1]==av[1]))|| |
| |
((v[0]==av[1])&&(!v[1]||v[1]==av[0])))){ |
| |
xrange=range[0];yrange=range[1]; |
| |
} else error("ifplot : invalid argument"); |
| |
break; |
| |
default: |
| |
error("ifplot : cannot happen");break; |
| |
} |
| |
/* ifplot in ox_plot requires |
| |
[s_id (Q), |
| |
formula (Obj), |
| |
xrange=[x,xmin,xmax] (LIST), |
| |
yrange=[y,ymin,ymax] (LIST), |
| |
zrange=0, |
| |
geom=[xsize,ysize] (LIST), |
| |
wname=name (STRING)] |
| |
*/ |
| |
stream=validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| |
if(!geom){ |
| |
STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n); |
| |
} |
| |
if(is_memory){ |
| |
MKSTR(fname,MEMORY_PLOT); |
| |
arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom); |
| |
Pox_rpc(arg,&t); |
| |
arg=mknode(1,s_id); |
| |
Pox_pop_cmo(arg,rp); |
| |
} else { |
| |
MKSTR(fname,fn); |
| |
arg=mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| |
} |
| } |
} |
| |
|
| void ifplot_main(NODE arg,int is_memory, Obj *rp) |
void Pconplot(NODE arg,Obj *rp){conplot_main(arg, 0, rp);} |
| { |
void Pmemory_conplot(NODE arg,Obj *rp){conplot_main(arg,1,rp);} |
| Q m2,p2,w300,s_id; |
|
| NODE defrange; |
|
| LIST xrange,yrange,range[2],list,geom; |
|
| VL vl,vl0; |
|
| V v[2],av[2]; |
|
| int stream,ri,i; |
|
| P poly; |
|
| P var; |
|
| NODE n,n0; |
|
| STRING fname,wname; |
|
| Obj t; |
|
| |
|
| STOQ(-2,m2); STOQ(2,p2); |
void conplot_main(NODE arg,int is_memory,Obj *rp){ |
| MKNODE(n,p2,0); MKNODE(defrange,m2,n); |
Q m2,p2,w300,s_id; |
| poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0; |
NODE defrange; |
| v[0] = v[1] = 0; |
LIST xrange,yrange,zrange,range[3],list,geom; |
| for ( ; arg; arg = NEXT(arg) ) |
VL vl,vl0; |
| if ( !BDY(arg) ) |
V v[2],av[2]; |
| stream = 0; |
int stream,ri,i; |
| else |
P poly; |
| switch ( OID(BDY(arg)) ) { |
P var; |
| case O_P: |
NODE n,n0; |
| poly = (P)BDY(arg); |
STRING fname,wname; |
| get_vars_recursive((Obj)poly,&vl); |
Obj t; |
| for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) ) |
|
| if ( vl0->v->attr == (pointer)V_IND ) |
|
| if ( i >= 2 ) |
|
| error("ifplot : invalid argument"); |
|
| else |
|
| v[i++] = vl0->v; |
|
| break; |
|
| case O_LIST: |
|
| list = (LIST)BDY(arg); |
|
| if ( OID(BDY(BDY(list))) == O_P ) |
|
| if ( ri > 1 ) |
|
| error("ifplot : invalid argument"); |
|
| else |
|
| range[ri++] = list; |
|
| else |
|
| geom = list; |
|
| break; |
|
| case O_N: |
|
| stream = QTOS((Q)BDY(arg)); break; |
|
| case O_STR: |
|
| wname = (STRING)BDY(arg); break; |
|
| default: |
|
| error("ifplot : invalid argument"); break; |
|
| } |
|
| if ( !poly ) |
|
| error("ifplot : invalid argument"); |
|
| switch ( ri ) { |
|
| case 0: |
|
| if ( !v[1] ) |
|
| error("ifplot : please specify all variables"); |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
|
| break; |
|
| case 1: |
|
| if ( !v[1] ) |
|
| error("ifplot : please specify all variables"); |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| if ( v[0] == av[0] ) { |
|
| xrange = range[0]; |
|
| MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
|
| } else if ( v[1] == av[0] ) { |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| yrange = range[0]; |
|
| } else |
|
| error("ifplot : invalid argument"); |
|
| break; |
|
| case 2: |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| av[1] = VR((P)BDY(BDY(range[1]))); |
|
| if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) || |
|
| ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) { |
|
| xrange = range[0]; yrange = range[1]; |
|
| } else |
|
| error("ifplot : invalid argument"); |
|
| break; |
|
| default: |
|
| error("ifplot : cannot happen"); break; |
|
| } |
|
| /* ifplot in ox_plot requires |
|
| [s_id (Q), |
|
| formula (Obj), |
|
| xrange=[x,xmin,xmax] (LIST), |
|
| yrange=[y,ymin,ymax] (LIST), |
|
| zrange=0, |
|
| geom=[xsize,ysize] (LIST), |
|
| wname=name (STRING)] |
|
| */ |
|
| |
|
| stream = validate_ox_plot_stream(stream); |
STOQ(-2,m2); STOQ(2,p2); |
| STOQ(stream,s_id); |
MKNODE(n,p2,0); MKNODE(defrange,m2,n); |
| if ( !geom ) { |
poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0; |
| STOQ(300,w300); |
v[0] = v[1] = 0; |
| MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
for ( ; arg; arg = NEXT(arg) ) |
| } |
if ( !BDY(arg) ) |
| if ( is_memory ) { |
stream = 0; |
| MKSTR(fname,"memory_plot"); |
else |
| arg = mknode(7,s_id,fname,poly,xrange,yrange,0,geom); |
switch ( OID(BDY(arg)) ) { |
| Pox_rpc(arg,&t); |
case O_P: |
| arg = mknode(1,s_id); |
poly = (P)BDY(arg); |
| Pox_pop_cmo(arg,rp); |
get_vars_recursive((Obj)poly,&vl); |
| } else { |
for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) ) |
| MKSTR(fname,"plot"); |
if ( vl0->v->attr == (pointer)V_IND ) |
| arg = mknode(8,s_id,fname,poly,xrange,yrange,0,geom,wname); |
if ( i >= 2 ) |
| Pox_rpc(arg,&t); |
error("ifplot : invalid argument"); |
| *rp = (Obj)s_id; |
else |
| } |
v[i++] = vl0->v; |
| } |
break; |
| |
case O_LIST: |
| |
list = (LIST)BDY(arg); |
| |
if ( OID(BDY(BDY(list))) == O_P ) { |
| |
if ( ri > 2 ) |
| |
error("ifplot : invalid argument"); |
| |
else |
| |
range[ri++] = list; |
| |
} else if ( geom ) |
| |
error("conplot : Two geometries are specified. Probably a variable is missing."); |
| |
else |
| |
geom = list; |
| |
break; |
| |
case O_N: |
| |
stream = QTOS((Q)BDY(arg)); break; |
| |
case O_STR: |
| |
wname = (STRING)BDY(arg); break; |
| |
default: |
| |
error("ifplot : invalid argument"); break; |
| |
} |
| |
if ( !poly ) |
| |
error("ifplot : invalid argument"); |
| |
switch ( ri ) { |
| |
case 0: |
| |
if ( !v[1] ) |
| |
error("ifplot : please specify all variables"); |
| |
MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
| |
MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
| |
MKNODE(n,0,defrange); MKLIST(zrange,n); |
| |
break; |
| |
case 1: |
| |
if ( !v[1] ) |
| |
error("ifplot : please specify all variables"); |
| |
av[0] = VR((P)BDY(BDY(range[0]))); |
| |
if ( v[0] == av[0] ) { |
| |
xrange = range[0]; |
| |
MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
| |
MKNODE(n,0,defrange); MKLIST(zrange,n); |
| |
} else if ( v[1] == av[0] ) { |
| |
MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
| |
yrange = range[0]; |
| |
MKNODE(n,0,defrange); MKLIST(zrange,n); |
| |
} else { |
| |
MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
| |
MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
| |
zrange = range[0]; |
| |
} |
| |
break; |
| |
case 2: case 3: |
| |
av[0] = VR((P)BDY(BDY(range[0]))); |
| |
av[1] = VR((P)BDY(BDY(range[1]))); |
| |
if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) || |
| |
((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) { |
| |
xrange = range[0]; yrange = range[1]; |
| |
if ( ri == 3 ) |
| |
zrange = range[2]; |
| |
else { |
| |
MKNODE(n,0,defrange); MKLIST(zrange,n); |
| |
} |
| |
} else |
| |
error("ifplot : invalid argument"); |
| |
break; |
| |
default: |
| |
error("ifplot : cannot happen"); break; |
| |
} |
| |
/* conplot in ox_plot requires |
| |
[s_id (Q), |
| |
formula (Obj), |
| |
xrange=[x,xmin,xmax] (LIST), |
| |
yrange=[y,ymin,ymax] (LIST), |
| |
zrange=[z,zmin,zmax] (LIST), |
| |
geom=[xsize,ysize] (LIST), |
| |
wname=name (STRING)] |
| |
*/ |
| |
|
| void conplot_main(NODE arg,int is_memory, Obj *rp); |
stream = validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| void Pconplot(NODE arg,Obj *rp) |
if ( !geom ) { |
| { |
STOQ(300,w300); |
| conplot_main(arg,0,rp); |
MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
| |
} |
| |
if ( is_memory ) { |
| |
MKSTR(fname,"memory_plot"); |
| |
arg = mknode(7,s_id,fname,poly,xrange,yrange,zrange,geom); |
| |
Pox_rpc(arg,&t); |
| |
arg = mknode(1,s_id); |
| |
Pox_pop_cmo(arg,rp); |
| |
} else { |
| |
MKSTR(fname,CONPLOT); |
| |
arg = mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname); |
| |
Pox_rpc(arg,&t); |
| |
*rp = (Obj)s_id; |
| |
} |
| } |
} |
| |
|
| void Pmemory_conplot(NODE arg,Obj *rp) |
void Pplot(NODE arg,Obj *rp){plot_main(arg,0,PLOT,rp);} |
| { |
void Pmemory_plot(NODE arg,Obj *rp){plot_main(arg,1,PLOT,rp);} |
| conplot_main(arg,1,rp); |
|
| } |
|
| |
|
| void conplot_main(NODE arg,int is_memory,Obj *rp) |
int plot_by_bigfloat; |
| { |
|
| Q m2,p2,w300,s_id; |
|
| NODE defrange; |
|
| LIST xrange,yrange,zrange,range[3],list,geom; |
|
| VL vl,vl0; |
|
| V v[2],av[2]; |
|
| int stream,ri,i; |
|
| P poly; |
|
| P var; |
|
| NODE n,n0; |
|
| STRING fname,wname; |
|
| Obj t; |
|
| |
|
| STOQ(-2,m2); STOQ(2,p2); |
void plot_main(NODE arg,int is_memory,char *fn,Obj *rp){ |
| MKNODE(n,p2,0); MKNODE(defrange,m2,n); |
Q m2,p2,w300,s_id; |
| poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0; |
NODE defrange; |
| v[0] = v[1] = 0; |
LIST xrange,range[1],list,geom; |
| for ( ; arg; arg = NEXT(arg) ) |
VL vl,vl0; |
| if ( !BDY(arg) ) |
V v[1],av[1]; |
| stream = 0; |
int stream,ri,i,found_f; |
| else |
Obj func; |
| switch ( OID(BDY(arg)) ) { |
P var; |
| case O_P: |
NODE n,n0; |
| poly = (P)BDY(arg); |
STRING fname,wname; |
| get_vars_recursive((Obj)poly,&vl); |
Obj t; |
| for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) ) |
Q prec; |
| if ( vl0->v->attr == (pointer)V_IND ) |
|
| if ( i >= 2 ) |
|
| error("ifplot : invalid argument"); |
|
| else |
|
| v[i++] = vl0->v; |
|
| break; |
|
| case O_LIST: |
|
| list = (LIST)BDY(arg); |
|
| if ( OID(BDY(BDY(list))) == O_P ) |
|
| if ( ri > 2 ) |
|
| error("ifplot : invalid argument"); |
|
| else |
|
| range[ri++] = list; |
|
| else |
|
| geom = list; |
|
| break; |
|
| case O_N: |
|
| stream = QTOS((Q)BDY(arg)); break; |
|
| case O_STR: |
|
| wname = (STRING)BDY(arg); break; |
|
| default: |
|
| error("ifplot : invalid argument"); break; |
|
| } |
|
| if ( !poly ) |
|
| error("ifplot : invalid argument"); |
|
| switch ( ri ) { |
|
| case 0: |
|
| if ( !v[1] ) |
|
| error("ifplot : please specify all variables"); |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
|
| MKNODE(n,0,defrange); MKLIST(zrange,n); |
|
| break; |
|
| case 1: |
|
| if ( !v[1] ) |
|
| error("ifplot : please specify all variables"); |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| if ( v[0] == av[0] ) { |
|
| xrange = range[0]; |
|
| MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
|
| MKNODE(n,0,defrange); MKLIST(zrange,n); |
|
| } else if ( v[1] == av[0] ) { |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| yrange = range[0]; |
|
| MKNODE(n,0,defrange); MKLIST(zrange,n); |
|
| } else { |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| MKV(v[1],var); MKNODE(n,var,defrange); MKLIST(yrange,n); |
|
| zrange = range[0]; |
|
| } |
|
| break; |
|
| case 2: case 3: |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| av[1] = VR((P)BDY(BDY(range[1]))); |
|
| if ( ((v[0] == av[0]) && (!v[1] || v[1] == av[1])) || |
|
| ((v[0] == av[1]) && (!v[1] || v[1] == av[0])) ) { |
|
| xrange = range[0]; yrange = range[1]; |
|
| if ( ri == 3 ) |
|
| zrange = range[2]; |
|
| else { |
|
| MKNODE(n,0,defrange); MKLIST(zrange,n); |
|
| } |
|
| } else |
|
| error("ifplot : invalid argument"); |
|
| break; |
|
| default: |
|
| error("ifplot : cannot happen"); break; |
|
| } |
|
| /* conplot in ox_plot requires |
|
| [s_id (Q), |
|
| formula (Obj), |
|
| xrange=[x,xmin,xmax] (LIST), |
|
| yrange=[y,ymin,ymax] (LIST), |
|
| zrange=[z,zmin,zmax] (LIST), |
|
| geom=[xsize,ysize] (LIST), |
|
| wname=name (STRING)] |
|
| */ |
|
| |
|
| stream = validate_ox_plot_stream(stream); |
STOQ(-2,m2);STOQ(2,p2); |
| STOQ(stream,s_id); |
MKNODE(n,p2,0);MKNODE(defrange,m2,n); |
| if ( !geom ) { |
func=0;vl=0;geom=0;wname=0;stream=-1;ri=0; |
| STOQ(300,w300); |
v[0]=0; |
| MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
found_f = 0; |
| } |
for(;arg;arg=NEXT(arg) ) { |
| if ( is_memory ) { |
if(!BDY(arg) ) |
| MKSTR(fname,"memory_plot"); |
if ( !found_f ) { |
| arg = mknode(7,s_id,fname,poly,xrange,yrange,zrange,geom); |
makevar("x",&var); |
| Pox_rpc(arg,&t); |
v[0] = VR(var); |
| arg = mknode(1,s_id); |
found_f = 1; |
| Pox_pop_cmo(arg,rp); |
} else |
| } else { |
stream=0; |
| MKSTR(fname,"plot"); |
else |
| arg = mknode(8,s_id,fname,poly,xrange,yrange,zrange,geom,wname); |
switch ( OID(BDY(arg)) ){ |
| Pox_rpc(arg,&t); |
case O_P: case O_R: |
| *rp = (Obj)s_id; |
func = (Obj)BDY(arg); |
| } |
get_vars_recursive(func,&vl); |
| |
for(vl0=vl, i=0;vl0;vl0=NEXT(vl0) ){ |
| |
if(vl0->v->attr==(pointer)V_IND ){ |
| |
if(i >= 1 ) error("plot : function must be univariate"); |
| |
else v[i++]=vl0->v; |
| |
} |
| |
} |
| |
found_f = 1; |
| |
break; |
| |
case O_LIST: |
| |
list=(LIST)BDY(arg); |
| |
if(OID(BDY(BDY(list)))==O_P ){ |
| |
if(ri > 0 ) error("plot : too many intervals"); |
| |
else range[ri++]=list; |
| |
} else geom=list; |
| |
break; |
| |
case O_N: |
| |
if ( !found_f ) { |
| |
func = (Obj)BDY(arg); |
| |
makevar("x",&var); |
| |
v[0] = VR(var); |
| |
found_f = 1; |
| |
} else |
| |
stream=QTOS((Q)BDY(arg)); |
| |
break; |
| |
case O_STR: |
| |
wname=(STRING)BDY(arg);break; |
| |
default: |
| |
error("plot : invalid argument");break; |
| |
} |
| |
} |
| |
if(!found_f ) |
| |
error("plot : invalid argument"); |
| |
switch ( ri ){ |
| |
case 0: |
| |
MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n); |
| |
break; |
| |
case 1: |
| |
av[0]=VR((P)BDY(BDY(range[0]))); |
| |
if(!func || NUM(func) || v[0]==av[0] ) |
| |
xrange=range[0]; |
| |
else |
| |
error("plot : invalid argument"); |
| |
break; |
| |
default: |
| |
error("plot : cannot happen");break; |
| |
} |
| |
/* conplot in ox_plot requires |
| |
[s_id (Q), |
| |
formula (Obj), |
| |
xrange=[x,xmin,xmax] (LIST), |
| |
yrange=0, |
| |
zrange=0, |
| |
geom=[xsize,ysize] (LIST), |
| |
wname=name (STRING)] |
| |
*/ |
| |
stream=validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| |
if(!geom ){ |
| |
STOQ(300,w300); |
| |
MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n); |
| |
} |
| |
if(plot_by_bigfloat) |
| |
STOQ(plot_by_bigfloat,prec); |
| |
else |
| |
prec = 0; |
| |
if(is_memory ){ |
| |
MKSTR(fname,MEMORY_PLOT); |
| |
arg=mknode(8,s_id,fname,func,xrange,NULLP,NULLP,geom,prec); |
| |
Pox_rpc(arg,&t); |
| |
arg=mknode(1,s_id); |
| |
Pox_pop_cmo(arg,rp); |
| |
} else { |
| |
MKSTR(fname,fn); |
| |
arg=mknode(9,s_id,fname,func,xrange,NULLP,NULLP,geom,wname,prec); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| |
} |
| } |
} |
| |
|
| void plot_main(NODE arg,int is_memory,Obj *rp); |
#define Pi 3.14159265358979323846264 |
| |
|
| void Pplot(NODE arg,Obj *rp) |
void Ppolarplot(NODE arg,Obj *rp){ |
| { |
Q m2,p2,w300,s_id; |
| plot_main(arg,0,rp); |
NODE defrange,n,n0; |
| |
LIST zrange,range[1],geom,list; |
| |
VL vl,vl0; |
| |
V v[1],av[1]; |
| |
int stream,ri,i; |
| |
P poly,var; |
| |
STRING fname,wname; |
| |
Real pi2; |
| |
Obj t; |
| |
|
| |
MKReal(2*Pi,pi2);MKNODE(n,pi2,0); MKNODE(defrange,0,n); |
| |
poly=0;vl=0;geom=0;wname=0;stream=-1;ri=0;v[0]=0; |
| |
for(;arg;arg=NEXT(arg)){ |
| |
if(!BDY(arg)) stream=0; |
| |
else switch(OID(BDY(arg))){ |
| |
case O_P: case O_R://formula |
| |
poly=(P)BDY(arg); |
| |
get_vars_recursive((Obj)poly,&vl); |
| |
for(vl0=vl,i=0;vl0;vl0=NEXT(vl0)) |
| |
if(vl0->v->attr==(pointer)V_IND) |
| |
if(i>=1)error("polarplot : invalid argument"); |
| |
else v[i++]=vl0->v; |
| |
if(i!=1)error("polarplot : invalid argument"); |
| |
break; |
| |
case O_LIST://range,geomerty |
| |
list=(LIST)BDY(arg); |
| |
if(OID(BDY(BDY(list)))==O_P) |
| |
if(ri>0)error("polarplot : invalid argument"); |
| |
else range[ri++]=list; |
| |
else geom=list; |
| |
break; |
| |
case O_N: |
| |
stream=QTOS((Q)BDY(arg)); |
| |
break; |
| |
case O_STR://wname |
| |
wname=(STRING)BDY(arg); |
| |
break; |
| |
default: |
| |
error("polarplot : invalid argument"); |
| |
break; |
| |
} |
| |
} |
| |
//formular check |
| |
if(!poly)error("polarplot : invalid argument"); |
| |
switch (ri){ |
| |
case 0: |
| |
MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(zrange,n); |
| |
break; |
| |
case 1: |
| |
av[0]=VR((P)BDY(BDY(range[0]))); |
| |
if(v[0]==av[0]) zrange = range[0]; |
| |
else error("polarplot : invalid argument"); |
| |
break; |
| |
default: |
| |
error("polarplot : cannot happen"); |
| |
break; |
| |
} |
| |
stream=validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| |
if(!geom){ |
| |
STOQ(300,w300); |
| |
MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
| |
} |
| |
MKSTR(fname,POLARPLOT); |
| |
arg=mknode(8,s_id,fname,poly,NULLP,NULLP,zrange,geom,wname); |
| |
Pox_rpc(arg,&t); |
| |
*rp=s_id; |
| } |
} |
| |
|
| void Pmemory_plot(NODE arg,Obj *rp) |
void Pplotover(NODE arg,Obj *rp){ |
| { |
Q s_id,w_id,color; |
| plot_main(arg,1,rp); |
P poly; |
| |
STRING fname; |
| |
Obj t; |
| |
poly=(P)ARG0(arg); |
| |
s_id=(Q)ARG1(arg); |
| |
w_id=(Q)ARG2(arg); |
| |
if(argc(arg)==4)color=(Q)ARG3(arg); |
| |
else color=0; |
| |
MKSTR(fname,PLOTOVER); |
| |
arg=mknode(5,s_id,fname,w_id,poly,color); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| } |
} |
| |
|
| void plot_main(NODE arg,int is_memory,Obj *rp) |
void Pdrawcircle(NODE arg,Obj *rp){ |
| { |
Q s_id,index; |
| Q m2,p2,w300,s_id; |
Obj x,y,r,c,t; |
| NODE defrange; |
STRING fname; |
| LIST xrange,range[1],list,geom; |
NODE n; |
| VL vl,vl0; |
LIST pos; |
| V v[1],av[1]; |
|
| int stream,ri,i; |
|
| P poly; |
|
| P var; |
|
| NODE n,n0; |
|
| STRING fname,wname; |
|
| Obj t; |
|
| |
|
| STOQ(-2,m2); STOQ(2,p2); |
x=(Obj)ARG0(arg); |
| MKNODE(n,p2,0); MKNODE(defrange,m2,n); |
y=(Obj)ARG1(arg); |
| poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0; |
r=(Obj)ARG2(arg); |
| v[0] = 0; |
c=(Obj)ARG3(arg); |
| for ( ; arg; arg = NEXT(arg) ) |
s_id=(Q)ARG4(arg); |
| if ( !BDY(arg) ) |
index=(Q)ARG5(arg); |
| stream = 0; |
MKSTR(fname,DRAWCIRCLE); |
| else |
n=mknode(3,x,y,r,c); |
| switch ( OID(BDY(arg)) ) { |
MKLIST(pos,n); |
| case O_P: case O_R: |
arg=mknode(5,s_id,fname,index,pos,c); |
| poly = (P)BDY(arg); |
Pox_rpc(arg,&t); |
| get_vars_recursive((Obj)poly,&vl); |
*rp=(Obj)s_id; |
| for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) ) |
|
| if ( vl0->v->attr == (pointer)V_IND ) |
|
| if ( i >= 1 ) |
|
| error("ifplot : invalid argument"); |
|
| else |
|
| v[i++] = vl0->v; |
|
| if ( i != 1 ) |
|
| error("ifplot : invalid argument"); |
|
| break; |
|
| case O_LIST: |
|
| list = (LIST)BDY(arg); |
|
| if ( OID(BDY(BDY(list))) == O_P ) |
|
| if ( ri > 0 ) |
|
| error("plot : invalid argument"); |
|
| else |
|
| range[ri++] = list; |
|
| else |
|
| geom = list; |
|
| break; |
|
| case O_N: |
|
| stream = QTOS((Q)BDY(arg)); break; |
|
| case O_STR: |
|
| wname = (STRING)BDY(arg); break; |
|
| default: |
|
| error("plot : invalid argument"); break; |
|
| } |
|
| if ( !poly ) |
|
| error("plot : invalid argument"); |
|
| switch ( ri ) { |
|
| case 0: |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(xrange,n); |
|
| break; |
|
| case 1: |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| if ( v[0] == av[0] ) |
|
| xrange = range[0]; |
|
| else |
|
| error("plot : invalid argument"); |
|
| break; |
|
| default: |
|
| error("plot : cannot happen"); break; |
|
| } |
|
| /* conplot in ox_plot requires |
|
| [s_id (Q), |
|
| formula (Obj), |
|
| xrange=[x,xmin,xmax] (LIST), |
|
| yrange=0, |
|
| zrange=0, |
|
| geom=[xsize,ysize] (LIST), |
|
| wname=name (STRING)] |
|
| */ |
|
| stream = validate_ox_plot_stream(stream); |
|
| STOQ(stream,s_id); |
|
| if ( !geom ) { |
|
| STOQ(300,w300); |
|
| MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
|
| } |
|
| if ( is_memory ) { |
|
| MKSTR(fname,"memory_plot"); |
|
| arg = mknode(7,s_id,fname,poly,xrange,0,0,geom); |
|
| Pox_rpc(arg,&t); |
|
| arg = mknode(1,s_id); |
|
| Pox_pop_cmo(arg,rp); |
|
| } else { |
|
| MKSTR(fname,"plot"); |
|
| arg = mknode(8,s_id,fname,poly,xrange,0,0,geom,wname); |
|
| Pox_rpc(arg,&t); |
|
| *rp = (Obj)s_id; |
|
| } |
|
| } |
} |
| |
|
| #define Pi 3.14159265358979323846264 |
void Pdraw_obj(NODE arg,Obj *rp){ |
| |
static STRING fname; |
| |
Q s_id,index; |
| |
LIST obj; |
| |
Obj t; |
| |
|
| void Ppolarplot(NODE arg,Q *rp) |
if(!fname)MKSTR(fname,DRAW_OBJ); |
| { |
s_id=(Q)ARG0(arg); |
| Q m2,p2,w300,s_id; |
index=(Q)ARG1(arg); |
| NODE defrange; |
obj=(LIST)ARG2(arg); |
| LIST zrange,range[1],list,geom; |
// ARG3(arg)=color |
| VL vl,vl0; |
if(argc(arg)==4) arg=mknode(5,s_id,fname,index,obj,ARG3(arg)); |
| V v[1],av[1]; |
else arg=mknode(4,s_id,fname,index,obj); |
| int stream,ri,i; |
Pox_cmo_rpc(arg,&t); |
| P poly; |
*rp=(Obj)s_id; |
| P var; |
} |
| NODE n,n0; |
|
| STRING fname,wname; |
|
| Real pi2; |
|
| Obj t; |
|
| |
|
| MKReal(2*Pi,pi2); |
void Pdraw_string(NODE arg,Obj *rp){ |
| MKNODE(n,pi2,0); MKNODE(defrange,0,n); |
static STRING fname; |
| poly = 0; vl = 0; geom = 0; wname = 0; stream = -1; ri = 0; |
STRING str; |
| v[0] = 0; |
Q s_id,index; |
| for ( ; arg; arg = NEXT(arg) ) |
LIST pos; |
| if ( !BDY(arg) ) |
Obj t; |
| stream = 0; |
|
| else |
if(!fname)MKSTR(fname,DRAW_STRING); |
| switch ( OID(BDY(arg)) ) { |
s_id=(Q)ARG0(arg); |
| case O_P: case O_R: |
index=(Q)ARG1(arg); |
| poly = (P)BDY(arg); |
pos=(LIST)ARG2(arg); |
| get_vars_recursive((Obj)poly,&vl); |
str=(STRING)ARG3(arg); |
| for ( vl0 = vl, i = 0; vl0; vl0 = NEXT(vl0) ) |
// ARG4(arg)=color |
| if ( vl0->v->attr == (pointer)V_IND ) |
if(argc(arg)==5) arg=mknode(6,s_id,fname,index,pos,str,ARG4(arg)); |
| if ( i >= 1 ) |
else arg=mknode(5,s_id,fname,index,pos,str); |
| error("polarplot : invalid argument"); |
Pox_cmo_rpc(arg,&t); |
| else |
*rp=(Obj)s_id; |
| v[i++] = vl0->v; |
|
| if ( i != 1 ) |
|
| error("polarplot : invalid argument"); |
|
| break; |
|
| case O_LIST: |
|
| list = (LIST)BDY(arg); |
|
| if ( OID(BDY(BDY(list))) == O_P ) |
|
| if ( ri > 0 ) |
|
| error("polarplot : invalid argument"); |
|
| else |
|
| range[ri++] = list; |
|
| else |
|
| geom = list; |
|
| break; |
|
| case O_N: |
|
| stream = QTOS((Q)BDY(arg)); break; |
|
| case O_STR: |
|
| wname = (STRING)BDY(arg); break; |
|
| default: |
|
| error("polarplot : invalid argument"); break; |
|
| } |
|
| if ( !poly ) |
|
| error("polarplot : invalid argument"); |
|
| switch ( ri ) { |
|
| case 0: |
|
| MKV(v[0],var); MKNODE(n,var,defrange); MKLIST(zrange,n); |
|
| break; |
|
| case 1: |
|
| av[0] = VR((P)BDY(BDY(range[0]))); |
|
| if ( v[0] == av[0] ) |
|
| zrange = range[0]; |
|
| else |
|
| error("polarplot : invalid argument"); |
|
| break; |
|
| default: |
|
| error("polarplot : cannot happen"); break; |
|
| } |
|
| stream = validate_ox_plot_stream(stream); |
|
| STOQ(stream,s_id); |
|
| if ( !geom ) { |
|
| STOQ(300,w300); |
|
| MKNODE(n0,w300,0); MKNODE(n,w300,n0); MKLIST(geom,n); |
|
| } |
|
| MKSTR(fname,"plot"); |
|
| arg = mknode(8,s_id,fname,poly,0,0,zrange,geom,wname); |
|
| Pox_rpc(arg,&t); |
|
| *rp = s_id; |
|
| } |
} |
| |
|
| void Pplotover(NODE arg,Q *rp) |
void Pclear_canvas(NODE arg,Obj *rp){ |
| { |
static STRING fname; |
| Q s_id,index; |
Q s_id,index; |
| P poly; |
Obj t; |
| STRING fname; |
|
| Obj t; |
|
| |
|
| poly = (P)ARG0(arg); |
if(!fname) MKSTR(fname,CLEAR_CANVAS); |
| s_id = (Q)ARG1(arg); |
s_id=(Q)ARG0(arg); |
| index = (Q)ARG2(arg); |
index=(Q)ARG1(arg); |
| MKSTR(fname,"plotover"); |
arg=mknode(3,s_id,fname,index); |
| if ( argc(arg) == 4 ) |
Pox_cmo_rpc(arg,&t); |
| arg = mknode(5,s_id,fname,index,poly,(Q)ARG3(arg)); |
*rp=(Obj)s_id; |
| else |
|
| arg = mknode(4,s_id,fname,index,poly); |
|
| Pox_rpc(arg,&t); |
|
| *rp = s_id; |
|
| } |
} |
| |
//****************************ifplotNG |
| |
/* |
| |
* name ifplot,ineqn,ineqnor,ineqnand,ineqnxor,conplot |
| |
* type |
| |
* D:sign character using double |
| |
* Q:sign character use rational |
| |
* B:Boundary character use sturm theorem |
| |
*/ |
| |
void ListCheck(char * head,LIST list){ |
| |
int i; |
| |
NODE n; |
| |
if(!list){ |
| |
printf("%s zero \n",head); |
| |
return; |
| |
} |
| |
for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n)); |
| |
printf("%s length %d\n",head,i); |
| |
for(i=0,n=(NODE)BDY(list);n;i++,n=NEXT(n)){ |
| |
if(!BDY(n))printf("%d 0\n",i); |
| |
else if(OID(BDY(n))==O_P) printf("%d poly\n",i); |
| |
else if(OID(BDY(n))==O_R) printf("%d real\n",i); |
| |
else if(OID(BDY(n))==O_N) printf("%d %d\n",i,QTOS((Q)BDY(n))); |
| |
} |
| |
} |
| |
|
| /* arg = [x,y,r,s_id,index] */ |
void PifplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTD,rp);} |
| |
void PifplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTQ,rp);} |
| |
void PifplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,IFPLOTB,rp);} |
| |
|
| void Pdrawcircle(NODE arg,Q *rp) |
void PconplotD(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTD,rp);} |
| { |
void PconplotQ(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTQ,rp);} |
| Q s_id,index; |
void PconplotB(NODE arg,Obj *rp){ifplot_mainNG(arg,CONPLOTB,rp);} |
| Obj x,y,r; |
|
| STRING fname; |
|
| NODE n; |
|
| LIST pos; |
|
| Obj t; |
|
| |
|
| x = (Obj)ARG0(arg); |
void PineqnD(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQND,rp);} |
| y = (Obj)ARG1(arg); |
void PineqnQ(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNQ,rp);} |
| r = (Obj)ARG2(arg); |
void PineqnB(NODE arg,Obj *rp){ifplot_mainNG(arg,INEQNB,rp);} |
| s_id = (Q)ARG3(arg); |
|
| index = (Q)ARG4(arg); |
|
| MKSTR(fname,"drawcircle"); |
|
| n = mknode(3,x,y,r); MKLIST(pos,n); |
|
| arg = mknode(4,s_id,fname,index,pos); |
|
| Pox_rpc(arg,&t); |
|
| *rp = s_id; |
|
| } |
|
| |
|
| /* draw_obj(s_id,cindex,point|line); point = [x,y], line = [xa,ya,xb,yb] */ |
#if defined(INTERVAL) |
| void Pdraw_obj(NODE arg,Q *rp) |
void Pitvifplot(NODE arg,Obj *rp){ifplot_mainNG(arg,ITVIFPLOT,rp);} |
| { |
#endif |
| static STRING fname; |
|
| Q s_id,index; |
|
| LIST obj; |
|
| Obj t; |
|
| |
|
| if ( !fname ) { |
void PineqnorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDOR,rp);} |
| MKSTR(fname,"draw_obj"); |
void PineqnorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQOR,rp);} |
| } |
void PineqnorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBOR,rp);} |
| s_id = (Q)ARG0(arg); |
|
| index = (Q)ARG1(arg); |
void PineqnandD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDAND,rp);} |
| obj = (LIST)ARG2(arg); |
void PineqnandQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQAND,rp);} |
| /* ARG3(arg) = color */ |
void PineqnandB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBAND,rp);} |
| if ( argc(arg) == 4 ) |
|
| arg = mknode(5,s_id,fname,index,obj,ARG3(arg)); |
void PineqnxorD(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNDXOR,rp);} |
| else |
void PineqnxorQ(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNQXOR,rp);} |
| arg = mknode(4,s_id,fname,index,obj); |
void PineqnxorB(NODE arg,Obj *rp){plotover_mainNG(arg,INEQNBXOR,rp);} |
| Pox_cmo_rpc(arg,&t); |
|
| *rp = s_id; |
void PplotoverD(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERD,rp);} |
| |
void PplotoverQ(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERQ,rp);} |
| |
void PplotoverB(NODE arg,Obj *rp){plotover_mainNG(arg,PLOTOVERB,rp);} |
| |
|
| |
void Pobj_cp(NODE arg,Obj *rp){ |
| |
//copy canvas |
| |
//1:and,3:copy,6:xor,7:or |
| |
Q sysid,index_A,index_B,op_code; |
| |
STRING fname; |
| |
Obj t; |
| |
sysid=(Q)ARG0(arg); |
| |
index_A=(Q)ARG1(arg); |
| |
index_B=(Q)ARG2(arg); |
| |
op_code=(Q)ARG3(arg); |
| |
MKSTR(fname,OBJ_CP); |
| |
arg=mknode(5,sysid,fname,index_A,index_B,op_code); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)sysid; |
| } |
} |
| |
|
| /* draw_string(s_id,cindex,pos,string,[,color]); pos=[x,y] */ |
void PpolarplotD(NODE arg,Obj *rp){ |
| void Pdraw_string(NODE arg,Q *rp) |
Q m2,p2,w300,defstep,s_id,color; |
| { |
NODE defrange,n,n0,n1,n2; |
| static STRING fname; |
LIST range,geom,list[2]; |
| STRING str; |
VL vl,vl0; |
| Q s_id,index; |
V v[1],av; |
| LIST pos; |
int stream,ri,i,len,iNo,lNo,vNo,sNo,pfine,findG; |
| Obj t; |
P poly,var; |
| |
STRING fname,wname; |
| |
Real pi2; |
| |
Obj t,frst,sec,thr; |
| |
char ebuf[BUFSIZ]; |
| |
|
| if ( !fname ) { |
iNo=lNo=sNo=findG=0;pfine=TRUE; |
| MKSTR(fname,"draw_string"); |
poly=0;vl=0;geom=0;wname=0;color=0;stream=-1;ri=0;v[0]=0; |
| } |
for(;arg;arg=NEXT(arg)){ |
| s_id = (Q)ARG0(arg); |
if(!BDY(arg)) iNo++; |
| index = (Q)ARG1(arg); |
else switch(OID(BDY(arg))){ |
| pos = (LIST)ARG2(arg); |
case O_P: case O_R://formular |
| str = (STRING)ARG3(arg); |
poly=(P)BDY(arg); |
| /* ARG4(arg) = color */ |
get_vars_recursive((Obj)poly,&vl); |
| if ( argc(arg) == 5 ) |
for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){ |
| arg = mknode(6,s_id,fname,index,pos,str,ARG4(arg)); |
if(vl0->v->attr==(pointer)V_IND){ |
| else |
if(vNo>=1){ |
| arg = mknode(5,s_id,fname,index,pos,str); |
sprintf(ebuf,"%s : invalaid argument",POLARPLOT); |
| Pox_cmo_rpc(arg,&t); |
error(ebuf); |
| *rp = s_id; |
} else v[vNo++]=vl0->v; |
| |
} |
| |
} |
| |
if(vNo!=1){ |
| |
sprintf(ebuf,"%s : only uni-variate formular",POLARPLOT); |
| |
error(ebuf); |
| |
} |
| |
break; |
| |
case O_N://color,id,idx,division |
| |
switch (iNo){ |
| |
case 0://color arg |
| |
color=(Q)BDY(arg); |
| |
iNo++; |
| |
break; |
| |
case 1://stream arg |
| |
stream=QTOS((Q)BDY(arg)); |
| |
iNo++; |
| |
break; |
| |
default://error |
| |
sprintf(ebuf,"%s : invalid number arguments",POLARPLOT); |
| |
error(ebuf); |
| |
break; |
| |
} |
| |
break; |
| |
case O_LIST://range,geomerty |
| |
if(lNo<2)list[lNo++]=(LIST)BDY(arg); |
| |
else { |
| |
sprintf(ebuf,"%s : invalid list argument",POLARPLOT); |
| |
error(ebuf); |
| |
} |
| |
break; |
| |
case O_STR://wname |
| |
wname=(STRING)BDY(arg); |
| |
sNo++; |
| |
break; |
| |
default: |
| |
break; |
| |
} |
| |
} |
| |
//formular check |
| |
if(!poly){ |
| |
sprintf(ebuf,"%s : invalid plot argument",POLARPLOT); |
| |
error(ebuf); |
| |
} |
| |
//vars check |
| |
get_vars_recursive((Obj)poly,&vl); |
| |
for(vl0=vl,vNo=0;vl0;vNo++,vl0=NEXT(vl0)){ |
| |
if(vl0->v->attr==(pointer)V_IND){ |
| |
if(vNo>=2){ |
| |
sprintf(ebuf,"%s : invalid plot argument",POLARPLOT); |
| |
error(ebuf); |
| |
} else v[vNo]=vl0->v; |
| |
} |
| |
} |
| |
//list check |
| |
for(i=0;i<lNo;i++){ |
| |
if(OID(BDY(BDY(list[i])))!=O_P){ |
| |
// list first value is number (geometry) |
| |
for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){ |
| |
if(len==0) frst=BDY(n); |
| |
else if(len==1) sec=BDY(n); |
| |
else { |
| |
sprintf(ebuf,"%s : geometry list too long",POLARPLOT); |
| |
error(ebuf); |
| |
} |
| |
} |
| |
if(len!=2){ |
| |
sprintf(ebuf,"%s : geometry requierd 2 numbers", POLARPLOT); |
| |
error(ebuf); |
| |
} else geom=list[i]; |
| |
} else { |
| |
//list first value is var (range) |
| |
av=VR((P)BDY(BDY(list[i]))); |
| |
if(v[0]==av)range=list[i]; |
| |
else { |
| |
sprintf(ebuf,"%s : invalid list length",POLARPLOT); |
| |
error(ebuf); |
| |
} |
| |
} |
| |
} |
| |
// set default |
| |
if(!range){ |
| |
STOQ(DEFAULTPOLARSTEP,defstep);MKReal(2*Pi,pi2);MKV(v[0],var); |
| |
MKNODE(n,defstep,0);MKNODE(n1,pi2,n);MKNODE(n2,0,n1); |
| |
MKNODE(defrange,var,n2);MKLIST(range,defrange); |
| |
} |
| |
if(!geom){ |
| |
STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n); |
| |
} |
| |
stream=validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| |
MKSTR(fname,POLARPLOTD); |
| |
arg=mknode(7,s_id,fname,poly,color,range,geom,wname); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| } |
} |
| |
|
| void Pclear_canvas(NODE arg,Q *rp) |
void ifplot_mainNG(NODE arg,char *fn,Obj *rp){ |
| { |
Q m2,p2,w300,mxgc,s_id,color; |
| static STRING fname; |
NODE defrange,n,n0,n1,n2; |
| Q s_id,index; |
P poly,var; |
| Obj t; |
VL vl,vl0; |
| |
V v[2],av; |
| |
LIST xrange,yrange,zrange,geom,range[2],list[4]; |
| |
int stream,ri,i,j,sign,llen,len,iNo,lNo,vNo,sNo,pfine,findG; |
| |
STRING fname,wname; |
| |
Obj t,frst,sec,thr; |
| |
char ebuf[BUFSIZ]; |
| |
|
| if ( !fname ) { |
iNo=lNo=sNo=findG=0;pfine=TRUE; |
| MKSTR(fname,"clear_canvas"); |
poly=0;stream=-1;wname=0;color=0;stream=0; |
| } |
STOQ(-2,m2);STOQ(2,p2);MKNODE(n,p2,0);MKNODE(defrange,m2,n); |
| s_id = (Q)ARG0(arg); |
STOQ(MAXGC,mxgc); |
| index = (Q)ARG1(arg); |
for(;arg;arg=NEXT(arg)){ |
| arg = mknode(3,s_id,fname,index); |
if(!BDY(arg)) iNo++; |
| Pox_cmo_rpc(arg,&t); |
else switch(OID(BDY(arg))){ |
| *rp = s_id; |
case O_P://formular |
| |
if(pfine){ |
| |
poly=(P)BDY(arg); |
| |
pfine=FALSE; |
| |
} else { |
| |
sprintf(ebuf,"%s : to many plot arguments",fn); |
| |
error(ebuf); |
| |
} |
| |
break; |
| |
case O_N://color,id,idx,division |
| |
switch (iNo){ |
| |
case 0: //color arg |
| |
color=(Q)BDY(arg); |
| |
iNo++; |
| |
break; |
| |
case 1: //stream arg |
| |
stream=QTOS((Q)BDY(arg)); |
| |
iNo++; |
| |
break; |
| |
default: |
| |
sprintf(ebuf,"%s : invalid number arguments",fn); |
| |
error(ebuf); |
| |
break; |
| |
} |
| |
break; |
| |
case O_LIST://xrange,yrange,zrange,geometry |
| |
if(lNo<4) list[lNo++]=(LIST)BDY(arg); |
| |
else { |
| |
sprintf(ebuf,"%s : invalid list argument",fn); |
| |
error(ebuf); |
| |
} |
| |
break; |
| |
case O_STR://wname |
| |
wname=(STRING)BDY(arg); |
| |
sNo++; |
| |
break; |
| |
default: |
| |
break; |
| |
} |
| |
} |
| |
// formular check |
| |
if(!poly){ |
| |
sprintf(ebuf,"%s : invalid plot argument",fn); |
| |
error(ebuf); |
| |
} |
| |
// vars check |
| |
get_vars_recursive((Obj)poly,&vl); |
| |
for(vl0=vl,vNo=0;vl0;vl0=NEXT(vl0)){ |
| |
if(vl0->v->attr==(pointer)V_IND){ |
| |
if(vNo>=2){ |
| |
sprintf(ebuf,"%s : invalid plot argument",fn); |
| |
error(ebuf); |
| |
} else v[vNo++]=vl0->v; |
| |
} |
| |
} |
| |
//list check |
| |
xrange=yrange=zrange=geom=0;frst=sec=thr=0; |
| |
for(i=0;i<lNo;i++){ |
| |
for(llen=0,n=(NODE)BDY(list[i]);n;llen++,n=NEXT(n)); |
| |
if(llen>4){ |
| |
sprintf(ebuf,"%s : invalid list length",fn); |
| |
error(ebuf); |
| |
} |
| |
if(OID(BDY(BDY(list[i])))!=O_P){ |
| |
// First list value is number |
| |
for(len=0,n=(NODE)BDY(list[i]);n;len++,n=NEXT(n)){ |
| |
if(len==0)frst=BDY(n); |
| |
else if(len==1)sec=BDY(n); |
| |
else thr=BDY(n); |
| |
} |
| |
switch(len){ |
| |
case 2: |
| |
if(!strcmp(fn,CONPLOT)){ |
| |
if(thr==0)thr=(Obj)mxgc; |
| |
MKNODE(n,thr,0);MKNODE(n1,sec,n);MKNODE(n2,frst,n1);MKLIST(zrange,n2); |
| |
} else geom=list[i]; |
| |
break; |
| |
case 3: |
| |
zrange=list[i]; |
| |
break; |
| |
case 0: |
| |
case 1: |
| |
default: |
| |
sprintf(ebuf,"%s : invalid list length",fn); |
| |
error(ebuf); |
| |
break; |
| |
} |
| |
} else { |
| |
//xrange,yrange |
| |
av=VR((P)BDY(BDY(list[i]))); |
| |
if(v[0]==av)xrange=list[i]; |
| |
else if(v[1]==av)yrange=list[i]; |
| |
else { |
| |
MKLIST(zrange,NEXT(BDY(list[i]))); |
| |
} |
| |
} |
| |
} |
| |
//set default |
| |
if(!xrange){ |
| |
MKV(v[0],var);MKNODE(n,var,defrange);MKLIST(xrange,n); |
| |
} |
| |
if(!yrange){ |
| |
MKV(v[1],var);MKNODE(n,var,defrange);MKLIST(yrange,n); |
| |
} |
| |
if(!geom){ |
| |
STOQ(300,w300);MKNODE(n0,w300,0);MKNODE(n,w300,n0);MKLIST(geom,n); |
| |
} |
| |
if(!(strcmp(fn,CONPLOTD)&strcmp(fn,CONPLOTQ)&strcmp(fn,CONPLOTB))&!zrange){ |
| |
MKNODE(n,mxgc,0);MKNODE(n1,m2,n);MKNODE(n2,m2,n1);MKLIST(zrange,n2); |
| |
} |
| |
/*new ifplot in ox_plot requires |
| |
[s_id (Q), |
| |
formula (Obj), |
| |
color (Q), |
| |
geom=[xsize,ysize] (LIST optional), |
| |
xrange=[x,xmin,xmax] (LIST optional), |
| |
yrange=[y,ymin,ymax] (LIST optional), |
| |
zrange=[zmin,zmax,zstep] (LIST optional), |
| |
wname=name (STRING optional)], |
| |
itvstep (Q) if ITVIFPLOT */ |
| |
stream=validate_ox_plot_stream(stream); |
| |
STOQ(stream,s_id); |
| |
MKSTR(fname,fn); |
| |
arg=mknode(9,s_id,fname,poly,color,xrange,yrange,zrange,geom,wname); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| } |
} |
| |
|
| #if 0 |
void plotover_mainNG(NODE arg,char *fn,Obj *rp){ |
| void Parrayplot(NODE arg,Obj *rp) |
Q s_id,w_id,color; |
| { |
P poly; |
| int s; |
STRING fname; |
| int id; |
Obj t; |
| |
int iNo,pfine,sfine; |
| |
char ebuf[BUFSIZ]; |
| |
|
| if ( ID((Obj)ARG0(arg)) == O_VECT && ID((Obj)ARG1(arg)) == O_LIST ) { |
pfine=sfine=TRUE; |
| s = current_s; |
iNo=0;poly=0;color=s_id=w_id=0; |
| gensend(s,C_APLOT,0); |
for(;arg;arg=NEXT(arg)){ |
| gensend(s,C_OBJ,ARG0(arg)); gensend(s,C_OBJ,ARG1(arg)); genflush(s); |
if(!BDY(arg)) iNo++; |
| } |
else switch(OID(BDY(arg))){ |
| genrecv(s,&id,rp); |
case O_P://formular |
| |
if(pfine){ |
| |
poly=(P)BDY(arg); |
| |
pfine=FALSE; |
| |
} else { |
| |
sprintf(ebuf,"%s : to many plot arguments",fn); |
| |
error(ebuf); |
| |
} |
| |
break; |
| |
case O_N://color,s_id,w_id |
| |
switch(iNo){ |
| |
case 0://color arg |
| |
color=(Q)BDY(arg); |
| |
iNo++; |
| |
break; |
| |
case 1://stream arg |
| |
s_id=(Q)BDY(arg); |
| |
iNo++; |
| |
break; |
| |
case 2://window arg |
| |
w_id=(Q)BDY(arg); |
| |
iNo++; |
| |
break; |
| |
default://error |
| |
sprintf(ebuf,"%s : to many numbers",fn); |
| |
error(ebuf); |
| |
break; |
| |
} |
| |
break; |
| |
default: |
| |
sprintf(ebuf,"%s : arguments type miss match",fn); |
| |
error(ebuf); |
| |
} |
| |
} |
| |
MKSTR(fname,fn); |
| |
//[s_id (Q), w_id (Q), formula (Obj), color (Q)] |
| |
arg=mknode(5,s_id,fname,w_id,poly,color); |
| |
Pox_rpc(arg,&t); |
| |
*rp=(Obj)s_id; |
| } |
} |
| #endif |
|