tiles.c

来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 237 行

C
237
字号
#include "medit.h"#include "sproto.h"#include "extern.h"extern ubyte ddebug;ubyte  tiling;#define IN2CM        2.54#define CM2IN        0.3937void dumpTile(char *data,int width,int height,GLubyte *buffer) {  FILE *out2;   out2 = fopen(data,"w");  fprintf(out2,"P6\n");  fprintf(out2,"# Created using medit %s %s, (c) INRIA\n",ME_VER,ME_REL);  fprintf(out2,"%d %d\n",width,height);  fprintf(out2,"255\n");  fwrite(buffer,sizeof(GLubyte),width*height*3,out2);  fclose(out2);}/* dump big image */int imgTiling(pScene sc,char *data,char key) {  FILE     *out;  pCamera   c = sc->camera;  GLubyte  *tile,*buffer,*rowPtr;  GLint     matmode,viewport[4];  double    xmin,xmax,ymin,ymax,left,right,top,bottom,ratio;  float     debhaut,finhaut,deblarg,finlarg,look[3];  int       i,tw,th,col,row,nbcol,nbrow;  int       imgWidth,imgHeight,tileWidth,tileHeight,tileWidthNB,tileHeightNB;  int       bitsTileRow,bitsImgOffset,bitsCurTileRow,border;  int       bitsTileOffset,bitsPixel,imgRowSize;  char     *ptr,name[256];  ubyte     bckbyte;  static GLfloat up[3] = { 0.0, 1.0, 0.0};  glPixelStorei(GL_PACK_ALIGNMENT, 1);  bckbyte = (ubyte)(255*(0.30*sc->par.back[0] +                          0.59*sc->par.back[1] +                          0.11*sc->par.back[2])+ 0.5);  /* compute image size */  ratio = (double)sc->par.xs/(double)sc->par.ys;  ymax  = 0.1f*sc->dmax * tan(sc->persp->fovy * M_PI/360.0);  ymin  = -ymax;  xmin  = ymin * ratio;  xmax  = ymax * ratio;  bitsPixel  = 3 * sizeof(GLubyte);  imgWidth   = (int)(sc->par.dpi*CM2IN*sc->par.cm+0.5);  imgHeight  = (int)((double)imgWidth / ratio +0.5);  imgRowSize = imgWidth * bitsPixel;  tileWidth    = sc->par.xs;  tileHeight   = sc->par.ys;  border       = sc->mode & S_BDRY ? 1 : 0;  tileWidthNB  = tileWidth  - 2*border;  tileHeightNB = tileHeight - 2*border;  if ( ddebug ) {    fprintf(stdout,"   Generating %d by %d image\n",imgWidth,imgHeight);    fprintf(stdout,"   tile %d x %d\n",tileWidth,tileHeight);    fprintf(stdout,"   image size %f x %f cm\n",            sc->par.cm,(double)imgHeight/sc->par.dpi/CM2IN);  }  /* buffer to store one tile */  tile = (GLubyte*)calloc(tileWidthNB*tileHeightNB,bitsPixel);  if ( !tile ) {    fprintf(stderr,"  ## Unable to store buffer!\n");    return(0);  }    /* buffer for a row of tiles */  buffer = (GLubyte*)calloc(imgWidth*tileHeightNB,bitsPixel);  if ( !buffer ) {    free(tile);    fprintf(stderr,"  ## Unable to store a row of tiles!\n");    return(0);  }    /* open EPS file */  strcpy(name,data);  ptr  = (char*)strstr(name,".ps");  if ( !ptr ) strcat(name,".ps");  out = fopen(name,"w");  if ( !out ) {    fprintf(stderr,"  ## Unable to open file %s.\n",name);    free(tile);    return(0);  }  writeEPSheader(out,name,key,imgWidth,imgHeight,sc->par.cm,sc->par.dpi);    /* save current viewport */  glGetIntegerv(GL_VIEWPORT,viewport);  glDrawBuffer(GL_BACK_LEFT);  glReadBuffer(GL_BACK_LEFT);  /* dump tiles */  nbcol  = (int)((float)imgWidth / tileWidthNB)  + 1;  nbrow  = (int)((float)imgHeight/ tileHeightNB) + 1;  tiling = 1;    th = tileHeightNB;  finhaut = sc->par.ys;  for (row=nbrow-1; row>=0; row--) {    if ( row < nbrow-1 )      th = tileHeightNB;    else      th = imgHeight - row*tileHeightNB;    debhaut = finhaut - sc->par.ys * th / imgHeight;    deblarg = 0;        for (col=0; col<nbcol; col++) {      if ( col < nbcol-1 )        tw = tileWidthNB;      else        tw = imgWidth - col*tileWidthNB;      if ( th > tileHeightNB || tw > tileWidthNB ) {        fprintf(stderr,"  %%%% Wrong tile size (%d,%d).\n",th,tw);        free(buffer);        free(tile);        return(0);       }      finlarg = deblarg + sc->par.xs * tw / imgWidth;      /* set viewport to tilesize (with border) */      glViewport(0,0,tw+2*border,th+2*border);      /* current matrix */      glGetIntegerv(GL_MATRIX_MODE,&matmode);      glMatrixMode(GL_PROJECTION);      glLoadIdentity();      glMultMatrixf(sc->persp->matrix);      /* compute projection parameters */      if ( sc->persp->pmode == PERSPECTIVE ) {        left   = xmin   + (xmax-xmin) * (col*tileWidthNB) / imgWidth;        right  = left   + (xmax-xmin) * tw / imgWidth;        bottom = ymin   + (ymax-ymin) * (row*tileHeightNB) / imgHeight;        top    = bottom + (ymax-ymin) * th / imgHeight;        glFrustum(left,right,bottom,top,0.1*sc->dmax,10.0f*sc->dmax);        glTranslatef(0.0f,0.0,sc->persp->depth);      }      else if ( sc->persp->pmode == CAMERA ) {        left   = xmin   + (xmax-xmin) * (col*tileWidthNB) / imgWidth;        right  = left   + (xmax-xmin) * tw / imgWidth;        bottom = ymin   + (ymax-ymin) * (row*tileHeightNB) / imgHeight;        top    = bottom + (ymax-ymin) * th / imgHeight;        glFrustum(left,right,bottom,top,0.1f*sc->dmax,10.0f*sc->dmax);        look[0] = c->eye[0] + 0.001*sc->dmax*c->speed[0];        look[1] = c->eye[1] + 0.001*sc->dmax*c->speed[1];        look[2] = c->eye[2] + 0.001*sc->dmax*c->speed[2];        gluLookAt(c->eye[0],c->eye[1],c->eye[2],                   look[0],look[1],look[2],                  up[0],up[1],up[2]);        glTranslatef(0.0f,0.0f,0.5*sc->persp->depth);      }      else if ( sc->persp->pmode == ORTHO ) {        glOrtho(-1.,1.,-1.,0.1,0.01,0.01);        glTranslatef(0.0,0.0,sc->persp->depth);      }      /* redraw scene */      glDisable(GL_LIGHTING);      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);      glMatrixMode(GL_MODELVIEW);      glLoadIdentity();      /*gluLookAt(0.,0.,-sc->persp->depth, 0.,0.,0., 0.0,1.0,0.0);*/      glMultMatrixf(sc->view->matrix);      glTranslatef(sc->cx,sc->cy,sc->cz);      drawModel(sc);      /* read buffer */      glFlush();      glReadPixels(border,border,tileWidthNB,tileHeightNB,                   GL_RGB,GL_UNSIGNED_BYTE,tile);      /* store to row buffer */      bitsImgOffset  = col * tileWidthNB * bitsPixel;      bitsTileRow    = tileWidthNB * bitsPixel;      bitsCurTileRow = tw * bitsPixel;      bitsTileOffset = border*bitsPixel;      bitsTileOffset = 0;      for (i=0; i<th; i++) {        memcpy(buffer + i*imgRowSize  + bitsImgOffset,               tile   + i*bitsTileRow + bitsTileOffset,               bitsCurTileRow);      }      deblarg = finlarg+1;    }    finhaut = debhaut-1;    /* modify color */    if ( sc->par.coeff > 0.0f ) {      for (i=0; i<imgWidth*tileHeightNB*bitsPixel; i++)        if ( buffer[i] > 10 )          buffer[i] += (255-buffer[i]) * sc->par.coeff;        else          buffer[i] += buffer[i] * sc->par.coeff;    }    /* write row of tiles */    for (i=0; i<th; i++) {      /* reverse image */      rowPtr = buffer + (th-1-i) * imgRowSize;      writeEPSRow(out,key,rowPtr,imgWidth,bckbyte);    }  }  writeEPStrailer(out);  fclose(out);  free(tile);  free(buffer);  tiling = 0;    /* restore viewport */  glViewport(viewport[0],viewport[1],viewport[2],viewport[3]);  glDrawBuffer(GL_FRONT | GL_BACK);  farclip(GL_TRUE);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  if ( ddebug ) fprintf(stdout,"   Tiling completed.\n");  return(1);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?