Ejemplo n.º 1
0
void Compute_Min_And_Max_Spread( SWIFT_Tri_Mesh* m, SWIFT_BV* p,
                                 SWIFT_Real& min_spread,
                                 SWIFT_Real& max_spread )
{
    int i, j;
    int fn = p->Num_All_Faces();
    int* fs = new int[fn*3];
    for( i = 0, j = 0; i < p->Num_Faces(); i++ ) {
        fs[j++] = m->Vertex_Id( p->Faces()[i].Edge1().Origin() );
        fs[j++] = m->Vertex_Id( p->Faces()[i].Edge2().Origin() );
        fs[j++] = m->Vertex_Id( p->Faces()[i].Edge3().Origin() );
    }
    for( i = 0; i < p->Num_Other_Faces(); i++ ) {
        fs[j++] = m->Vertex_Id( p->Other_Faces()[i]->Edge1().Origin() );
        fs[j++] = m->Vertex_Id( p->Other_Faces()[i]->Edge2().Origin() );
        fs[j++] = m->Vertex_Id( p->Other_Faces()[i]->Edge3().Origin() );
    }

    SWIFT_Triple min_dir, mid_dir, max_dir;
    SWIFT_Tri_Edge* starte;
    Compute_Spread( m->Vertices(), fs, fn, true, p->Center_Of_Mass(),
                    min_dir, mid_dir, max_dir );
    starte = p->Other_Faces().Empty() ? p->Faces()[0].Edge1P()
                                      : p->Other_Faces()[0]->Edge1P();
    min_spread = p->Extremal_Vertex( min_dir, p->Level(), starte );
    max_spread = p->Extremal_Vertex( max_dir, p->Level(), starte );
    min_spread -= p->Extremal_Vertex( -min_dir, p->Level(), starte );
    max_spread -= p->Extremal_Vertex( -max_dir, p->Level(), starte );

    delete fs;
}
Ejemplo n.º 2
0
void Compute_Spread( SWIFT_Tri_Mesh* m,
                     SWIFT_Triple& min_dir, SWIFT_Real& min_spread,
                     SWIFT_Triple& max_dir, SWIFT_Real& max_spread )
{
    int i, j;
    int fn = m->Num_Faces();
    int* fs = new int[fn*3];
    for( i = 0, j = 0; i < m->Num_Faces(); i++ ) {
        fs[j++] = m->Vertex_Id( m->Faces()[i].Edge1().Origin() );
        fs[j++] = m->Vertex_Id( m->Faces()[i].Edge2().Origin() );
        fs[j++] = m->Vertex_Id( m->Faces()[i].Edge3().Origin() );
    }

    Compute_Spread( m->Vertices(), fs, fn, m->Center_Of_Mass(),
                    min_dir, min_spread, max_dir, max_spread );

    delete fs;
}
Ejemplo n.º 3
0
void Compute_Spread( SWIFT_Array<SWIFT_Tri_Vertex>& vs, SWIFT_Triple& center,
                     bool compute_spreads,
                     SWIFT_Triple& min_dir, SWIFT_Real& min_spread,
                     SWIFT_Triple& mid_dir, SWIFT_Real& mid_spread,
                     SWIFT_Triple& max_dir, SWIFT_Real& max_spread )
{
    int fn;
    int* fs;

    if( vs.Length() == 3 ) {
        fs = new int[6];
        fs[0] = 0; fs[1] = 1; fs[2] = 2;
        fs[3] = 0; fs[4] = 2; fs[5] = 1;
        fn = 2;
    } else {
        Compute_Convex_Hull( vs, fs, fn );
    }

    Compute_Spread( vs, fs, fn, false, center, min_dir, mid_dir, max_dir );

    if( compute_spreads ) {
        // Now we have compute the spreads.  This can be done by inserting
        // convex hull vertices into an OBB or by doing hill climbing on the
        // convex hull.  We will go for the first option since building the
        // connectivity of the convex hull is too expensive.

        int i;
        SWIFT_Real min_min_spread = SWIFT_INFINITY;
        SWIFT_Real min_mid_spread = SWIFT_INFINITY;
        SWIFT_Real min_max_spread = SWIFT_INFINITY;
        min_spread = -SWIFT_INFINITY;
        mid_spread = -SWIFT_INFINITY;
        max_spread = -SWIFT_INFINITY;

        for( i = 0; i < fn*3; ) {
            const SWIFT_Triple& v1 = vs[fs[i++]].Coords();
            const SWIFT_Triple& v2 = vs[fs[i++]].Coords();
            const SWIFT_Triple& v3 = vs[fs[i++]].Coords();

            const SWIFT_Real min_dot1 = min_dir * v1;
            const SWIFT_Real min_dot2 = min_dir * v2;
            const SWIFT_Real min_dot3 = min_dir * v3;

            const SWIFT_Real mid_dot1 = mid_dir * v1;
            const SWIFT_Real mid_dot2 = mid_dir * v2;
            const SWIFT_Real mid_dot3 = mid_dir * v3;

            const SWIFT_Real max_dot1 = max_dir * v1;
            const SWIFT_Real max_dot2 = max_dir * v2;
            const SWIFT_Real max_dot3 = max_dir * v3;

            Min_And_Max( min_min_spread, min_spread, min_dot1 );
            Min_And_Max( min_min_spread, min_spread, min_dot2 );
            Min_And_Max( min_min_spread, min_spread, min_dot3 );

            Min_And_Max( min_mid_spread, mid_spread, mid_dot1 );
            Min_And_Max( min_mid_spread, mid_spread, mid_dot2 );
            Min_And_Max( min_mid_spread, mid_spread, mid_dot3 );

            Min_And_Max( min_max_spread, max_spread, max_dot1 );
            Min_And_Max( min_max_spread, max_spread, max_dot2 );
            Min_And_Max( min_max_spread, max_spread, max_dot3 );
        }

        // Recompute the center
        center = 0.5 * (SWIFT_Triple( max_spread, mid_spread, min_spread ) +
             SWIFT_Triple( min_max_spread, min_mid_spread, min_min_spread ));

        min_spread -= min_min_spread;
        mid_spread -= min_mid_spread;
        max_spread -= min_max_spread;
    }

    delete fs;
}