📄 xgmreduce.cpp
字号:
/* Copyright 1997 Peter Mardahl Program for playing movies generated from XGrafix 2.40. */#include "list.h"#include "xgmovie.h"SCALAR thetimestep;double theTime;SCALAR maxTime; // the maximum time found in any of the graphs readSCALAR minTime; // the minimum time found in any of the graphs readint MAX_LIN = 12000;int TIME_SKIP = 2;int X_SKIP = 2;int Y_SKIP = 2;extern "C" { void XGMainLoop(); void Dump(char *); void Quit();}void ReadStructures(List<StructureData> &Structs,char *filename){ List<StructureData> theStructs; char buf[512]; int n; FILE *fp; sprintf(buf,"%s.str",filename); if((fp = fopen(buf,"r"))==NULL) { sprintf(buf,"%s_1.str",filename); if((fp=fopen(buf,"r"))==NULL) return; } // read in the structures while(XGRead(&n,sizeof(int),1,fp,"int"),n!=-1) { StructureData *s = new StructureData; s->n = n; XGRead(&(s->fillFlag),sizeof(int),1,fp,"int"); XGRead(&(s->lineColor),sizeof(int),1,fp,"int"); XGRead(&(s->fillColor),sizeof(int),1,fp,"int"); s->points = (SCALAR *)malloc (2*n*sizeof(SCALAR)); XGRead(s->points,sizeof(SCALAR),2*n,fp,SCALAR_CHAR); Structs.add(s); } // Structs=theStructs; // reverse the list fclose(fp);}int getCount(char *filename) { FILE *fp; int l; char buf[512]; sprintf(buf,"%s.num",filename); if((fp = fopen(buf,"r"))==NULL) { fprintf(stderr,"Error, cannot open file %s",buf); return 0; } fscanf(fp,"%d",&l); fclose(fp); return l;}LabelType ReadLabel(FILE *fp) { int type; char buf[100]; char *labels; int l; LabelType label = (LabelType)malloc(sizeof(struct label)); SCALAR scale,min,max; //Read 1st string XGRead(&l,sizeof(int),1,fp,"int"); //size labels = (char *)malloc((l+1) * sizeof(char)); if(l>0) { XGRead(labels,sizeof(char),l+1,fp,"char"); label->X_Label = labels; } //Read 2st string XGRead(&l,sizeof(int),1,fp,"int"); //size labels = (char *)malloc((l+1) * sizeof(char)); if(l>0) { XGRead(labels,sizeof(char),l+1,fp,"char"); label->Y_Label = labels; } //Read 3st string XGRead(&l,sizeof(int),1,fp,"int"); //size labels = (char *)malloc((l+1) * sizeof(char)); if(l>0) { XGRead(labels,sizeof(char),l+1,fp,"char"); label->Z_Label = labels; } // read the info on the X axis XGRead(&scale,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->X_Scale = 1;//scale; XGRead(&min,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->X_Min=min; XGRead(&max,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->X_Max=max; XGRead(&(label->X_Auto_Rescale),sizeof(int),1,fp,"int"); // read the info on the Y axis XGRead(&scale,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Y_Scale = 1;//scale; XGRead(&min,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Y_Min=min; XGRead(&max,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Y_Max=max; XGRead(&(label->Y_Auto_Rescale),sizeof(int),1,fp,"int"); // read the info on the Z axis XGRead(&scale,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Z_Scale = 1;//scale; XGRead(&min,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Z_Min=min; XGRead(&max,sizeof(SCALAR),1,fp,SCALAR_CHAR); label->Z_Max=max; XGRead(&(label->Z_Auto_Rescale),sizeof(int),1,fp,"int"); return label;}int openFile(FILE **fp,char * filename,int index) { char buf[100]; int type; if(index == 0 || index == 1) { sprintf(buf,"%s.bxg",filename); if((*fp = fopen(buf,"r"))==NULL) { sprintf(buf,"%s_1.bxg",filename); if((*fp = fopen(buf,"r"))==NULL) { fprintf(stderr,"Error, cannot find any file of the form %s\n",filename); exit(1); } } XGRead(&type,sizeof(int),1,*fp,"int"); return type; } sprintf(buf,"%s_%d.bxg",filename,index); if((*fp = fopen(buf,"r"))==NULL) { *fp = 0; return -1; } XGRead(&type,sizeof(int),1,*fp,"int"); return type;}plot::plot(char *_filename,int _xloc,int _yloc) { FILE *fp; filename = strdup(_filename); xloc = _xloc; yloc = _yloc; openFile(&fp,filename,0); // label = ReadLabel(fp); ReadStructures(structures,filename); fclose(fp);}One_D_plot::One_D_plot(char *filename,int xloc,int yloc):plot(filename,xloc,yloc) { FILE *fp; int i,j,count,type; LabelType locallabel; List<List<One_D_plot_data> > tmp; current = new ListIter< List<One_D_plot_data> >(graphdata); openFile(&fp,filename,0); count = getCount(filename); rewind(fp); // for(i=1;openFile(&fp,filename,i)!=-1;i++) { for(i=0;i<count;i++) { SCALAR the_time; XGRead(&type,sizeof(int),1,fp,"int"); locallabel=ReadLabel(fp); XGRead(&(the_time),sizeof(SCALAR),1,fp,SCALAR_CHAR); maxTime = max(maxTime,the_time); minTime = min(minTime,the_time); List<One_D_plot_data> *in_data = new List<One_D_plot_data>; do { One_D_plot_data *dat= new One_D_plot_data(); int Skip = 1; XGRead(&(dat->n),sizeof(int),1,fp,"int"); XGRead(&(dat->color),sizeof(int),1,fp,"int"); if(dat->n == -1) { // the exit condition tmp.add(in_data); //add this list of data to the graph list delete dat; // not needed break; // go to the next file } if(i==1) { // have to build a current_data list One_D_plot_data *dat2 =new One_D_plot_data(); dat2->time = the_time; dat2->x = (SCALAR *)calloc(MAX_LIN, sizeof(SCALAR)); dat2->y = (SCALAR *)calloc(MAX_LIN, sizeof(SCALAR)); dat2->color = dat->color; current_data.add(dat2); } dat->time = the_time; if(dat->n > MAX_LIN) { // we need to contract the dataset to fit into our // memory buffer. We also must read the entire dataset. // what we do is stick dat->n/MAX_LIN items directly // into the same array location, the last one wins. static int warnflag = 0; Skip = dat->n / MAX_LIN+1; if(Skip < 2) Skip = 2; // printf("\n dat->n %d, Skip %d ",dat->n, Skip); if(!warnflag) { warnflag = 1; printf("Warning, some datasets are too large. Threading them. (%d)\n",Skip); } } dat->x = (SCALAR *)calloc(max(1,(dat->n+Skip)/Skip) , sizeof(SCALAR)); dat->y = (SCALAR *)calloc(max(1,(dat->n+Skip)/Skip) , sizeof(SCALAR)); for(j=0;j<dat->n;j++) { XGRead(dat->x +j/Skip,sizeof(SCALAR),1,fp,SCALAR_CHAR); XGRead(dat->y +j/Skip,sizeof(SCALAR),1,fp,SCALAR_CHAR); } dat->n = dat->n / Skip; in_data->add(dat); } while (!feof(fp)); // actually a dummy, reading should stop earlier } fclose(fp); // reverse the list graphdata = tmp;}void One_D_plot::updatePlot(double time) { if(time == minTime) current->restart(); List<One_D_plot_data> *thisdata = current->current(); while(!current->Done()&& current->current()->head->data->time <= time) { thisdata= current->current(); (*current)++; } if(thisdata) { ListIter<One_D_plot_data> walk(*thisdata); ListIter<One_D_plot_data> walk2(current_data); for(walk.restart(),walk2.restart();!walk.Done();walk++,walk2++) { One_D_plot_data * thisgraph = walk.current(); One_D_plot_data * destgraph = walk2.current(); destgraph->n = thisgraph->n; memcpy(destgraph->x,thisgraph->x,destgraph->n * sizeof(SCALAR)); memcpy(destgraph->y,thisgraph->y,destgraph->n * sizeof(SCALAR)); } }}ScatterPlot::ScatterPlot(char *filename,int xloc,int yloc):One_D_plot(filename,xloc,yloc) { XGSet2D("linlin",label->X_Label,label->Y_Label,"open",xloc,yloc,label->X_Scale, label->Y_Scale,label->X_Auto_Rescale,label->Y_Auto_Rescale, label->X_Min,label->X_Max,label->Y_Min,label->Y_Max); ListIter<One_D_plot_data> walk(current_data); for(walk.restart();!walk.Done();walk++) XGScat2D(walk.current()->x,walk.current()->y,&(walk.current()->n),walk.current()->color); ListIter<StructureData> walk2(structures); for(walk2.restart();!walk2.Done();walk2++) XGStructureArray(walk2.current()->n,(STRUCT_FILL) walk2.current()->fillFlag, walk2.current()->lineColor, walk2.current()->fillColor,walk2.current()->points);}LinePlot::LinePlot(char *filename,int xloc, int yloc):One_D_plot(filename,xloc,yloc) { XGSet2D("linlin",label->X_Label,label->Y_Label,"open",xloc,yloc,label->X_Scale, label->Y_Scale,label->X_Auto_Rescale,label->Y_Auto_Rescale, label->X_Min,label->X_Max,label->Y_Min,label->Y_Max); ListIter<One_D_plot_data> walk(current_data); for(walk.restart();!walk.Done();walk++) XGCurve(walk.current()->x,walk.current()->y,&(walk.current()->n),walk.current()->color); ListIter<StructureData> walk2(structures); for(walk2.restart();!walk2.Done();walk2++) XGStructureArray(walk2.current()->n,(STRUCT_FILL) walk2.current()->fillFlag, walk2.current()->lineColor, walk2.current()->fillColor,walk2.current()->points);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -