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; }
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 ); }