ellipse.c

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

C
352
字号
#include "medit.h"#include "extern.h"#include "sproto.h"#include "eigenv.h"#ifndef M_PI2#define M_PI2  (2.0*M_PI)#endifextern int refmat;extern int eigen2(double m[3],double lambda[2],double vp[2][2]);static GLfloat IdMatrix[16] = {   1.0, 0.0, 0.0, 0.0,   0.0, 1.0, 0.0, 0.0,   0.0, 0.0, 1.0, 0.0,   0.0, 0.0, 0.0, 1.0};void drawEllipsoid(pScene sc,pMesh mesh,int typel,int k) {  pMaterial    pm;  pSolution    ps;  pTriangle    pt;  pTetra       pt1;  pPoint       p0;  GLfloat      mat[16],cx,cy,cz;  double       m[6],lambda[3],v[3][3];  int          i,j,l,iord;  /* compute average size */  if ( mesh->nfield != 6 || !mesh->nbb )  return;  /* draw average ellipse at element */  if ( typel == LPoint ) {    p0 = &mesh->point[k];    /*pm = &sc->material[refmat];*/    pm = &sc->material[p0->ref];    ps = &mesh->sol[k];    for (j=0; j<6; j++) m[j] = ps->m[j];    iord = eigenv(1,m,lambda,v);    if ( !iord )  return;    if ( mesh->ne ) {          fprintf(stdout,"  Eigenvectors :\n   vp1 : %f  %f  %f\n",              v[0][0],v[0][1],v[0][2]);      fprintf(stdout,"   vp2 : %f  %f  %f\n",v[1][0],v[1][1],v[1][2]);      fprintf(stdout,"   vp3 : %f  %f  %f\n",v[2][0],v[2][1],v[2][2]);      fprintf(stdout,"  Eigenvalues  : %f  %f  %f    %d\n",              lambda[0],lambda[1],lambda[2],iord);      if ( lambda[0] <= 0.0 || lambda[1] <= 0.0 || lambda[2] <= 0.0)        return;      fprintf(stdout,"  Sizes        : %f  %f  %f\n",              1.0/sqrt(lambda[0]),1.0/sqrt(lambda[1]),1.0/sqrt(lambda[2]));    }    else if ( lambda[0] <= 0.0 || lambda[1] <= 0.0 || lambda[2] <= 0.0)      return;    lambda[0] = max(EPS,0.5/sqrt(lambda[0]));    lambda[1] = max(EPS,0.5/sqrt(lambda[1]));    lambda[2] = max(EPS,0.5/sqrt(lambda[2]));    memcpy(mat,IdMatrix,16*sizeof(GLfloat));    for (j=0; j<3; j++)       for (l=0; l<3; l++)        mat[j*4+l] = v[j][l];    glDisable(GL_LIGHTING);    glPushMatrix();    glColor4fv(pm->dif);    glTranslatef(p0->c[0],p0->c[1],p0->c[2]);    glMultMatrixf(mat);    glScalef(lambda[0],lambda[1],lambda[2]);    glutWireSphere(1.,30,30);    glPopMatrix();    glEnable(GL_LIGHTING);  }  else if ( typel == LTria ) {    pt = &mesh->tria[k];    if ( mesh->nbb == mesh->np )      pm = &sc->material[refmat];    else if ( mesh->nbb == mesh->nt )	  pm = &sc->material[k];	else	  return;    glColor4fv(pm->dif);    for (j=0; j<6; j++) m[j] = 0.;    cx = cy = cz = 0.0;    for (i=0; i<3; i++) {      ps = &mesh->sol[pt->v[i]];      p0 = &mesh->point[pt->v[i]];      cx += p0->c[0];      cy += p0->c[1];      cz += p0->c[2];      for (j=0; j<6; j++)        m[j] += ps->m[j];    }    cx /= 3.;  cy /= 3.;  cz /= 3.;    for (j=0; j<6; j++)  m[j] /= 6.;    if ( !eigenv(1,m,lambda,v) )  return;    lambda[0] = max(EPS,0.5/sqrt(lambda[0]));    lambda[1] = max(EPS,0.5/sqrt(lambda[1]));    lambda[2] = max(EPS,0.5/sqrt(lambda[2]));    memcpy(mat,IdMatrix,16*sizeof(GLfloat));    for (j=0; j<3; j++)       for (l=0; l<3; l++)        mat[j*4+l] = v[j][l];    glDisable(GL_LIGHTING);    glPushMatrix();    glColor4fv(pm->dif);    glTranslatef(cx,cy,cz);    glMultMatrixf(mat);    glScalef(lambda[0],lambda[1],lambda[2]);    glutWireSphere(1.,30,30);    glPopMatrix();    glEnable(GL_LIGHTING);  }  else if ( typel == LTets ) {    pt1 = &mesh->tetra[k];    pm = &sc->material[refmat];    glColor4fv(pm->dif);    for (j=0; j<6; j++)  m[j] = 0.;    cx = cy = cz = 0.0;    for (i=0; i<4; i++) {      if ( mesh->nbb == mesh->np )        ps = &mesh->sol[pt1->v[i]];	  else if ( mesh->nbb == mesh->ntet )        ps = &mesh->sol[k];      else		return;      p0 = &mesh->point[pt1->v[i]];      cx += p0->c[0];      cy += p0->c[1];      cz += p0->c[2];      for (j=0; j<6; j++)        m[j] += ps->m[j];    }    cx /= 4.;  cy /= 4.;  cz /= 4.;    for (j=0; j<6; j++)  m[j] /= 6.;    if ( !eigenv(1,m,lambda,v) )  return;    lambda[0] = max(EPS,0.5/sqrt(lambda[0]));    lambda[1] = max(EPS,0.5/sqrt(lambda[1]));    lambda[2] = max(EPS,0.5/sqrt(lambda[2]));    memcpy(mat,IdMatrix,16*sizeof(GLfloat));    for (j=0; j<3; j++)       for (l=0; l<3; l++)        mat[j*4+l] = v[j][l];    glDisable(GL_LIGHTING);    glPushMatrix();    glColor4fv(pm->dif);    glTranslatef(cx,cy,cz);    glMultMatrixf(mat);    glScalef(lambda[0],lambda[1],lambda[2]);    glutWireSphere(1.,30,30);    glPopMatrix();    glEnable(GL_LIGHTING);	  }  else return;}void glCircle(float radius) {  float   ang,ux,uy;  ux = 0.0f;  uy = radius;  glBegin(GL_LINE_STRIP);  for (ang=0.0f; ang<=2*M_PI+0.2; ang+=0.2) {    ux = radius*(float)sin((double)ang);    uy = radius*(float)cos((double)ang);    glVertex2f(ux,uy);  }  glEnd();}void drawEllipse(pScene sc,pMesh mesh,int typel,int k) {  pMaterial    pm;  pSolution    ps;  pPoint       p0;  double       m[3],vp[2][2],lambda[2],dd1,dd2;  float        theta;  /* draw ellipse at vertex */  if ( typel == LPoint ) {    ps = &mesh->sol[k];    p0 = &mesh->point[k];    pm = &sc->material[refmat];    m[0] = ps->m[0];    m[1] = ps->m[1];    m[2] = ps->m[2];    if ( !eigen2(m,lambda,vp) ) return;    /* consider eigenvalues as sizes */    dd1 = 1.0 / sqrt(fabs(lambda[0]));    dd2 = 1.0 / sqrt(fabs(lambda[1]));    glDisable(GL_LIGHTING);    glPushMatrix();    glLineWidth(1.0);    glBegin(GL_LINES);      glColor3fv(pm->dif);      glVertex3f(p0->c[0],p0->c[1],0.0);      glColor3fv(pm->dif);      glVertex3f(p0->c[0]+dd1*vp[0][0],p0->c[1]+dd1*vp[0][1],0.0);      glColor3fv(pm->dif);      glVertex3f(p0->c[0],p0->c[1],0.0);      glColor3fv(pm->dif);      glVertex3f(p0->c[0]+dd2*vp[1][0],p0->c[1]+dd2*vp[1][1],0.0);    glEnd();    theta = atan2(vp[0][1],vp[0][0])*RTOD;    glTranslatef(p0->c[0],p0->c[1],0.0);    glRotatef(theta,0.0,0.0,1.0);    glScaled(dd1,dd2,0.0);    glColor3fv(pm->dif);    glCircle(1.0);    glLineWidth(1.0);    glPopMatrix();    glEnable(GL_LIGHTING);    /* print out info */    fprintf(stdout,"  Eigenvectors :\n");    fprintf(stdout,"   vp1 : %f  %f\n",vp[0][0],vp[0][1]);    fprintf(stdout,"   vp2 : %f  %f\n",vp[1][0],vp[1][1]);    fprintf(stdout,"  Eigenvalues  : %f  %f\n",lambda[0],lambda[1]);    fprintf(stdout,"  Sizes        : %f  %f\n",dd1,dd2);  }}GLuint drawAllEllipse(pScene sc,pMesh mesh) {  GLuint       dlist;  pSolution    ps;  pMaterial    pm;  pTriangle    pt;  pPoint       p0;  double       m[3],vp[2][2],lambda[2],dd1,dd2;  float        theta,cx,cy;  int          k,i,ref;  dlist = glGenLists(1);  glNewList(dlist,GL_COMPILE);  if ( glGetError() )  return(0);  /* draw ellipse at vertex */  glDisable(GL_LIGHTING);  glLineWidth(1.0);    if ( mesh->typage == 1 ) {    for (k=1; k<=mesh->ne; k++) {      ps = &mesh->sol[k];      pt = &mesh->tria[k];      if ( !pt->v[0] )  continue;      ref = matRef(sc,pt->ref);      pm  = &sc->material[ref];      if ( pm->flag )   continue;      cx = cy = 0.0;      for (i=0; i<3; i++) {        p0 = &mesh->point[pt->v[i]];        cx += p0->c[0];        cy += p0->c[1];      }      cx *= 1. / 3.;      cy *= 1. / 3.;      m[0] = ps->m[0];      m[1] = ps->m[1];      m[2] = ps->m[2];      if ( !eigen2(m,lambda,vp) ) return;      /* consider eigenvalues as sizes */      dd1 = 1.0 / sqrt(fabs(lambda[0]));      dd2 = 1.0 / sqrt(fabs(lambda[1]));      glPushMatrix();      theta = atan2(vp[0][1],vp[0][0])*RTOD;      glTranslatef(cx,cy,0.0);      glRotatef(theta,0.0,0.0,1.0);      glScaled(dd1,dd2,0.0);      glColor3fv(pm->dif);      glCircle(1.0);      glPopMatrix();    }  }  else {    for (k=1; k<=mesh->np; k++) {      ps = &mesh->sol[k];      p0 = &mesh->point[k];      ref = matRef(sc,p0->ref);      pm  = &sc->material[ref];      if ( pm->flag )   continue;      m[0] = ps->m[0];      m[1] = ps->m[1];      m[2] = ps->m[2];      if ( !eigen2(m,lambda,vp) ) return;      /* consider eigenvalues as sizes */      dd1 = 1.0 / sqrt(fabs(lambda[0]));      dd2 = 1.0 / sqrt(fabs(lambda[1]));      glPushMatrix();      theta = atan2(vp[0][1],vp[0][0])*RTOD;      glTranslatef(p0->c[0],p0->c[1],0.0);      glRotatef(theta,0.0,0.0,1.0);      glScaled(dd1,dd2,0.0);      glColor3fv(pm->dif);      glCircle(1.0);      glPopMatrix();    }  }  glEnable(GL_LIGHTING);  glEndList();  return(dlist);}void circumSphere(pScene sc,pMesh mesh,int typel,int k) {  pMaterial    pm;  double       c[3],rad;  cenrad(mesh,k,c,&rad);  rad = sqrt(rad);  pm = &sc->material[refmat];  glDisable(GL_LIGHTING);  glPushMatrix();  glColor4fv(pm->dif);  glTranslated(c[0],c[1],c[2]);  glScalef(rad,rad,rad);  glutWireSphere(1.,30,30);  glPopMatrix();  glEnable(GL_LIGHTING);}

⌨️ 快捷键说明

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