コード例 #1
0
ファイル: Viewer.cpp プロジェクト: JianpingCAI/course
 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();
    }
 }
コード例 #2
0
ファイル: Mesh.cpp プロジェクト: JianpingCAI/course
 double Mesh::area( void ) const
 {
    double sum = 0.0;
    for( FaceCIter f = faces.begin();
        f != faces.end();
        f ++ )
    {
       sum += f->area();
    }
    return sum;
 }
コード例 #3
0
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);
    }
}
コード例 #4
0
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());
}
コード例 #5
0
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();
    }
}
コード例 #6
0
ファイル: Viewer.cpp プロジェクト: jiongchen/course
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();
}
コード例 #7
0
ファイル: Viewer.cpp プロジェクト: jiongchen/course
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);
}