void Viewer :: drawPolygons( void ) { 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] ); } glVertex3dv( &he->vertex->position[0] ); he = he->next; } while( he != f->he ); glEnd(); } }
double Mesh::area( void ) const { double sum = 0.0; for( FaceCIter f = faces.begin(); f != faces.end(); f ++ ) { sum += f->area(); } return sum; }
void GLMesh::fillPickBuffers() { int tris = (int)(mesh.faces.size() - mesh.boundaries.size()); // add faces int i = 0; pickVertices.resize(3*tris); for (FaceCIter f = mesh.faces.begin(); f != mesh.faces.end(); f++) { if (!f->isBoundary()) { int j = 0; Eigen::Vector3f color = elementColor(f->index); HalfEdgeCIter h = f->he; do { // set vertex pickVertices[3*i+j].position = h->vertex->position.cast<float>(); pickVertices[3*i+j].color = color; j++; h = h->next; } while (h != f->he); i++; } } // add vertex faces int verts = 0; for (VertexCIter v = mesh.vertices.begin(); v != mesh.vertices.end(); v++) { verts += v->degree(); if (v->isBoundary()) verts -= 1; } pickVertices.resize(3*(tris + verts)); for (VertexCIter v = mesh.vertices.begin(); v != mesh.vertices.end(); v++) { Eigen::Vector3d n = 0.0015*v->normal(); Eigen::Vector3f p1 = (v->position + n).cast<float>(); Eigen::Vector3f color = elementColor(tris + v->index); HalfEdgeCIter h = v->he; do { if (!h->onBoundary) { Eigen::Vector3f p2 = (h->next->vertex->position + n).cast<float>(); Eigen::Vector3f p3 = (h->next->next->vertex->position + n).cast<float>(); pickVertices[3*i+0].position = p1; pickVertices[3*i+1].position = p1 + 0.125*(p2 - p1); pickVertices[3*i+2].position = p1 + 0.125*(p3 - p1); pickVertices[3*i+0].color = pickVertices[3*i+1].color = pickVertices[3*i+2].color = color; i++; } h = h->flip->next; } while (h != v->he); } }
void Mesh::buildNonContractibleCycles(std::vector<BasisCycle>& basisCycles) { generators.clear(); buildPrimalSpanningTree(); buildDualSpanningTree(); for (EdgeCIter e = edges.begin(); e != edges.end(); e++) { HalfEdgeIter he = e->he; if (!he->inPrimalSpanningTree() && !he->inDualSpanningTree()) { BasisCycle cycle; cycle.push_back(he); // trace loop in both directions BasisCycle temp1; FaceCIter f = he->flip->face; while (f != f->parent) { FaceCIter fp = f->parent; temp1.push_back(f->sharedEdge(fp)); f = fp; } BasisCycle temp2; f = he->face; while (f != f->parent) { FaceCIter fp = f->parent; temp2.push_back(f->sharedEdge(fp)); f = fp; } // remove common edges int t1 = (int)temp1.size()-1; int t2 = (int)temp2.size()-1; while (temp1[t1] == temp2[t2]) { t1--; t2--; } for (int i = 0; i <= t1; i++) { cycle.push_back(temp1[i]); } for (int i = t2; i >= 0; i--) { cycle.push_back(temp2[i]->flip); } generators.push_back(cycle); } } basisCycles.insert(basisCycles.end(), generators.begin(), generators.end()); }
void drawFaces() { glColor4f(0.0, 0.0, 1.0, 0.6); for (FaceCIter f = mesh.faces.begin(); f != mesh.faces.end(); f++) { if (f->isBoundary()) continue; glBegin(GL_LINE_LOOP); HalfEdgeCIter he = f->he; do { glVertex3d(he->vertex->position.x(), he->vertex->position.y(), he->vertex->position.z()); 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); }