예제 #1
0
파일: gui.cpp 프로젝트: ipa-nhg/kukadu
int Upper_Leaves_CB( Togl *togl, int argc, const char *argv[] )
{
    int i;

    if( uleaves ) {
        // Include all leaves above the current level
        for( i = 0; i < num_leaves; i++ ) {
            if( leaves[i]->Level() < level ) {
                which_pieces.Add_Grow( leaves[i], 10 );
            }
        }
    } else {
        // Remove all leaves above the current level
        SWIFT_Array<SWIFT_BV*> new_which_pieces;

        new_which_pieces.Create( which_pieces.Length() );
        new_which_pieces.Set_Length( 0 );
        for( i = 0; i < which_pieces.Length(); i++ ) {
            if( !which_pieces[i]->Is_Leaf() ||
                which_pieces[i]->Level() == level
            ) {
                // Keep this piece
                new_which_pieces.Add( which_pieces[i] );
            }
        }

        which_pieces.Destroy();
        which_pieces = new_which_pieces;
        new_which_pieces.Nullify();
    }

    Togl_PostRedisplay( t );
    return TCL_OK;
}
예제 #2
0
void Edge_Flip( SWIFT_Tri_Mesh* m, SWIFT_Real etol )
{
    const SWIFT_Real etol_sq = etol*etol;
    int i;
    SWIFT_Tri_Face f;
    SWIFT_Array<SWIFT_Tri_Edge*> fedges;

    // Have all the convex edges marked
    Prepare_Mesh_For_Decomposition( m );

    // Traverse all the faces, marking edges that are not allowed to be flipped
    for( i = 0; i < m->Num_Faces(); i++ ) {
        if( m->Faces()[i].Edge1().Unmarked() ) {
            // May be able to flip this edge

            // Build the proposed edge
            f.Edge1().Set_Origin( m->Faces()[i].Edge3().Origin() );
            f.Edge2().Set_Origin(
                            m->Faces()[i].Edge1().Twin()->Prev()->Origin() );
            f.Edge1().Compute_Direction_Length();
            if( Edge_Flip_Allowed( m->Faces()[i].Edge1P(), f.Edge1P(), etol_sq )
            ) {
                fedges.Add_Grow( m->Faces()[i].Edge1P(), 100 );
                // Have to mark other edges in these two faces as well as
                // their twins
                m->Faces()[i].Edge2().Mark();
                m->Faces()[i].Edge2().Twin()->Mark();
                m->Faces()[i].Edge3().Mark();
                m->Faces()[i].Edge3().Twin()->Mark();

                m->Faces()[i].Edge1().Twin()->Next()->Mark();
                m->Faces()[i].Edge1().Twin()->Next()->Twin()->Mark();
                m->Faces()[i].Edge1().Twin()->Prev()->Mark();
                m->Faces()[i].Edge1().Twin()->Prev()->Twin()->Mark();
            }
            m->Faces()[i].Edge1().Mark();
            m->Faces()[i].Edge1().Twin()->Mark();
        }
        if( m->Faces()[i].Edge2().Unmarked() ) {
            // May be able to flip this edge

            // Build the proposed edge
            f.Edge1().Set_Origin( m->Faces()[i].Edge1().Origin() );
            f.Edge2().Set_Origin(
                            m->Faces()[i].Edge2().Twin()->Prev()->Origin() );
            f.Edge1().Compute_Direction_Length();
            if( Edge_Flip_Allowed( m->Faces()[i].Edge2P(), f.Edge1P(), etol_sq )
            ) {
                fedges.Add_Grow( m->Faces()[i].Edge2P(), 100 );
                m->Faces()[i].Edge1().Mark();
                m->Faces()[i].Edge1().Twin()->Mark();
                m->Faces()[i].Edge3().Mark();
                m->Faces()[i].Edge3().Twin()->Mark();

                m->Faces()[i].Edge2().Twin()->Next()->Mark();
                m->Faces()[i].Edge2().Twin()->Next()->Twin()->Mark();
                m->Faces()[i].Edge2().Twin()->Prev()->Mark();
                m->Faces()[i].Edge2().Twin()->Prev()->Twin()->Mark();
            }
            m->Faces()[i].Edge2().Mark();
            m->Faces()[i].Edge2().Twin()->Mark();
        }
        if( m->Faces()[i].Edge3().Unmarked() ) {
            // May be able to flip this edge

            // Build the proposed edge
            f.Edge1().Set_Origin( m->Faces()[i].Edge2().Origin() );
            f.Edge2().Set_Origin(
                            m->Faces()[i].Edge3().Twin()->Prev()->Origin() );
            f.Edge1().Compute_Direction_Length();
            if( Edge_Flip_Allowed( m->Faces()[i].Edge3P(), f.Edge1P(), etol_sq )
            ) {
                fedges.Add_Grow( m->Faces()[i].Edge3P(), 100 );
                m->Faces()[i].Edge1().Mark();
                m->Faces()[i].Edge1().Twin()->Mark();
                m->Faces()[i].Edge2().Mark();
                m->Faces()[i].Edge2().Twin()->Mark();

                m->Faces()[i].Edge3().Twin()->Next()->Mark();
                m->Faces()[i].Edge3().Twin()->Next()->Twin()->Mark();
                m->Faces()[i].Edge3().Twin()->Prev()->Mark();
                m->Faces()[i].Edge3().Twin()->Prev()->Twin()->Mark();
            }
            m->Faces()[i].Edge3().Mark();
            m->Faces()[i].Edge3().Twin()->Mark();
        }
    }

    cerr << "Flipped " << fedges.Length() << " edges" << endl;

    // Do the actual swaps
    for( i = 0; i < fedges.Length(); i++ ) {
        SWIFT_Tri_Edge* t1 = fedges[i]->Prev()->Twin();
        SWIFT_Tri_Edge* t2 = fedges[i]->Twin()->Prev()->Twin();

        // Set the origins
        fedges[i]->Set_Origin( fedges[i]->Twin()->Prev()->Origin() );
        fedges[i]->Twin()->Set_Origin( fedges[i]->Prev()->Origin() );

        // Set the flipped edge twins
        fedges[i]->Prev()->Set_Twin( fedges[i]->Twin()->Prev() );
        fedges[i]->Twin()->Prev()->Set_Twin( fedges[i]->Prev() );

        // Set the lengths, directions and twins
        fedges[i]->Twin()->Set_Length( t1->Length() );
        fedges[i]->Twin()->Set_Direction_N( -t1->Direction() );
        fedges[i]->Twin()->Set_Twin( t1 );
        t1->Set_Twin( fedges[i]->Twin() );

        fedges[i]->Set_Length( t2->Length() );
        fedges[i]->Set_Direction_N( -t2->Direction() );
        fedges[i]->Set_Twin( t2 );
        t2->Set_Twin( fedges[i] );

        // Compute the lengths and directions of the flipped edge
        fedges[i]->Prev()->Compute_Direction_Length_Twin();

        // Compute the face normals using the two "good" edges
        fedges[i]->Adj_Face()->Compute_Plane_From_Edges( fedges[i] );
        fedges[i]->Prev()->Twin()->Adj_Face()->Compute_Plane_From_Edges(
                                fedges[i]->Prev()->Twin()->Next() );

        // Set the adjacent edges for the vertices
        fedges[i]->Origin()->Set_Adj_Edge( fedges[i] );
        fedges[i]->Next()->Origin()->Set_Adj_Edge( fedges[i]->Next() );
        fedges[i]->Prev()->Origin()->Set_Adj_Edge( fedges[i]->Prev() );
        fedges[i]->Prev()->Twin()->Prev()->Origin()->Set_Adj_Edge(
                                        fedges[i]->Prev()->Twin()->Prev() );
    }
    Prepare_Mesh_For_Decomposition( m );
}