⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xgmreduce.cpp

📁 xgrafix 是PTSG模拟程序中的图形截面库 改版本是最新版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*  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 + -