void Mesh::computeFaceGradients(Eigen::MatrixXd& gradients, const Eigen::VectorXd& u) const { for (FaceCIter f = faces.begin(); f != faces.end(); f++) { Eigen::Vector3d gradient; gradient.setZero(); Eigen::Vector3d normal = f->normal(); normal.normalize(); HalfEdgeCIter he = f->he; do { double ui = u(he->next->next->vertex->index); Eigen::Vector3d ei = he->next->vertex->position - he->vertex->position; gradient += ui * normal.cross(ei); he = he->next; } while (he != f->he); gradient /= (2.0 * f->area()); gradient.normalize(); gradients.row(f->index) = -gradient; } }
void Viewer :: drawPolygons( void ) { for (FaceCIter f = mesh->faces.begin(); f != mesh->faces.end(); f ++ ) { bool onBoundary = f->isBoundary(); if( onBoundary ) continue; glBegin( GL_POLYGON ); if( renderWireframe ) { Vector3D N = f->normal(); glNormal3dv( &N[0] ); } HalfEdgeCIter he = f->he; do { if( not renderWireframe ) { Vector3D N = he->vertex->normal(); glNormal3dv( &N[0] ); } glVertex3dv( &he->vertex->position[0] ); he = he->next; } while( he != f->he ); glEnd(); } }
void Viewer :: drawVectorField( void ) { shader.disable(); glPushAttrib( GL_ALL_ATTRIB_BITS ); double h = 0.25*mesh.meanEdgeLength(); glDisable( GL_LIGHTING ); glColor3f( 0., 0., 0. ); glLineWidth( 2.0 ); for( FaceCIter f = mesh.faces.begin(); f != mesh.faces.end(); f ++ ) { if( f->isBoundary() ) continue; Vector a = f->barycenter(); Vector b = a + h*f->vector; Vector n = f->normal(); Vector v = b - a; Vector v90 = cross(n, v); Vector p0 = b; Vector p1 = p0 - 0.2 * v - 0.1 * v90; Vector p2 = p0 - 0.2 * v + 0.1 * v90; glBegin( GL_LINES ); glVertex3dv( &a[0] ); glVertex3dv( &b[0] ); glEnd(); glBegin(GL_TRIANGLES); glVertex3dv( &p0[0] ); glVertex3dv( &p1[0] ); glVertex3dv( &p2[0] ); glEnd(); } glPopAttrib(); }
void Viewer :: drawPolygons( void ) { glEnable(GL_COLOR_MATERIAL); for( FaceCIter f = mesh.faces.begin(); f != mesh.faces.end(); f ++ ) { if( f->isBoundary() ) continue; glBegin( GL_POLYGON ); if( renderWireframe ) { Vector N = f->normal(); glNormal3dv( &N[0] ); } HalfEdgeCIter he = f->he; do { if( not renderWireframe ) { Vector N = he->vertex->normal(); glNormal3dv( &N[0] ); } double alpha = he->vertex->distance / maxDistance; glColor4f( alpha, alpha, alpha, 1. ); glVertex3dv( &he->vertex->position[0] ); he = he->next; } while( he != f->he ); glEnd(); } glDisable(GL_COLOR_MATERIAL); }