diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h index 92f40714f85..fdf44920f51 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map_operations.h @@ -779,7 +779,7 @@ namespace CGAL { for (CMap_dart_const_iterator_of_cell it(amap, adart); res && it.cont(); ++it) { - if (it->beta(i-2)->beta(i-1) != it->beta_inv(i-2)->beta(i-1) ) + if ( it->beta(i-2)->beta(i-1)!=it->beta(i-1)->beta_inv(i-2) ) res = false; } return res; @@ -979,28 +979,26 @@ namespace CGAL { if ( dg1!=NULL ) amap.template group_attribute<0>(dg1, dg2); - // 3) We modify the darts of the cells incident to the edge - // when they are marked to remove. - for (it=to_erase.begin(); it!=to_erase.end(); ++it) - { amap.update_dart_of_all_attributes(*it, mark); } - // 4) For each dart of the cell, we modify link of neighbors. for ( it=to_erase.begin(); it!=to_erase.end(); ++it ) { if ( !(*it)->is_free(0) ) { - if ( !(*it)->is_free(1) && (*it)->beta(0)!=(*it) ) + if ( !(*it)->is_free(1) ) { - amap.template basic_link_beta<1>((*it)->beta(0), (*it)->beta(1)); - modified_darts.push_back((*it)->beta(0)); - modified_darts.push_back((*it)->beta(1)); - + if ( (*it)->beta(1)!=*it ) + { + /* modified_darts.push_back((*it)->beta(0)); + if ( (*it)->beta(0)!=(*it)->beta(1) )*/ + modified_darts.push_back((*it)->beta(1)); + amap.template basic_link_beta<1>((*it)->beta(0), (*it)->beta(1)); + } } else { // TODO todegroup.push(Dart_pair((*it)->beta(0), *it)); - (*it)->beta(0)->unlink_beta(1); modified_darts.push_back((*it)->beta(0)); + (*it)->beta(0)->unlink_beta(1); } } else @@ -1008,8 +1006,8 @@ namespace CGAL { if ( !(*it)->is_free(1) ) { // TODO todegroup.push(Dart_pair((*it)->beta(1), *it)); - (*it)->beta(1)->unlink_beta(0); modified_darts.push_back((*it)->beta(1)); + (*it)->beta(1)->unlink_beta(0); } } } @@ -1017,7 +1015,7 @@ namespace CGAL { // We test the split of all the incident cells for all the non // void attributes. Map::Helper::template Foreach_enabled_attributes - >:: + >:: // >:: run(&amap, &modified_darts, -1); //mark_modified_darts); diff --git a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h index 6da55d4e48c..d2d0413c8bb 100644 --- a/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h +++ b/Linear_cell_complex/test/Linear_cell_complex/Linear_cell_complex_3_test.h @@ -38,7 +38,7 @@ bool check_number_of_cells_3(LCC& lcc, unsigned int nbv, unsigned int nbe, assert(false); return false; } - + std::vector nbc; nbc=lcc.count_all_cells(); @@ -63,7 +63,7 @@ bool check_number_of_cells_3(LCC& lcc, unsigned int nbv, unsigned int nbe, assert(false); return false; } - + return true; } @@ -82,7 +82,7 @@ typename LCC::Dart_handle make_face_two_edges(LCC& lcc, { typename LCC::Dart_handle dh1 = lcc.create_dart(p1); lcc.template sew<1>(dh1, lcc.create_dart(p2)); - lcc.template sew<1>(dh1, dh1->beta(1)); + lcc.template sew<0>(dh1, dh1->beta(1)); return dh1; } @@ -93,21 +93,21 @@ bool test_LCC_3() typedef typename LCC::Dart_handle Dart_handle; typedef typename LCC::Point Point; - + // Construction operations Dart_handle dh1=lcc.make_segment(Point(0,0,0),Point(1,0,0)); Dart_handle dh2=lcc.make_segment(Point(2,0,0),Point(2,1,0)); Dart_handle dh3=lcc.make_segment(Point(2,2,0),Point(3,1,0)); if ( !check_number_of_cells_3(lcc, 6, 3, 6, 3, 3) ) return false; - + lcc.template sew<0>(dh2,dh1); lcc.template sew<1>(dh2,dh3); if ( !check_number_of_cells_3(lcc, 4, 3, 4, 1, 1) ) return false; Dart_handle dh5=lcc.make_triangle(Point(5,5,3),Point(7,5,3),Point(6,6,3)); - Dart_handle dh6=lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); + Dart_handle dh6=lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); if ( !check_number_of_cells_3(lcc, 10, 9, 6, 3, 3) ) return false; @@ -164,7 +164,7 @@ bool test_LCC_3() CGAL::remove_cell(lcc, dh14); if ( !check_number_of_cells_3(lcc, 18, 26, 17, 4, 3) ) return false; - + lcc.template unsew<3>(dh12); if ( !check_number_of_cells_3(lcc, 21, 29, 18, 4, 4) ) return false; @@ -173,7 +173,7 @@ bool test_LCC_3() CGAL::remove_cell(lcc, dh12); if ( !check_number_of_cells_3(lcc, 13, 17, 10, 2, 2) ) return false; - + CGAL::remove_cell(lcc, dh11); if ( !check_number_of_cells_3(lcc, 12, 16, 10, 2, 2) ) return false; @@ -184,14 +184,14 @@ bool test_LCC_3() itend=lcc.template darts_of_cell<0,2>(dh10).end(); it!=itend; ++it ) toremove.push_back( it ); - + for ( typename std::vector::iterator it=toremove.begin(), itend=toremove.end(); it!=itend; ++it ) CGAL::remove_cell(lcc, *it); toremove.clear(); if ( !check_number_of_cells_3(lcc, 11, 13, 8, 2, 2) ) return false; - + CGAL::remove_cell(lcc, dh9); if ( !check_number_of_cells_3(lcc, 10, 12, 8, 2, 2) ) return false; @@ -201,14 +201,14 @@ bool test_LCC_3() itend=lcc.template darts_of_cell<0,2>(dh8).end(); it!=itend; ++it ) toremove.push_back( it ); - + for ( typename std::vector::iterator it=toremove.begin(), itend=toremove.end(); it!=itend; ++it ) CGAL::remove_cell(lcc, *it); toremove.clear(); if ( !check_number_of_cells_3(lcc, 9, 9, 6, 2, 2) ) return false; - + CGAL::remove_cell(lcc, dh7); if ( !check_number_of_cells_3(lcc, 8, 8, 6, 2, 2) ) return false; @@ -226,13 +226,13 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 5, 3, 5, 2, 2) ) return false; - lcc.template unsew<0>(dh2); + lcc.template unsew<0>(dh2); if ( !check_number_of_cells_3(lcc, 6, 3, 6, 3, 3) ) return false; CGAL::remove_cell(lcc, dh1); CGAL::remove_cell(lcc, dh2); - CGAL::remove_cell(lcc, dh3); + CGAL::remove_cell(lcc, dh3); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) return false; @@ -357,7 +357,7 @@ bool test_LCC_3() dh2 = lcc.make_triangle(Point(5,4,3),Point(7,4,3),Point(6,3,3)); lcc.template sew<2>(dh1, dh2); - dh2 = lcc.make_triangle(Point(5,5,4),Point(7,5,4),Point(6,6,4)); + dh3 = lcc.make_triangle(Point(5,5,4),Point(7,5,4),Point(6,6,4)); lcc.template sew<3>(dh1, dh3); dh3 = lcc.make_triangle(Point(5,4,4),Point(7,4,4),Point(6,3,4)); @@ -442,7 +442,7 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 9, 17, 11, 2, 1) ) return false; - CGAL::contract_cell(lcc,dh1->beta(1)); + CGAL::contract_cell(lcc,dh1); if ( !check_number_of_cells_3(lcc, 10, 16, 10, 2, 2 ) ) return false; lcc.clear(); @@ -614,16 +614,44 @@ bool test_LCC_3() return false; dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0)); - lcc.template sew<1>(dh1, dh1); + lcc.template sew<1>(dh1, dh1); lcc.template sew<1>(dh1->beta(2), dh1->beta(2)); CGAL::contract_cell(lcc,dh1); if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) return false; lcc.clear(); - dh1 = lcc.make_segment(Point(0,0,0),Point(1,0,0)); - lcc.template sew<1>(dh1, dh1); lcc.template sew<1>(dh1->beta(2), dh1->beta(2)); - CGAL::contract_cell(lcc,dh1); - if ( !check_number_of_cells_3(lcc, 0, 0, 0, 0, 0) ) + dh1 = lcc. + make_hexahedron(Point(0,0,0),Point(1,0,0),Point(1,1,0),Point(0,1,0), + Point(0,1,1),Point(0,0,1),Point(1,0,1),Point(1,1,1)); + dh2 = lcc. + make_hexahedron(Point(0,3,0),Point(1,3,0),Point(1,4,0),Point(0,4,0), + Point(0,4,1),Point(0,3,1),Point(1,3,1),Point(1,4,1)); + dh2 = lcc.beta(dh2, 2,1,1,2); + lcc.template sew<3>(dh1,dh2); + + CGAL::contract_cell(lcc,lcc.beta(dh2,2,1)); + CGAL::contract_cell(lcc,lcc.beta(dh2,2,0)); + CGAL::contract_cell(lcc,lcc.beta(dh2,1,1,2,0)); + CGAL::contract_cell(lcc,lcc.beta(dh2,1,1,2,1)); + + if ( !check_number_of_cells_3(lcc, 8, 16, 11, 2, 1) ) + return false; + + CGAL::contract_cell(lcc,lcc.beta(dh2,0,2)); + if ( !check_number_of_cells_3(lcc, 8, 15, 10, 2, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,1,1,2)); + if ( !check_number_of_cells_3(lcc, 8, 14, 9, 2, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,1,2)); + if ( !check_number_of_cells_3(lcc, 8, 13, 8, 2, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,2)); + if ( !check_number_of_cells_3(lcc, 8, 12, 7, 2, 1 ) ) + return false; + + CGAL::contract_cell(lcc,dh2); + if ( !check_number_of_cells_3(lcc, 8, 12, 6, 1, 1 ) ) return false; lcc.clear(); @@ -649,71 +677,24 @@ bool test_LCC_3() if ( !check_number_of_cells_3(lcc, 12, 24, 16, 3, 1) ) return false; - CGAL::contract_cell(lcc,lcc.beta(dh2,2,1)); - if ( !check_number_of_cells_3(lcc, 10, 16, 10, 2, 2 ) ) + CGAL::contract_cell(lcc,lcc.beta(dh2,0,2)); + if ( !check_number_of_cells_3(lcc, 12, 23, 15, 3, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,1,1,2)); + if ( !check_number_of_cells_3(lcc, 12, 22, 14, 3, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,1,2)); + if ( !check_number_of_cells_3(lcc, 12, 21, 13, 3, 1 ) ) + return false; + CGAL::contract_cell(lcc,lcc.beta(dh2,2)); + if ( !check_number_of_cells_3(lcc, 12, 20, 12, 3, 1 ) ) + return false; + + CGAL::contract_cell(lcc,dh2); + if ( !check_number_of_cells_3(lcc, 12, 20, 11, 2, 1 ) ) return false; lcc.clear(); - /* - - dh1 = make_triangle(lcc,, , ); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract volume5: " << flush; CGAL::contract_cell(lcc,dh1); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - lcc.clear(); - - dh1 = make_triangle(lcc,, , ); - dh2 = make_triangle(lcc,, , ); - lcc.template sew<2>(dh1, dh2);lcc.template sew<2>(dh1->beta(0), dh2->beta(1)); - lcc.template sew<2>(dh1->beta(1), dh2->beta(0)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract volume6: " << flush; CGAL::contract_cell(lcc,dh1); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - lcc.clear(); - - dh1 = make_triangle(lcc,, , ); - dh2 = make_triangle(lcc,, , ); - lcc.template sew<3>(dh1, dh2); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract volume7: " << flush; CGAL::contract_cell(lcc,dh1); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - lcc.clear(); - - dh1 = make_combinatorial_tetrahedron(lcc,, , , - ); - dh2 = make_combinatorial_tetrahedron(lcc,, , , - ); - lcc.template sew<3>(dh1, dh2); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract edge8: " << flush; CGAL::contract_cell(lcc,dh1->beta(1,2,1)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract facet8: " << flush; CGAL::contract_cell(lcc,dh1->beta(2)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract facet8: " << flush; CGAL::contract_cell(lcc,dh1->beta(1,2)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract volume8: " << flush; CGAL::contract_cell(lcc,dh1); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - lcc.clear(); - - dh1 = make_combinatorial_tetrahedron(lcc,, , , - ); - dh2 = make_combinatorial_tetrahedron(lcc,, , , - ); - dh3 = make_combinatorial_tetrahedron(lcc,, , , - ); - lcc.template sew<3>(dh1, dh2); lcc.template sew<3>(dh1->beta(2), dh3); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract edge9: " << flush; CGAL::contract_cell(lcc,dh1->beta(1,2,1)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract facet9: " << flush; CGAL::contract_cell(lcc,dh1->beta(2)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract facet9: " << flush; CGAL::contract_cell(lcc,dh1->beta(1,2)); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - cout << "contract volume8: " << flush; CGAL::contract_cell(lcc,dh1); - lcc.display_characteristics(cout) << ", valid=" << lcc.is_valid() << endl; - lcc.clear(); - */ - // Construction from Polyhedron_3 { CGAL::Polyhedron_3 P; @@ -748,7 +729,7 @@ bool test_LCC_3() return false; lcc.clear(); } - + return true; }