コード例 #1
0
ファイル: Mesh.cpp プロジェクト: rohan-sawhney/geodesics
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;
    }
}
コード例 #2
0
 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();
     }
 }
コード例 #3
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();
}
コード例 #4
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);
}