示例#1
0
    /** Generate elements
     */
    static void makeElements( const SURF& surf,
                              std::vector<Element>& elements )
    {
        const unsigned n1 = surf.numIntervals1();
        const unsigned n2 = surf.numIntervals2();
        
        for ( unsigned j = 0; j < n2; j++ ) {
            for ( unsigned i = 0; i < n1; i++ ) {

                // following indices with boundary periodicity
                const std::size_t iNext =
                    ( i < n1 - 1 ? i+1 :
                      (surf.periodic1() ? 0 : i+1) );
                const std::size_t jNext = 
                    ( j < n2 - 1 ? j+1 :
                      (surf.periodic2() ? 0 : j+1) );

                // index shift to next line
                const unsigned stride =
                    n1 + static_cast<unsigned>(not surf.periodic1());
                
                // the four vertices of a quadrilateral
                const std::size_t i1 = j     * stride + i;
                const std::size_t i2 = j     * stride + iNext;
                const std::size_t i4 = jNext * stride + i;
                const std::size_t i3 = jNext * stride + iNext;

                if ( surf.withTriangles() ) {
                    // generate two triangles
                    Element tri1, tri2;
                    tri1.push_back( i1 );
                    tri1.push_back( i2 );
                    tri1.push_back( i3 );
                    tri2.push_back( i3 );
                    tri2.push_back( i4 );
                    tri2.push_back( i1 );
                    elements.push_back( tri1 );
                    elements.push_back( tri2 );
                
                }
                else {
                    // generate a quadrilateral
                    Element quad;
                    quad.push_back( i1 );
                    quad.push_back( i2 );
                    quad.push_back( i3 );
                    quad.push_back( i4 );
                    elements.push_back( quad );
                }
            }
        }
        return;
    }
示例#2
0
    /** Generate points
     */
    static void makePoints( const SURF& surf,
                            std::vector<Point>& points )
    {
        const unsigned n1 =
            surf.numIntervals1() + (surf.periodic1() ? 0 : 1 );
        const unsigned n2 =
            surf.numIntervals2() + (surf.periodic2() ? 0 : 1 );
        
        for ( unsigned j = 0; j < n2; j++ ) {
            for ( unsigned i = 0; i < n1; i++ ) {
                points.push_back( surf.makePoint( i, j ) );
            }
        }

    }