mlists.c

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

C
1,310
字号
        t1.c[1] = t2.b[1] = sc->shrink*(p2->c[1]-cy)+cy;         t1.c[2] = t2.b[2] = sc->shrink*(p2->c[2]-cz)+cz;         t2.c[0] = sc->shrink*(p3->c[0]-cx)+cx;         t2.c[1] = sc->shrink*(p3->c[1]-cy)+cy;         t2.c[2] = sc->shrink*(p3->c[2]-cz)+cz;       }      else {        t1.a[0] = t2.a[0] = p0->c[0];        t1.a[1] = t2.a[1] = p0->c[1];        t1.a[2] = t2.a[2] = p0->c[2];        t1.b[0] = p1->c[0];        t1.b[1] = p1->c[1];        t1.b[2] = p1->c[2];        t1.c[0] = t2.b[0] = p2->c[0];         t1.c[1] = t2.b[1] = p2->c[1];         t1.c[2] = t2.b[2] = p2->c[2];         t2.c[0] = p3->c[0];         t2.c[1] = p3->c[1];         t2.c[2] = p3->c[2];       }      if ( sc->type & S_FLAT ) {        memcpy(t1.na,n,3*sizeof(float));        memcpy(t1.nb,n,3*sizeof(float));        memcpy(t1.nc,n,3*sizeof(float));        memcpy(t2.na,n,3*sizeof(float));        memcpy(t2.nb,n,3*sizeof(float));        memcpy(t2.nc,n,3*sizeof(float));      }      else {        is0 = is1 = is2 = is3 = 0;        if ( mesh->extra->iv ) {          if ( pq->v[0] <= mesh->nvn )            is0 = mesh->extra->nv[pq->v[0]];          if ( pq->v[1] <= mesh->nvn )            is1 = mesh->extra->nv[pq->v[1]];          if ( pq->v[2] <= mesh->nvn )            is2 = mesh->extra->nv[pq->v[2]];          if ( pq->v[3] <= mesh->nvn )            is3 = mesh->extra->nv[pq->v[3]];        }        if ( !is0 && pq->v[0] <= mesh->extra->iq )          is0 = mesh->extra->nq[4*(k-1)+1];        if ( !is1 && pq->v[1] <= mesh->extra->iq )          is1 = mesh->extra->nq[4*(k-1)+2];        if ( !is2 && pq->v[2] <= mesh->extra->iq )          is2 = mesh->extra->nq[4*(k-1)+3];        if ( !is3 && pq->v[3] <= mesh->extra->iq )          is3 = mesh->extra->nq[4*(k-1)+4];                if ( !is0 )          memcpy(t1.na,n,3*sizeof(float));        else {          t1.na[0] = t2.na[0] = mesh->extra->n[3*(is0-1)+1];          t1.na[1] = t2.na[1] = mesh->extra->n[3*(is0-1)+2];          t1.na[2] = t2.na[2] = mesh->extra->n[3*(is0-1)+3];        }        if ( !is1 )          memcpy(t1.nb,n,3*sizeof(float));        else {          t1.nb[0] = mesh->extra->n[3*(is1-1)+1];          t1.nb[1] = mesh->extra->n[3*(is1-1)+2];          t1.nb[2] = mesh->extra->n[3*(is1-1)+3];        }        if ( !is2 )          memcpy(t1.nc,n,3*sizeof(float));        else {          t1.nc[0] = t2.nb[0] = mesh->extra->n[3*(is2-1)+1];          t1.nc[1] = t2.nb[1] = mesh->extra->n[3*(is2-1)+2];          t1.nc[2] = t2.nb[2] = mesh->extra->n[3*(is2-1)+3];        }        if ( !is3 )          memcpy(t1.nc,n,3*sizeof(float));        else {          t2.nc[0] = mesh->extra->n[3*(is3-1)+1];          t2.nc[1] = mesh->extra->n[3*(is3-1)+2];          t2.nc[2] = mesh->extra->n[3*(is3-1)+3];        }      }      if ( mesh->typage == 2 ) {        /* solutions at vertices */        ps0 = &mesh->sol[pq->v[0]];        ps1 = &mesh->sol[pq->v[1]];        ps2 = &mesh->sol[pq->v[2]];        ps3 = &mesh->sol[pq->v[3]];        t1.va = t2.va = ps0->bb;        t1.vb = ps1->bb;        t1.vc = t2.vb = ps2->bb;        t2.vc = ps3->bb;      }      else {        /* solution at element */        ps0 = &mesh->sol[k];        t1.va = t1.vb = t1.vc = ps0->bb;        t2.va = t2.vb = t2.vc = ps0->bb;      }      /* color interpolation */      cutTriangle(sc,t1);      cutTriangle(sc,t2);      k = pq->nxt;    }    glEnd();  }  glEndList();  return(dlist);}/* build list of tetrahedra */GLuint listTetraMap(pScene sc,pMesh mesh,ubyte clip) {  pMaterial  pm;  pTetra     pt;  pPoint     p0,p1,p2;  pSolution  ps0,ps1,ps2;  GLint      dlist = 0;  float      cx,cy,cz,ax,ay,az,bx,by,bz,d,n[3];  int        k,l,m;  triangle   t;  /* default */  if ( !mesh->ntet )  return(0);  if ( ddebug ) printf("create display list map / TETRA\n");  if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) )  return(0);  /* build display list */  dlist = glGenLists(1);  glNewList(dlist,GL_COMPILE);  if ( glGetError() )  return(0);    /* build list */  for (m=0; m<sc->par.nbmat; m++) {    pm = &sc->material[m];    k  = pm->depmat[LTets];    if ( !k || pm->flag )  continue;    glBegin(GL_TRIANGLES);    while ( k != 0 ) {      pt = &mesh->tetra[k];      if ( !pt->v[0] || (clip && !pt->clip) ) {        k = pt->nxt;        continue;      }      /* build 4 faces */      cx = cy = cz = 0.0f;      for (l=0; l<4; l++) {    p0  = &mesh->point[pt->v[l]];    cx += p0->c[0];        cy += p0->c[1];        cz += p0->c[2];      }      cx /= 4.;      cy /= 4.;      cz /= 4.;      for (l=0; l<4; l++) {    p0 = &mesh->point[pt->v[ct[l][0]]];    p1 = &mesh->point[pt->v[ct[l][1]]];    p2 = &mesh->point[pt->v[ct[l][2]]];        /* compute face normal */    ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2];    bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2];    n[0] = ay*bz - az*by;    n[1] = az*bx - ax*bz;    n[2] = ax*by - ay*bx;    d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2];    if ( d > 0.0f ) {      d = 1.0f / sqrt(d);      n[0] *= d;            n[1] *= d;            n[2] *= d;    }        /* store triangle */        t.a[0] = sc->shrink*(p0->c[0]-cx)+cx;        t.a[1] = sc->shrink*(p0->c[1]-cy)+cy;        t.a[2] = sc->shrink*(p0->c[2]-cz)+cz;        t.b[0] = sc->shrink*(p1->c[0]-cx)+cx;        t.b[1] = sc->shrink*(p1->c[1]-cy)+cy;        t.b[2] = sc->shrink*(p1->c[2]-cz)+cz;        t.c[0] = sc->shrink*(p2->c[0]-cx)+cx;        t.c[1] = sc->shrink*(p2->c[1]-cy)+cy;         t.c[2] = sc->shrink*(p2->c[2]-cz)+cz;                 /* store normals */        memcpy(t.na,n,3*sizeof(float));        memcpy(t.nb,n,3*sizeof(float));        memcpy(t.nc,n,3*sizeof(float));        if ( mesh->typage == 2 ) {          /* solutions at vertices */      ps0 = &mesh->sol[pt->v[ct[l][0]]];      ps1 = &mesh->sol[pt->v[ct[l][1]]];      ps2 = &mesh->sol[pt->v[ct[l][2]]];          t.va = ps0->bb;      t.vb = ps1->bb;      t.vc = ps2->bb;        }        else {          /* solution at element */            ps0 = &mesh->sol[k];      t.va = t.vb = t.vc = ps0->bb;        }        /* color interpolation */        cutTriangle(sc,t);      }      k = pt->nxt;    }    glEnd();  }  glEndList();  return(dlist);}/* build list of hexahedra */GLuint listHexaMap(pScene sc,pMesh mesh,ubyte clip) {  pMaterial  pm;  pHexa      ph;  pPoint     p0,p1,p2,p3;  pSolution  ps0,ps1,ps2,ps3;  GLint      dlist = 0;  double     ax,ay,az,bx,by,bz,d;  float      n[3],cx,cy,cz;  int        k,l,m;  triangle   t1,t2;  if ( !mesh->nhex )  return(0);  if ( ddebug ) printf("create display list map / HEXA\n");  if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) )  return(0);  /* build display list */  dlist = glGenLists(1);  glNewList(dlist,GL_COMPILE);  if ( glGetError() )  return(0);  /* build list */  for (m=0; m<sc->par.nbmat; m++) {    pm = &sc->material[m];    k  = pm->depmat[LHexa];    if ( !k || pm->flag )  continue;    glBegin(GL_TRIANGLES);    while ( k != 0 ) {      ph = &mesh->hexa[k];      if ( !ph->v[0] || (clip && !ph->clip) ) {        k = ph->nxt;        continue;      }      cx = cy = cz = 0.0f;      for (l=0; l<8; l++) {    p0  = &mesh->point[ph->v[l]];    cx += p0->c[0];        cy += p0->c[1];        cz += p0->c[2];      }      cx /= 8.;       cy /= 8.;      cz /= 8.;            for (l=0; l<6; l++) {    p0 = &mesh->point[ph->v[ch[l][0]]];    p1 = &mesh->point[ph->v[ch[l][1]]];    p2 = &mesh->point[ph->v[ch[l][2]]];    p3 = &mesh->point[ph->v[ch[l][3]]];            /* compute face normal */    ax = p1->c[0] - p0->c[0]; ay = p1->c[1] - p0->c[1]; az = p1->c[2] - p0->c[2];    bx = p2->c[0] - p0->c[0]; by = p2->c[1] - p0->c[1]; bz = p2->c[2] - p0->c[2];    n[0] = ay*bz - az*by;    n[1] = az*bx - ax*bz;    n[2] = ax*by - ay*bx;    d = n[0]*n[0] + n[1]*n[1] + n[2]*n[2];    if ( d > 0.0f ) {      d = 1.0f / sqrt(d);      n[0] *= d;            n[1] *= d;            n[2] *= d;    }        /* store triangles */        t1.a[0] = t2.a[0] = sc->shrink*(p0->c[0]-cx)+cx;        t1.a[1] = t2.a[1] = sc->shrink*(p0->c[1]-cy)+cy;        t1.a[2] = t2.a[2] = sc->shrink*(p0->c[2]-cz)+cz;        t1.b[0] = sc->shrink*(p1->c[0]-cx)+cx;        t1.b[1] = sc->shrink*(p1->c[1]-cy)+cy;        t1.b[2] = sc->shrink*(p1->c[2]-cz)+cz;        t1.c[0] = t2.b[0] = sc->shrink*(p2->c[0]-cx)+cx;         t1.c[1] = t2.b[1] = sc->shrink*(p2->c[1]-cy)+cy;         t1.c[2] = t2.b[2] = sc->shrink*(p2->c[2]-cz)+cz;         t2.c[0] = sc->shrink*(p3->c[0]-cx)+cx;         t2.c[1] = sc->shrink*(p3->c[1]-cy)+cy;         t2.c[2] = sc->shrink*(p3->c[2]-cz)+cz;         /* store normals */    memcpy(t1.na,n,3*sizeof(float));    memcpy(t1.nb,n,3*sizeof(float));    memcpy(t1.nc,n,3*sizeof(float));    memcpy(t2.na,n,3*sizeof(float));    memcpy(t2.nb,n,3*sizeof(float));    memcpy(t2.nc,n,3*sizeof(float));        if ( mesh->typage == 2 ) {          /* solutions at vertices */      ps0 = &mesh->sol[ph->v[ch[l][0]]];      ps1 = &mesh->sol[ph->v[ch[l][1]]];      ps2 = &mesh->sol[ph->v[ch[l][2]]];      ps3 = &mesh->sol[ph->v[ch[l][3]]];      t1.va = t2.va = ps0->bb;      t1.vb = ps1->bb;      t1.vc = t2.vb = ps2->bb;      t2.vc = ps3->bb;        }        else {          /* solution at element */      ps0 = &mesh->sol[k];      t1.va = t1.vb = t1.vc = ps0->bb;      t2.va = t2.vb = t2.vc = ps0->bb;        }        /* color interpolation */        cutTriangle(sc,t1);        cutTriangle(sc,t2);     }     k = ph->nxt;   }   glEnd();  }    glEndList();  return(dlist);}GLuint alt2dList(pScene sc,pMesh mesh,int geomtype,float shrink,float altcoef) {  pTriangle  pt,pt1;  pMaterial  pm;  pQuad      pq;  pPoint     p0,p1,p2,p3;  pSolution  ps0,ps1,ps2,ps3;  GLuint     dlist;  double     ax,ay,az,bx,by,bz,dd,kc,rgb[4];  float      cx,cy,cz,n[3];  int       *adj,k,m,ia,iadr;  ubyte     *voy;  triangle   t,t1,t2;  static double hsv[3] = { 0.0, 1.0, 0.80 };  static float  nn[3] = {1.0, 0.0, 0.0 };  /* default */  if ( ddebug ) printf("create 2d elevation map list\n");  if ( geomtype == LTria && !mesh->nt )  return(0);  if ( geomtype == LQuad && !mesh->nq )  return(0);  if ( egal(sc->iso.val[0],sc->iso.val[MAXISO-1]) )  return(0);  /* build display list */  dlist = glGenLists(1);  glNewList(dlist,GL_COMPILE);  if ( glGetError() )  return(0);  mesh->zmin = altcoef*mesh->bbmin;  mesh->zmax = altcoef*mesh->bbmax;  if ( mesh->bbmin*mesh->bbmax < 0.0 ) {    mesh->ztra = mesh->zmin;  }  else {    mesh->ztra = 0.95 * mesh->zmin;  }  switch (geomtype) {  case LTria:    if ( ddebug ) printf("create triangle list %d\n",mesh->nt);        if ( mesh->typage == 1 ) {      if ( mesh->nt && !hashTria(mesh) )    return(0);    }    glBegin(GL_TRIANGLES);    for (m=0; m<sc->par.nbmat; m++) {      pm = &sc->material[m];      k  = pm->depmat[LTria];      if ( !k || pm->flag )  continue;      while ( k != 0 ) {        pt = &mesh->tria[k];        if ( !pt->v[0] ) {          k = pt->nxt;          continue;        }        p0 = &mesh->point[pt->v[0]];        p1 = &mesh->point[pt->v[1]];        p2 = &mesh->point[pt->v[2]];              if ( mesh->typage == 1 )          ps0 = ps1 = ps2 = &mesh->sol[k];        else {          ps0  = &mesh->sol[pt->v[0]];          ps1  = &mesh->sol[pt->v[1]];          ps2  = &mesh->sol[pt->v[2]];        }        cx = (p0->c[0] + p1->c[0] + p2->c[0]) / 3.0;        cy = (p0->c[1] + p1->c[1] + p2->c[1]) / 3.0;        cz = (ps0->bb + ps1->bb + ps2->bb) / 3.0;        t.a[0] = shrink*(p0->c[0]-cx) + cx;        t.a[1] = shrink*(p0->c[1]-cy) + cy;        t.a[2] = shrink*(altcoef*ps0->bb-cz) + cz - 0.25*mesh->ztra;        t.b[0] = shrink*(p1->c[0]-cx) + cx;        t.b[1] = shrink*(p1->c[1]-cy) + cy;        t.b[2] = shrink*(altcoef*ps1->bb-cz) + cz - 0.25*mesh->ztra;                t.c[0] = shrink*(p2->c[0]-cx) + cx;        t.c[1] = shrink*(p2->c[1]-cy) + cy;        t.c[2] = shrink*(altcoef*ps2->bb-cz) + cz - 0.25*mesh->ztra;                /* compute normal */        ax = p1->c[0] - p0->c[0];        ay = p1->c[1] - p0->c[1];        az = p1->c[2] - p0->c[2];        bx = p2->c[0] - p0->c[0];        by = p2->c[1] - p0->c[1];        bz = p2->c[2] - p0->c[2];        n[0] = ay*bz - az*by;

⌨️ 快捷键说明

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