home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Photo CD Demo 1
/
Demo.bin
/
gle
/
gle
/
graph2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-29
|
32KB
|
1,347 lines
#define GRAPHDEF extern
#include "graph.h"
#include "color.h"
int fitbez(double **pxv, double **pyv, int **pmv,int *pnp, int multivalued);
int var_clear_local(void);
int big_open(char *s);
int big_vec(int nomiss);
int windownorm(void);
int windowdn(int d);
int big_mark(int mnum, double msize);
double fnx(double vv);
double fnx(double vv)
{
if (xx[1].log==true) {
return (log10(vv)-log10(wxmin))/(log10(wxmax)-log10(wxmin))
* xlength + xbl;
} else {
return (((vv-wxmin)/(wxmax-wxmin)) * xlength + xbl);
}
}
double fny(double vv)
{
if (xx[2].log==true) {
return (log10(vv)-log10(wymin))/(log10(wymax)-log10(wymin))
* ylength + ybl;
} else {
return (((vv-wymin)/(wymax-wymin)) * ylength + ybl);
}
}
int bigalli;
static int bigcol1,bigcol2,bigally;
static long bigrecord;
FILE *fptr;
big_open(char *infile2)
{
char infile[90];
char *s1,*s2;
strcpy(infile,infile2);
if (infile[strlen(infile)-1] == '$') {
{ int idx,typ;
var_find(infile,&idx,&typ) ;
if (idx>=0) var_getstr(idx,infile);
}}
s1 = strchr(infile,',');
bigrecord = 0;
bigally = bigalli = 0;
bigcol1 = 1; bigcol2 = 2;
if (s1!=NULL) {
s2 = strchr(s1+1,',');
bigcol1 = atoi(s1+1);
if (s2!=NULL) {
if (*(s2+1) == '*') {
bigally = true;
} else {
bigcol2 = atoi(s2+1);
if (bigcol2==0) {
gprint("Expecting \"file.name,xcoloumn,ycolumn\" found [%s] \n",infile);
}
}
*s1 = 0;
}
}
if (infile[strlen(infile)-1] == '$') {
{ int idx,typ;
var_find(infile,&idx,&typ) ;
if (idx>=0) var_getstr(idx,infile);
}}
strlwr(infile);
fptr = fopen(infile,"r");
if (s1!=NULL) *s1 = ',';
if (fptr==NULL) {
gprint("Unable to open data file {%s} \n",infile);
return;
}
}
int big_line(double *x1, double *y1, int *m);
big_line(double *x1, double *y1, int *m)
{
static char *bigee;
int bg1;
static int ntk;
if (fptr==NULL) return;
next_line:;
if (bigally) {
if (bigalli==0 || bigalli>=ntk) {
if (bigee!=NULL) { myfree(bigee); bigee = 0;}
if (feof(fptr)) return;
fgets(ebuff,390,fptr);
bigee = sdup(ebuff);
bigalli = 0;
}
strcpy(ebuff,bigee);
token_data(ebuff,tk,&ntk,tkbuff);
*x1 = ++bigrecord;
*y1 = atof(tk[++bigalli]);
*m = false;
if (feof(fptr) || abort_key()) {*m = true; return;}
return;
}
if (feof(fptr)) return;
fgets(ebuff,390,fptr);
token_data(ebuff,tk,&ntk,tkbuff);
if (ntk<bigcol1 || ntk<bigcol2) goto next_line;
bg1 = bigcol1;
if (bg1==0) bg1 = bigcol2;
if (*tk[bg1] != '*' && *tk[bigcol2] != '*') {
if (bigcol1==0) *x1 = ++bigrecord;
else *x1 = atof(tk[bigcol1]);
*y1 = atof(tk[bigcol2]);
*m = false;
} else { *m = true;}
if (feof(fptr) || abort_key()) {*m = true; return;}
}
setrange(double x, double y, int m)
{
if (m) return;
if (x>range_x2) range_x2 = x;
if (x<range_x1) range_x1 = x;
if (y>range_y2) range_y2 = y;
if (y<range_y1) range_y1 = y;
}
preview_big()
{
int dn;
double x1,y1,x2,y2;
int m1,m2;
for (dn=1;dn<=ndata;dn++) {
if (dp[dn]!=NULL) {
if (dp[dn]->bigfile!=NULL && dp[dn]->autoscale) {
big_open(dp[dn]->bigfile);
if (fptr==NULL) goto endbigm;
if (feof(fptr)) goto xxx;
for (;;) {
aaa2: if (feof(fptr) || abort_key()) goto xxx;
big_line(&x1,&y1,&m1);
setrange(x1,y1,m1);
}
xxx: big_close();
endbigm: ;
}
}
}
}
request()
{
static char s[20];
gprint("Press return to continue \n");
gets(s);
}
draw_bars()
{
int b,nb,d,i,di,df,dt;
long sidecolor,topcolor;
double x3d,y3d;
int notop;
double *px,*py,xzz,*xt,*yt,*xf,*yf,bwid,whole_wid,bdis,yfval;
int *m;
double x,y,w;
for (b=1;b<=g_nbar;b++) {
done_line = true;
if (br[b]==0) { gprint("Error, bars struct zero \n"); return;}
nb = br[b]->ngrp; /* number of bars in each group */
d = br[b]->to[0]; /* dataset for first bar */
if (d==0 || dp[d]==NULL) {gprint("Error, bars zero dataset \n");return;}
/* find the smallest x distance in dataset 1 */
px = dp[d]->xv;
py = dp[d]->yv;
if (px==NULL || nb==0) { gprint("error in bar data dn=%d ngrp=%d\n",d,nb); return;}
m = dp[d]->miss;
xzz = 1e30;
for (i=1;i<dp[d]->np;i++,px++) {
w = *(px+1) - *(px);
if (w>0) if (w<xzz) xzz = w;
}
if (br[b]->width==0) br[b]->width = xzz/(nb*2);
if (br[b]->dist==0) br[b]->dist = br[b]->width*1.4 ;
bwid = br[b]->width;
bdis = br[b]->dist;
windowdn(d);
g_gsave();
for (di=0;di<nb;di++) {
df = br[b]->from[di];
dt = br[b]->to[di];
whole_wid = (nb-1)*bdis+bwid;
g_set_line_width(br[b]->lwidth[di]);
g_set_line_style(&br[b]->lstyle[di][0]);
if (br[b]->color[di] == 0) br[b]->color[di] = COLOR_BLACK;
g_set_color(br[b]->color[di]);
g_set_fill(br[b]->fill[di]);
x3d = br[b]->x3d;
y3d = br[b]->y3d;
topcolor = br[b]->top[di];
sidecolor = br[b]->side[di];
notop = br[b]->notop;
df = br[b]->from[di];
dt = br[b]->to[di];
if (dp[df]==NULL || dp[dt]==NULL) {
gprint("No data in bargraph datasets\n");
goto bar_exit;
}
yf = dp[df]->yv;
xt = dp[dt]->xv;
yt = dp[dt]->yv;
m = dp[dt]->miss;
if (yt==NULL) {
gprint("No data in bargraph dataset. d(%d) \n",dt);
goto bar_exit;
}
windowdn(d);
for (i=0;i<dp[d]->np;i++,xt++,yt++,m++) {
if (yf!=NULL) yfval = *yf++;
else yfval = 0;
if (!*m) {
draw_bar((*xt)-whole_wid/2+di*bdis,yfval,*yt,bwid
,x3d,y3d,sidecolor,topcolor,notop);
}
}
windownorm();
}
bar_exit:;
g_grestore();
}
}
/*--------------------------------------------------------------------------*/
int box3d(double x1, double y1, double x2, double y2,double x3d,double y3d,long sidecolor, long topcolor, int notop);
draw_bar(double x, double yf, double yt, double wd,double x3d,double y3d,long sidecolor, long topcolor, int notop)
{
double x1,y1,x2,y2;
x = x + wd/2;
/* ! draw a bar, wd wide, CENTREed at x , from yf, to yt, */
x1 = x - wd/2;
y1 = yf;
x2 = x + wd/2;
y2 = yt;
box_clip(&x1,&y1,wxmin,wymin,wxmax,wymax);
box_clip(&x2,&y2,wxmin,wymin,wxmax,wymax);
if (x3d!=0) {
box3d(fnx(x1),fny(y1),fnx(x2),fny(y2),x3d,y3d,sidecolor,topcolor,notop);
}
g_box_fill(fnx(x1),fny(y1),fnx(x2),fny(y2));
g_box_stroke(fnx(x1),fny(y1),fnx(x2),fny(y2));
}
box3d(double x1, double y1, double x2, double y2,double x3d,double y3d,long sidecolor, long topcolor, int notop)
{
/* assuming x3d is positive for the moment */
double xx;
if (x1>x2) { xx = x1; x1 = x2; x2 = xx;}
if (y1>y2) { xx = y1; y1 = y2; y2 = xx;}
x3d = x3d*(x2-x1);
y3d = y3d*(x2-x1);
if (x3d<0) {
xx = x1; x1 = x2; x2 = xx;
}
g_gsave();
g_set_path(true);
g_set_line_join(1); /* use rounded lines to avoid ucky peeks */
g_newpath();
g_move(x2,y1);
g_line(x2+x3d,y1+y3d);
g_line(x2+x3d,y2+y3d);
g_line(x2,y2);
g_line(x2,y1);
if (topcolor!=0) {
g_set_fill(sidecolor);
g_fill();
}
g_stroke();
g_newpath();
if (!notop) { /* now draw top of bar */
g_move(x2,y2);
g_line(x2+x3d,y2+y3d);
g_line(x1+x3d,y2+y3d);
g_line(x1,y2);
g_line(x2,y2);
if (topcolor!=0) {
g_set_fill(topcolor);
g_fill();
}
g_stroke();
}
g_newpath();
g_set_path(false);
g_newpath();
g_grestore();
}
/*------------------------------------------------------------------*/
/*
/*do_smooth()
/*{
/* int i,j;
/* double *x,*y;
/* for (i=1;i<=ndata;i++) {
/* if (dp[i]!=NULL) if (dp[i]->smooth && dp[i]->np>3) {
/* gr_nomiss(i); /* throw away missing points */
/* fitbez(&dp[i]->xv,&dp[i]->yv,&dp[i]->miss,&dp[i]->np);
/* }
/* }
/*}
*/
/*------------------------------------------------------------------*/
gr_thrownomiss()
{
int i,j;
for (i=1;i<=ndata;i++) {
if (dp[i]!=NULL) if (dp[i]->nomiss && dp[i]->np>0) {
gr_nomiss(i); /* throw away missing points */
}
}
}
gr_nomiss(int i)
{
double *nx,*ny,*xt,*yt,oldlwidth;
int *m,*nm;
int dt,dn,k,npnts;
for (dn=1;dn<=ndata;dn++) {
if (dp[dn]!=NULL) if (dp[dn]->xv!=NULL) {
k = 0;
yt = dp[dn]->yv;
xt = dp[dn]->xv;
m = dp[dn]->miss;
nx = xt; ny = yt; nm = m;
npnts = dp[dn]->np;
for (i=0;i<(npnts);i++,m++,xt++,yt++) {
if (!*m) {
*nx++ = *xt;
*ny++ = *yt;
*nm++ = *m;
k++;
}
}
dp[dn]->np = k;
}
}
}
roundrange(double *gmin,double *gmax)
{
double delta,st,expnt,n,dticks;
int ni;
if (*gmax < *gmin) {
*gmax = 100; *gmin = 10;
return;
}
delta = *gmax - *gmin;
if (delta==0) return;
st = delta/10;
expnt = floor(log10(st));
n = st/pow(10,expnt);
if (n>5)
ni = 10;
else if (n>2)
ni = 5;
else if (n>1)
ni = 2;
else
ni = 1;
dticks = ni * pow(10,expnt);
if (*gmin == floor( *gmin/ dticks) * dticks)
*gmin = *gmin - dticks;
else
*gmin = (floor(*gmin/ dticks) * dticks );
if (( floor( *gmax/ dticks) * dticks) != (*gmax / dticks) * dticks )
*gmax = floor(*gmax / dticks ) * dticks + dticks;
else
*gmax = *gmax + dticks;
}
window_set()
{
wxmin = range_x1;
wxmax = range_x2;
wymin = range_y1;
wymax = range_y2;
if (!xx[1].log) roundrange(&wxmin,&wxmax);
if (!xx[2].log) roundrange(&wymin,&wymax);
if (xx[1].minset) wxmin = xx[1].min;
xx[1].min = wxmin;
if (!xx[3].minset) xx[3].min = wxmin;
if (xx[1].maxset) wxmax = xx[1].max;
xx[1].max = wxmax;
if (!xx[3].maxset) xx[3].max = wxmax;
if (xx[2].minset) wymin = xx[2].min;
xx[2].min = wymin;
if (!xx[4].minset) xx[4].min = wymin;
if (xx[2].maxset) wymax = xx[2].max;
xx[2].max = wymax;
if (!xx[4].maxset) xx[4].max = wymax;
/* should go thru datasets to find max,min */
if (wxmin>=wxmax || wymin>=wymax) {
gprint("Warning no data (or no spread) and no min,max so making up range\n");
wxmin = 0;
wxmax = 10;
wymin = 0;
wymax = 10;
}
}
draw_fills()
{
double x1,y1,x2,y2,ymx,lastx,lasty;
double *ssxt,*ssyt,*xt,*yt;
int dt,dn,i,n,*m,npnts,*ssm,free_smoothed=0;
struct fill_data *ff;
/* set clipping region */
for (n=1;n<=nfd;n++) {
if (fd[n]->type==0) return;
done_line = true;
ff = fd[n];
if (wxmin > ff->xmin) ff->xmin = wxmin;
if (wxmax < ff->xmax) ff->xmax = wxmax;
if (wymin > ff->ymin) ff->ymin = wymin;
if (wymax < ff->ymax) ff->ymax = wymax;
g_beginclip(); /* saves current clipping */
g_set_path(true);
g_newpath();
g_move(fnx(ff->xmin),fny(ff->ymin));
g_box_stroke(fnx(ff->xmin),fny(ff->ymin),fnx(ff->xmax),fny(ff->ymax));
g_clip(); /* sets current path to be clipping */
gntmp = 0;
dn = ff->da;
if (dp[dn]==NULL) { gprint("No data in fill dataset at all \n");return;}
free_smoothed = false;
yt = dp[dn]->yv;
xt = dp[dn]->xv;
m = dp[dn]->miss;
npnts = dp[dn]->np;
if (dp[dn]->smooth && npnts>3 && npnts<190) {
gr_nomiss(dn); /* throw away missing points */
fitbez(&xt,&yt,&m,&npnts,dp[dn]->smoothm);
ssxt = xt; ssyt = yt; ssm = m;
free_smoothed = true;
}
ymx = ff->ymax;
if (xt==NULL) { gprint("No data in fill dataset \n"); return;}
x1 = *xt;
y1 = *yt;
switch(ff->type) {
case 1: /* x1,d1 */
ymx = ff->ymin;
case 2: /* d1,x2 */
fill_vec(*xt,ymx,*xt,*yt);
for (i=0;i<npnts-1;i++,xt++,yt++) {
fill_vec(*xt,*yt,*(xt+1),*(yt+1));
}
fill_vec(*xt,*yt,*xt,ymx);
fill_vec(*xt,ymx,*dp[dn]->xv,ymx);
break;
case 3: /* d1,d2 */
for (i=0;i<npnts-1;i++,m++,xt++,yt++) {
fill_vec(*xt,*yt,*(xt+1),*(yt+1));
x2 = *(xt+1); y2 = *(yt+1);
}
dn = ff->db;
yt = dp[dn]->yv;
xt = dp[dn]->xv;
m = dp[dn]->miss;
npnts = dp[dn]->np;
if (free_smoothed) {myfrees(ssxt,"Fill1"); myfrees(ssyt,"x"); myfrees(ssm,"y");}
free_smoothed = false;
if (dp[dn]->smooth && npnts>3 && npnts<190) {
gr_nomiss(dn); /* throw away missing points */
npnts = dp[dn]->np;
fitbez(&xt,&yt,&m,&npnts,dp[dn]->smoothm);
ssxt = xt; ssyt = yt; ssm = m;
free_smoothed = true;
}
xt += npnts - 1;
yt += npnts - 1;
fill_vec(x2,y2,*xt,*yt);
for (i=0;i<npnts-1;i++,m--,xt--,yt--)
fill_vec(*xt,*yt,*(xt-1),*(yt-1));
fill_vec(*xt,*yt,x1,y1);
break;
case 4: /* d1 */
for (i=0;i<npnts-1;i++,m++,xt++,yt++) {
if (!*m && !*(m+1))
fill_vec(*xt,*yt,*(xt+1),*(yt+1));
}
fill_vec(*xt,*yt,x1,y1);
break;
}
if (free_smoothed) {myfrees(ssxt,"Fill2"); myfrees(ssyt,"f4"); myfrees(ssm,"f5");}
/* Paint the region defined */
g_set_fill(ff->color);
g_newpath();
g_move(fnx(tmpf[1]),fny(tmpf[2]));
lastx = tmpf[1]; lasty=tmpf[2];
for (i=1;i<=gntmp;i+=4) {
if (lastx!=tmpf[i] || lasty!=tmpf[i+1]) {
g_closepath();
g_move(fnx(tmpf[i]),fny(tmpf[i+1]));
}
g_line(fnx(tmpf[i+2]),fny(tmpf[i+3]));
lastx = tmpf[i+2]; lasty = tmpf[i+3];
}
g_closepath();
g_fill();
g_set_path(false);
g_endclip();
}
}
/*------------------------------------------------------------------*/
fill_vec(double x1, double y1, double x2, double y2)
{
alloc_temp(gntmp);
if (tmpf == NULL) {gprint("Ran out of tmp storage for fill \n"); gle_abort("tmp data \n"); }
tmpf[++gntmp] = x1;
tmpf[++gntmp] = y1;
tmpf[++gntmp] = x2;
tmpf[++gntmp] = y2;
}
int setupdown(char *s, int *doup, int *upd, int *upp, double *upval);
setupdown(char *s, int *doup, int *upd, int *upp, double *upval)
{
static char vbuf[9];
int j=0;
*upd = 0;
*doup = true;
*upp = false;
if (*s==0) { *doup=false; return;}
if (*s=='D') { *upd = atoi(s+1); return; }
if (strstr(s,"%")!=NULL) { j=1; *upp = true; }
strncpy(vbuf,s,strlen(s)-j+1);
*upval = atof(vbuf);
}
/*------------------------------------------------------------------*/
/* d3 err .1 */
/* d3 err 10% */
/* d3 errup 10% errdown d2 */
/* d3 err d1 errwidth .2 */
dataset_null(int i)
{
if (dp[i]==NULL) {
gprint("Dataset %d doesn't exist at all\n",i);
return true;
}
if (dp[i]->yv == NULL) {
gprint("Dataset %d doesn't exist\n",i);
return true;
}
return false;
}
#ifdef HERROR /* because it won't fit on the PC */
draw_herr()
{
int errup,doup,upd,upp;
double upval,eup,edown,ewid;
int errdown,dodown,downd,downp;
double downval;
double *xt,*yt,x;
int *m,mup,mdown;
int dt,dn,i;
g_gsave();
for (dn=1;dn<=ndata;dn++) {
dpp = dp[dn];
if (dpp!=NULL) if (dpp->herrup[0]!=0 || dpp->herrdown[0]!=0) {
done_line = true;
g_get_hei(&x);
if (dpp->herrwidth==0) dpp->herrwidth = x/3;
ewid = dpp->herrwidth;
setupdown(dpp->herrup,&doup,&upd,&upp,&upval);
setupdown(dpp->herrdown,&dodown,&downd,&downp,&downval);
g_set_color(dpp->color);
g_set_line_width(dpp->lwidth);
windowdn(dn);
yt = dpp->yv;
xt = dpp->xv;
m = dpp->miss;
if (upd) if (dataset_null(upd)) return;
if (downd) if (dataset_null(downd)) return;
for (i=0;i<dpp->np;i++,m++,xt++,yt++) {
mup = false; mdown = false;
if (upd) {
eup = *(dp[upd]->yv+i);
mup = *(dp[upd]->miss+i);
} else {
eup = upval;
if (upp) eup = (eup * *xt)/100;
}
if (downd) {
edown = *(dp[downd]->yv+i);
mdown = *(dp[downd]->miss+i);
} else {
edown = downval;
if (downp) edown = (edown * *xt)/100;
}
/* if (eup!=-999) { */
if (doup) if (!*m) if (!mup) draw_herrbar(*xt,*yt,eup,ewid);
if (dodown) if (!*m) if (!mdown) draw_herrbar(*xt,*yt,-edown,ewid);
/* } */
}
windownorm();
}
}
exit_err:;
g_grestore();
}
draw_herrbar(double x, double y, double eup, double ewid)
{
if (x>=wxmin && x<=wxmax && y>=wymin && y<=wymax ) {
g_move(fnx(x),fny(y));
g_line(fnx(x-eup),fny(y));
g_move(fnx(x-eup),-ewid/2+fny(y));
g_line(fnx(x-eup),ewid/2+fny(y));
}
}
#endif
draw_err()
{
int errup,doup,upd,upp;
double upval,eup,edown,ewid;
int errdown,dodown,downd,downp,big;
double downval;
double *xt,*yt,x;
int *m,mup,mdown;
int dt,dn,i;
g_gsave();
for (dn=1;dn<=ndata;dn++) {
big = false;
dpp = dp[dn];
if (dpp!=NULL) if (dpp->errup[0]!=0 || dpp->errdown[0]!=0) {
if (dpp->bigfile!=NULL) {
big = true;
big_open(dpp->bigfile);
}
done_line = true;
g_get_hei(&x);
if (dpp->errwidth==0) dpp->errwidth = x/3;
ewid = dpp->errwidth;
setupdown(dpp->errup,&doup,&upd,&upp,&upval);
setupdown(dpp->errdown,&dodown,&downd,&downp,&downval);
g_set_color(dpp->color);
g_set_line_width(dpp->lwidth);
windowdn(dn);
yt = dpp->yv;
xt = dpp->xv;
m = dpp->miss;
if (upd) if (dataset_null(upd)) return;
if (downd) if (dataset_null(downd)) return;
if (big) {{
double x1,y1,x2,y2;
int m1,m2;
if (fptr==NULL) goto endbigm;
if (feof(fptr)) goto xxx;
for (;;) {
aaa2:
if (feof(fptr) || abort_key()) goto xxx;
big_line(&x1,&y1,&m2);
if (m2) goto aaa2;
mup = false; mdown = false;
if (upd) {
eup = *(dp[upd]->yv+i);
mup = *(dp[upd]->miss+i);
} else {
eup = upval;
if (upp) eup = (eup * y1)/100;
}
if (downd) {
edown = *(dp[downd]->yv+i);
mdown = *(dp[downd]->miss+i);
} else {
edown = downval;
if (downp) edown = (edown * y1)/100;
}
if (doup) if (!mup) draw_errbar(x1,y1,eup,ewid);
if (dodown) if (!mdown) draw_errbar(x1,y1,-edown,ewid);
}
xxx: fclose(fptr); fptr=NULL;
endbigm: ;
}} else {
for (i=0;i<dpp->np;i++,m++,xt++,yt++) {
mup = false; mdown = false;
if (upd) {
eup = *(dp[upd]->yv+i);
mup = *(dp[upd]->miss+i);
} else {
eup = upval;
if (upp) eup = (eup * *yt)/100;
}
if (downd) {
edown = *(dp[downd]->yv+i);
mdown = *(dp[downd]->miss+i);
} else {
edown = downval;
if (downp) edown = (edown * *yt)/100;
}
/* if (eup!=-999) { */
if (doup) if (!*m) if (!mup) draw_errbar(*xt,*yt,eup,ewid);
if (dodown) if (!*m) if (!mdown) draw_errbar(*xt,*yt,-edown,ewid);
/* } */
}
}
windownorm();
}
}
exit_err:;
g_grestore();
#ifdef HERROR
draw_herr();
#endif
}
draw_errbar(double x, double y, double eup, double ewid)
{
if (x>=wxmin && x<=wxmax && y>=wymin && y<=wymax ) {
g_move(fnx(x),fny(y));
g_line(fnx(x),fny(y+eup));
g_move(fnx(x)-ewid/2,fny(y+eup));
g_line(fnx(x)+ewid/2,fny(y+eup));
}
}
double dwx1,dwy1,dwx2,dwy2;
windowdn(int d)
{
dwx1 = wxmin; dwy1 = wymin; dwx2 = wxmax; dwy2 = wymax;
if (dp[d]==NULL) return;
if (dp[d]->xmax > dp[d]->xmin) {
wxmin = dp[d]->xmin; wxmax = dp[d]->xmax;
}
if (dp[d]->ymax > dp[d]->ymin) {
wymin = dp[d]->ymin; wymax = dp[d]->ymax;
}
}
windownorm()
{
wxmin = dwx1 ; wymin = dwy1 ; wxmax = dwx2 ; wymax = dwy2 ;
}
draw_lines()
{
double *ssxt,*ssyt,*xt,*yt,oldlwidth;
int *m,*ssm;
char oldlstyle[10];
int dt,dn,i,npnts,free_smoothed,big;
g_gsave();
g_get_line_style(oldlstyle);
g_get_line_width(&oldlwidth);
for (dn=1;dn<=ndata;dn++) {
big = false;
last_vecx = 1e10;
last_vecy = 1e10;
if (dp[dn]!=NULL) {
if (dp[dn]->bigfile!=NULL) {
big=true;
big_open(dp[dn]->bigfile);
}
if (dp[dn]->xv!=NULL || big)
if (dp[dn]->line==true || dp[dn]->lstyle[0]!=0) {
free_smoothed = false;
g_set_line_style(oldlstyle); /* use defualts for each */
g_set_line_width(oldlwidth); /* use defaults for each */
g_set_line_style(dp[dn]->lstyle);
g_set_color(dp[dn]->color);
g_set_line_width(dp[dn]->lwidth);
windowdn(dn);
done_line = true;
yt = dp[dn]->yv;
xt = dp[dn]->xv;
m = dp[dn]->miss;
npnts = dp[dn]->np;
if (dp[dn]->smooth && npnts>3 && npnts<190) {
/* (BUG, gr_nomiss has not been written HAS NOW !!! */
gr_nomiss(dn); /* throw away missing points */
npnts = dp[dn]->np;
fitbez(&xt,&yt,&m,&npnts,dp[dn]->smoothm);
ssxt = xt; ssyt = yt; ssm = m;
free_smoothed = true;
}
if (big) big_vec(dp[dn]->nomiss);
else {
for (i=0;i<(npnts-1);i++,m++,xt++,yt++) {
if (!*m && !*(m+1))
draw_vec(*xt,*yt,*(xt+1),*(yt+1));
}
}
if (free_smoothed) {myfrees(ssxt,"Line1"); myfrees(ssyt,"l2"); myfrees(ssm,"l3");}
windownorm();
}
big_close();
}
}
g_grestore();
}
big_vec(int nomiss)
{
double x1,y1,x2,y2;
int m1,m2;
if (fptr==NULL) return;
aaa:
if (feof(fptr)) goto xxx;
big_line(&x1,&y1,&m1);
if (m1) goto aaa;
for (;;) {
aaa2:
if (feof(fptr) || abort_key()) break;
big_line(&x2,&y2,&m2);
if (nomiss && m2) goto aaa2;
if (!m1 && !m2) draw_vec(x1,y1,x2,y2);
x1 = x2; y1 = y2; m1 = m2;
}
xxx: fclose(fptr); fptr = NULL;
}
big_close()
{
if (fptr!=NULL) fclose(fptr);
fptr = NULL;
}
big_mark(int mnum, double msize)
{
double x1,y1,x2,y2;
int m1,m2;
if (fptr==NULL) return;
if (feof(fptr)) goto xxx;
for (;;) {
aaa2:
if (feof(fptr) || abort_key()) break;
big_line(&x1,&y1,&m2);
if (m2) goto aaa2;
draw_mark(x1,y1,mnum,msize,1.0);
}
xxx: fclose(fptr); fptr=NULL;
}
draw_vec(double x1,double y1,double x2,double y2)
{
int invis;
if (x1>=wxmin && x1<=wxmax && y1>=wymin && y1<=wymax
&& x2 >= wxmin && x2<=wxmax && y2>=wymin && y2<=wymax);
else { /* ok one or both are outside our box */
gclip(&x1,&y1,&x2,&y2,wxmin,wymin,wxmax,wymax,&invis);
if (invis) return;
}
if (x1!=last_vecx || y1!=last_vecy) {
g_move(fnx(x1),fny(y1));
}
g_line(fnx(x2),fny(y2));
last_vecx = x2;
last_vecy = y2;
}
/*---------------------------------------------------------------------------*/
draw_markers()
{
double msize;
double *yd,dval,*xt,*yt,oldlwidth;
char oldlstyle[10];
int *m;
int dt,dn,i,big;
g_gsave();
g_get_line_style(oldlstyle);
g_get_line_width(&oldlwidth);
for (dn=1;dn<=ndata;dn++) {
big = false;
last_vecx = 1e10;
last_vecy = 1e10;
if (dp[dn]!=NULL) if (dp[dn]->marker!=0) {
if (dp[dn]->bigfile!=NULL) {
big=true;
big_open(dp[dn]->bigfile);
} else big = false;
g_set_line_width(oldlwidth); /* use defaults for each */
g_set_color(dp[dn]->color);
g_set_line_width(dp[dn]->lwidth);
windowdn(dn);
done_line = true;
yt = dp[dn]->yv;
xt = dp[dn]->xv;
m = dp[dn]->miss;
msize = dp[dn]->msize;
if (msize==0) msize = g_fontsz*.6;
if (dp[dn]->mscale != 0) msize = msize* dp[dn]->mscale;
if (big) big_mark(dp[dn]->marker,msize);
else {
if (dp[dn]->mdata!=0) yd = dp[dp[dn]->mdata]->yv;
for (i=0;i<dp[dn]->np;i++,m++,xt++,yt++,yd++) {
if (!*m) {
if (dp[dn]->mdata==0) dval = 1; else dval = *yd;
draw_mark(*xt,*yt,dp[dn]->marker,msize,dval);
}
}
}
windownorm();
}
}
g_grestore();
}
/*---------------------------------------------------------------------------*/
draw_mark(double x, double y,int mrk, double msize, double dval)
{
/* globals *** xmin, xmax, ymin, ymax, ox,oy, xbl, ybl */
if (x >= wxmin && x<=wxmax && y>=wymin && y<=wymax) {
g_move(fnx(x),fny(y));
g_marker2(mrk,msize,dval);
}
}
/*---------------------------------------------------------------------------*/
box_clip(double *x,double *y,double wxmin,double wymin,double wxmax,double wymax)
{
if (*x > wxmax) *x = wxmax;
if (*y > wymax) *y = wymax;
if (*x < wxmin) *x = wxmin;
if (*y < wymin) *y = wymin;
}
gclip(double *x1,double *y1,double *x2,double *y2
,double xmin,double ymin,double xmax,double ymax,int *invis)
{
double dx,dy;
*invis = true;
if (*x2 > xmax) {
if (*x1 > xmax) return;
dx = *x2 - *x1;
dy = *y2 - *y1;
if (dx==0) return;
*y2 = *y1 + dy*(xmax-*x1)/dx;
*x2 = xmax;
}
if (*x1 > xmax) {
dx = *x1 - *x2;
dy = *y1 - *y2;
if (dx==0) return;
*y1 = *y2 + dy*(xmax-*x2)/dx;
*x1 = xmax;
}
if (*y2 > ymax) {
if (*y1 > ymax) return;
dy = *y2 - *y1;
dx = *x2 - *x1;
if (dy==0) return;
*x2 = *x1 + dx*(ymax-*y1)/dy;
*y2 = ymax;
}
if (*y1 > ymax) {
dx = *x1 - *x2;
dy = *y1 - *y2;
if (dy==0) return;
*x1 = *x2 + dx*(ymax-*y2)/dy;
*y1 = ymax ;
}
if (*x2 < xmin) {
if (*x1 < xmin) return;
dx = *x2 - *x1;
dy = *y2 - *y1;
if (dx==0) return;
*y2 = *y1 + dy*(xmin-*x1)/dx;
*x2 = xmin;
}
if (*x1 < xmin) {
dx = *x1 - *x2 ;
dy = *y1 - *y2 ;
if (dx==0) return;
*y1 = *y2 + dy*(xmin-*x2)/dx;
*x1 = xmin;
}
if (*y2 < ymin) {
if (*y1 < ymin) return;
dy = *y2 - *y1;
dx = *x2 - *x1;
if (dy==0) return;
*x2 = *x1 + dx*(ymin-*y1)/dy;
*y2 = ymin;
}
if (*y1 < ymin) {
dy = *y1 - *y2;
dx = *x1 - *x2;
if (dy==0) return;
*x1 = *x2 + dx*(ymin-*y2)/dy;
*y1 = ymin;
}
*invis = false;
}
axis_type(char *s)
{
if (strncmp(s,"X2",2)==0) return 3;
if (strncmp(s,"Y2",2)==0) return 4;
if (strncmp(s,"X",1)==0) return 1;
if (strncmp(s,"Y",1)==0) return 2;
gprint("axis type did not match {%s} assuming xaxis \n",s);
return 1;
}
vinit_axis(int i)
{
long c;
memset(&xx[i],0,sizeof(xx[i]));
g_get_color(&c);
xx[i].color = c;
xx[i].side_color = c;
xx[i].ticks_color = c;
xx[i].label_color = c;
xx[i].subticks_color = c;
xx[i].side_lwidth = -1;
xx[i].ticks_lwidth = -1;
xx[i].subticks_lwidth = -1;
xx[i].label_lwidth = -1;
xx[i].type = i;
if (i>2) xx[i].label_off = true;
}
doskip(char *s,int *ct)
{
if (*s==' ') (*ct)++;
}
int polish_eval(char *exp, double *x);
double get_next_exp(char (*(*tk)[]),int *ntok,int *curtok)
{
static int elen,etype,cp,i;
static double x;
(*curtok)++;
cp = 0;
elen = 0;
etype = 1;
dbg for (i=1;i<=*ntok;i++) gprint("{%s} ",(*tk)[i]);
dbg gprint("\n");
dbg gprint("**get exp token ct %d {%s} \n",*curtok,(*tk)[*curtok]);
polish_eval((*tk)[*curtok],&x);
return x;
}
polish_eval(char *exp, double *x)
{
static long ebuff[300];
static char ostr[20];
static int elen,etype,cp,otyp;
cp = 0;
elen = 0;
etype = 1;
polish(exp,(char *) &ebuff,&elen,&etype);
eval(ebuff,&cp,x,ostr,&otyp);
}
checktok(char *t, char *want)
{
if (strcmp(t,want)==0) return true;
else {
gprint("Found token {%s} Wanted {%s} \n",t,want);
return false;
}
}
/* LET d2 = exp(x) [ FROM exp TO exp [ STEP exp ] ] */
/* LET d3 = exp(dn,d...) */
do_let(char *letcmd)
{
static char *tk[200];
static int ndn,dn_idx[11],dn_var[11];
static char tkbuff[200];
static int ntk,ct,i,elen,etype,dn,cp,savect,tt,dd,np,j;
double letfrom,letto,letstep,ix;
int varx,npnts,*newmiss;
double *xt,*yt,*xf,logstep,*newx,*newy;
int *mt,*mm;
static char ostr[20];
int gotfrom,vartype,otyp;
double x,y,ox,oy;
static char space_str[] = " ";
if (tk[199]==NULL) for (i=0;i<200;i++) tk[i] = space_str;
token(letcmd,(TOKENS) tk,&ntk,tkbuff);
ct = 2;
dd = atoi(tk[ct]+1);
ct++;
if (strcmp(tk[ct],"=")!=0) {
gprint("%s\n",letcmd);
gprint("Found {%s} When expecting {=} at token %d \n",tk[ct]
,ct);
return;
}
ct++;
savect = ct;
gotfrom = false;
for (ct=savect;ct<=ntk;ct++) {
if (strcmp(tk[ct],"FROM")==0) {
gotfrom = true;
letfrom = get_next_exp((TOKENS) tk,&ntk,&ct);
ct++;
if (!checktok(tk[ct],"TO")) return;
letto = get_next_exp((TOKENS) tk,&ntk,&ct);
ct++;
if (strcmp(tk[ct],"STEP")==0) {
letstep = get_next_exp((TOKENS) tk,&ntk,&ct);
ct++;
} else
letstep = (letto-letfrom)/100;
ct = ntk;
}
}
var_set_local();
var_alloc_local();
ct = savect;
elen = 0;
etype = 1;
polish(tk[ct],(char *) &ebuff,&elen,&etype);
ndn = 0;
if (!gotfrom) {
dn_var[0]=12; dn_idx[0]=111;
var_find_dn(dn_idx, dn_var, &ndn);
if (ndn==0) {
gprint("Expecting FROM exp TO exp [ STEP exp] \n");
gprint("or expression containing Dataset d1,d2 etc\n");
gprint("But only got {%s}\n",letcmd);
}
}
dn = dn_var[0];
if (ndn>0) np = dp[dn]->np;
else {
np = (letto-letfrom)/letstep + 1;
if (xx[1].log==true) {
if (letstep<9 || letstep>300) {
letstep=60;
gprint("Due to LOG xaxis stepsize is taken as number of steps (set to 60)\n");
}
np = letstep*2;
letstep = letstep/3;
logstep = 1+ (log10(letto)-log10(letfrom)) /((double) letstep);
}
}
/* dbg for (i=ndata;i<=dd;i++) printf("dat apointer [%d] %p \n",i,dp[i]);
*/
if (ndata<dd) ndata = dd;
if (dp[dd]==NULL) {
dp[dd] = myallocz(sizeof(*dp[dd]));
copy_default(dd);
}
/* copy default dataset settings */
if (dp[dd]==NULL) gprint("Memory allocation error, graph dataset \n");
np++;
if (dp[dd]->xv != NULL) gprint("Over writing dataset %d \n",dd);
newx = myallocz(sizeof(x)*np);
newy = myallocz(sizeof(x)*np);
newmiss = myallocz(sizeof(i)*np);
np--;
dp[dd]->np = np;
xt = newx ; yt = newy; mt = newmiss;
npnts = 0;
var_find("X",&varx,&vartype);
dn = dn_var[0];
if (ndn>0) {
xf = dp[dn]->xv;
mm = dp[dn]->miss;
for (i=0;i<dp[dn]->np;i++,xf++,mm++) {
if (varx>=0) var_set(varx,*xf);
for (j=0;j<ndn;j++) {
if (dp[dn_var[j]] == NULL) {
gprint("Dataset not defined {%d} \n",dn_var[j]);
} else {
var_set(dn_idx[j],dp[dn_var[j]]->yv[i]);
}
}
cp = 0;
eval((long *) ebuff,&cp,&x,ostr,&otyp);
if (! *mm) {
npnts++;
*(xt++) = *xf;
*(yt++) = x;
*(mt++) = 0;
setrange(*xf,x,0);
}
}
} else {
for (ix=letfrom;ix<=letto && npnts<np ;) {
if (varx>=0) var_set(varx,ix);
cp = 0;
eval((long *) ebuff,&cp,&x,ostr,&otyp);
npnts++;
*(xt++) = ix;
*(yt++) = x;
*(mt++) = 0;
setrange(ix,x,0);
if (xx[1].log==true) {
ix = ix*logstep;
if (ix>letto) ix = letto;
} else ix+=letstep;
}
}
dp[dd]->np = npnts;
dp[dd]->miss = newmiss;
dp[dd]->xv = newx;
dp[dd]->yv = newy;
var_free_local();
var_clear_local();
var_set_global();
}
struct key_struct {
char lstyle[9];
long color,fill;
int marker;
double msize,lwidth;
char *descrip;
};
extern struct key_struct *kd[100];
int draw_key(int nkd, double koffsetx, double koffsety, char *kpos
,double khei, int knobox);
gdraw_key(double koffsetx, double koffsety, char *kpos, double khei, int knobox)
{
int dt,dn,i,nkd;
nkd = 0;
for (dn=1;dn<=ndata;dn++) {
if (dp[dn]!=NULL) if (dp[dn]->key_name!=NULL) {
kd[++nkd] = myallocz(sizeof(*kd[1]));
kd[nkd]->fill = dp[dn]->key_fill;
kd[nkd]->color = dp[dn]->color;
kd[nkd]->lwidth = dp[dn]->lwidth;
kd[nkd]->marker = dp[dn]->marker;
kd[nkd]->msize = dp[dn]->msize;
strcpy(kd[nkd]->lstyle,dp[dn]->lstyle);
if (kd[nkd]->lstyle[0]==0) if (dp[dn]->line==true)
kd[nkd]->lstyle[0]='1';
mystrcpy(&kd[nkd]->descrip,dp[dn]->key_name);
}
}
draw_key(nkd,koffsetx,koffsety,kpos,khei,knobox);
for (i=1;i<=nkd;i++) {
if (kd[i]->descrip != NULL) myfrees(kd[i]->descrip,"GKEY");
myfrees(kd[i],"GKEY1");
}
}
/*----------------------------------------------------------------*/
#define next_dn (ct+=1,skipspace,atoi(tk[ct]+1))
do_dataset(int d)
{
int ct=2;
while (ct<=ntk) {
kw("LINE") dp[d]->line = true;
else kw("LSTYLE") next_str(dp[d]->lstyle);
else kw("LWIDTH") dp[d]->lwidth = next_exp;
else kw("MARKER") dp[d]->marker = next_marker;
else kw("MDATA") dp[d]->mdata = next_dn;
else kw("COLOR") dp[d]->color = next_color;
else kw("KEYFILL") dp[d]->key_fill = next_color;
else kw("MSIZE") dp[d]->msize = next_exp;
else kw("MSCALE") dp[d]->mscale = next_exp;
else kw("KEY") next_vquote(dp[d]->key_name);
else kw("AUTOSCALE") dp[d]->autoscale = true;
else kw("AUTO") dp[d]->autoscale = true;
else kw("NOMISS") dp[d]->nomiss = true;
else kw("NOMISSING") dp[d]->nomiss = true;
else kw("BIGFILE") next_vquote(dp[d]->bigfile);
else kw("SMOOTH") {
dp[d]->smoothm = false;
dp[d]->smooth = true;
dp[d]->line = true;
}
else kw("SMOOTHM") {
dp[d]->smoothm = true;
dp[d]->smooth = true;
dp[d]->line = true;
}
else kw("XMIN") dp[d]->xmin = next_exp;
else kw("XMAX") dp[d]->xmax = next_exp;
else kw("YMIN") dp[d]->ymin = next_exp;
else kw("YMAX") dp[d]->ymax = next_exp;
#ifdef HERROR /* because it won't fit on the PC */
else kw("HERR") {
next_str(dp[d]->herrup);
strcpy(dp[d]->herrdown, dp[d]->herrup);
}
else kw("HERRLEFT") next_str(dp[d]->herrup);
else kw("HERRRIGHT") next_str(dp[d]->herrdown);
else kw("HERRWIDTH") dp[d]->herrwidth = next_exp;
#endif
else kw("ERR") {
next_str(dp[d]->errup);
strcpy(dp[d]->errdown, dp[d]->errup);
}
else kw("ERRUP") next_str(dp[d]->errup);
else kw("ERRDOWN") next_str(dp[d]->errdown);
else kw("ERRWIDTH") dp[d]->errwidth = next_exp;
else gprint("Unrecognised GRAPH DN sub command {%s} \n ",tk[ct]);
ct++;
}
}
double graph_xgraph(double v)
{
double vvv;
if (graph_xmax == graph_xmin) return 0.0;
if (xx[1].log==true) {
vvv = graph_x1 +
(log10(v)-log10(graph_xmin))/(log10(graph_xmax)
-log10(graph_xmin))
* (graph_x2-graph_x1) ;
} else {
vvv = graph_x1 + ((v-graph_xmin)/(graph_xmax-graph_xmin))
* (graph_x2-graph_x1);
}
return vvv;
}
double graph_ygraph(double v)
{
double vvv;
if (graph_ymax == graph_ymin) return 0.0;
if (xx[2].log==true) {
vvv = graph_y1 +
(log10(v)-log10(graph_ymin))/(log10(graph_ymax)
-log10(graph_ymin))
* (graph_y2-graph_y1) ;
return vvv;
} else {
return graph_y1 + ((v-graph_ymin)/(graph_ymax-graph_ymin)) * (graph_y2-graph_y1);
}
}