normal.c
来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 151 行
C
151 行
#include "medit.h"#include "extern.h"#include "sproto.h"GLuint drawNormals(pMesh mesh,pScene sc) { pTriangle pt; pQuad pq; pEdge pr; pPoint ppt; GLuint dlist = 0; double nn[3]; float *n,p[3],scal; int i,k,kk,ki,iadr; /* default */ if ( !mesh->nvn ) return(0); if ( ddebug ) printf("display normals, tangents\n"); /* build display list */ dlist = glGenLists(1); glNewList(dlist,GL_COMPILE); if ( glGetError() ) return(0); if ( sc->type & S_OPPOS ) scal = -0.025; else scal = 0.025; scal *= sc->dmax; glColor3f(0.8,0.2,0.6); glLineWidth(2.0); glBegin(GL_LINES); /* normals at vertices */ if ( mesh->extra->iv && mesh->extra->nv ) { for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ki = mesh->extra->nv[k]; if ( ki > 0 ) { iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } /* normal at triangle vertices */ if ( mesh->extra->it && mesh->extra->nt ) { for (k=1; k<=mesh->nt; k++) { pt = &mesh->tria[k]; if ( !pt->v[0] ) continue; for ( i=0; i<3; i++) { kk = 3*(k-1)+i+1; ki = mesh->extra->nt[kk]; if ( ki > 0 ) { ppt = &mesh->point[pt->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } /* normal at quad vertices */ if ( mesh->extra->iq && mesh->extra->nq ) { for (k=1; k<=mesh->nq; k++) { pq = &mesh->quad[k]; if ( !pq->v[0] ) continue; for ( i=0; i<4; i++) { kk = 4*(k-1)+i+1; ki = mesh->extra->nq[kk]; if ( ki > 0 ) { ppt = &mesh->point[pq->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->n[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } /* tangents at vertices */ if ( mesh->extra->jv && mesh->extra->tv ) { glColor3f(0.2,0.6,0.8); for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ki = mesh->extra->tv[k]; if ( ki > 0 ) { iadr = 3*(ki-1)+1; n = &mesh->extra->t[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } /* tangent at edge vertices */ if ( mesh->extra->je && mesh->extra->te ) { for (k=1; k<=mesh->na; k++) { pr = &mesh->edge[k]; if ( !pr->v[0] ) continue; for ( i=0; i<2; i++) { kk = 2*(k-1)+i+1; ki = mesh->extra->te[kk]; if ( ki > 0 ) { ppt = &mesh->point[pr->v[i]]; iadr = 3*(ki-1)+1; n = &mesh->extra->t[ iadr ]; p[0] = ppt->c[0]; p[1] = ppt->c[1]; p[2] = ppt->c[2]; nn[0] = n[0]; nn[1] = n[1]; nn[2] = n[2]; drawVector3D(p,nn,scal); } } } } glEnd(); glLineWidth(1.0); glEndList(); return(dlist);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?