diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex.h index 28d185f9928..61c5379c443 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex.h @@ -20,6 +20,7 @@ #define CGAL_LINEAR_CELL_COMPLEX_H 1 #include +#include #include #include #include @@ -68,7 +69,8 @@ namespace CGAL { typedef Alloc_ Alloc; static const unsigned int ambient_dimension = ambient_dim; - + static const unsigned int dimension = Base::dimension; + typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Dart_const_handle Dart_const_handle; typedef typename Base::Helper Helper; @@ -533,8 +535,19 @@ namespace CGAL { template Point barycenter(Dart_const_handle adart) const { + CGAL_static_assertion(0other_extremity(); + if (d2==NULL) return point(adart); + return typename Traits::Construct_midpoint() (point(adart), + point(d2)); + } + + // General case, 1 + Dart_handle insert_point_in_cell(Dart_handle dh, const Point& p) + { + CGAL_static_assertion(1<=i && i<=2); + if (i==1) return insert_point_in_cell_1(dh, p); + return insert_point_in_cell_2(dh, p); + } + + /** Insert a dangling edge in a given facet. + * @param dh a dart of the facet (!=NULL). + * @param p the coordinates of the new vertex. + * @return a dart of the new edge, incident to the new vertex. + */ + Dart_handle insert_dangling_cell_1_in_cell_2(Dart_handle dh, const Point& p) + { + Vertex_attribute_handle v = create_vertex_attribute(p); + Dart_handle res = CGAL::insert_dangling_cell_1_in_cell_2(*this, dh); + set_vertex_attribute(res, v); + return res; + } + + /** Insert a point in a given i-cell. + * @param dh a dart handle to the i-cell + * @param p the point to insert + * @return a dart handle to the new vertex containing p. + */ + template + Dart_handle insert_barycenter_in_cell(Dart_handle dh) + { return insert_point_in_cell(dh, barycenter(dh)); } + + }; } // namespace CGAL diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h index f2d1eebac9b..573aea67ccd 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_constructors.h @@ -33,192 +33,142 @@ namespace CGAL { -/** @file Combinatorial_map_with_embedding_constructors.h - * Basic construction operations for an embedded combinatorial map. - * create edge, triangle, quadrilateral, tetrahedron,hexahedron, plus - * contruction from other CGAL data structures. +/** @file Linear_cell_complex_constructors.h + * Some construction operations for a linear cell complex from other + * CGAL data structures. */ - -/** Create an iso cuboid given an Iso_cuboid_3. - * @param amap the used combinatorial map. - * @param c the iso cuboid. - * @return the dart of the new cuboid incident to the first vertex of c. - */ -/*template -typename CMap::Dart_handle make_iso_cuboid -(CMap& amap, const typename CMap::Iso_cuboid& r) -{ - return make_hexahedron(amap, r[0], r[1], r[2], r[3], - r[4], r[5], r[6], r[7]); - }*/ - -/** Create an iso cuboid given its two extreme points. - * @param amap the used combinatorial map. - * @param ap1 the first point. - * @param ap2 the second. - * @return the dart of the new iso cuboid incident to ap1. - */ - /*template -typename CMap::Dart_handle make_iso_cuboid(CMap& amap, - const typename CMap::Point& ap1, - const typename CMap::Point& ap2) -{ - return make_iso_cuboid - (amap, //typename CMap::Construct_iso_cuboid()(ap1, ap2)); - typename CMap::Iso_cuboid(ap1, ap2)); - }*/ - -/** Create a cube given one point and one length. - * @param amap the used combinatorial map. - * @param ap1 the first point. - * @param al the length. - * @return the dart of the new cube incident to ap1. - */ -/*template < class Map > -typename Map::Dart_handle make_cube(Map& amap, - const typename Map::Point& ap1, - typename Map::FT al) - { return make_cuboid(amap, ap1, al, al, al); }*/ - - -/** Convert an embedded plane graph read into a flux into combinatorial map. - * @param amap the combinatorial map where the graph will be converted. +/** Import an embedded plane graph read into a flux into a linear cell complex. + * @param alcc the linear cell complex where the graph will be imported. * @param ais the istream where read the graph. * @return A dart created during the convertion. */ -template< class Map > -typename Map::Dart_handle import_from_plane_graph(Map& amap, - std::istream& ais) +template< class LCC > +typename LCC::Dart_handle import_from_plane_graph(LCC& alcc, + std::istream& ais) { - typedef typename Map::Dart_handle Dart_handle; - typedef typename Map::Traits::Direction_2 Direction; - typedef typename std::list::iterator List_iterator; - typedef typename std::map::iterator Map_iterator; + CGAL_static_assertion( LCC::ambient_dimension==2 ); + + typedef typename LCC::Dart_handle Dart_handle; + typedef typename LCC::Traits::Direction_2 Direction; + typedef typename std::list::iterator List_iterator; + typedef typename std::map::iterator LCC_iterator; + + // Arrays of vertices + std::vector< typename LCC::Vertex_attribute_handle > initVertices; + std::vector< std::list > testVertices; - // Arrays of vertices - std::vector< typename Map::Vertex_attribute_handle > initVertices; - std::vector< std::list > testVertices; - - std::string txt; - typename Map::FT x, y; - Dart_handle d1 = NULL, d2 = NULL; - unsigned int v1, v2; - - ais >> txt; - if (txt != "OFF2D") - { - std::cout << "Problem: file is not 2D OFF." << std::endl; + std::string txt; + typename LCC::FT x, y; + Dart_handle d1 = NULL, d2 = NULL; + unsigned int v1, v2; + + unsigned int nbSommets = 0; + unsigned int nbAretes = 0; + + ais >> nbSommets >> nbAretes; + while (nbSommets > 0) + { + if (!ais.good()) + { + std::cout << "Problem: file does not contain enough vertices." + << std::endl; return NULL; - } + } - unsigned int nbSommets = 0; - unsigned int nbAretes = 0; + ais >> x >> y; + initVertices.push_back(alcc.create_vertex_attribute(typename LCC::Point(x, y))); + testVertices.push_back(std::list()); + --nbSommets; + } - ais >> nbSommets >> nbAretes; - while (nbSommets > 0) - { - if (!ais.good()) + while (nbAretes > 0) + { + if (!ais.good()) { - std::cout << "Problem: file does not contain enough vertices." - << std::endl; - return NULL; + std::cout << "Problem: file does not contain enough edges." + << std::endl; + return NULL; } - ais >> x >> y; - initVertices.push_back(amap.create_vertex_attribute(typename Map::Point(x, y))); - testVertices.push_back(std::list()); - --nbSommets; - } + // We read an egde (given by the number of its two vertices). + ais >> v1 >> v2; + --nbAretes; - while (nbAretes > 0) - { - if (!ais.good()) + CGAL_assertion(v1 < initVertices.size()); + CGAL_assertion(v2 < initVertices.size()); + + d1 = alcc.create_dart(initVertices[v1]); + d2 = alcc.create_dart(initVertices[v2]); + alcc.link_beta(d1, d2, 2); + + testVertices[v1].push_back(d1); + testVertices[v2].push_back(d2); + } + + // LCC associating directions and darts. + std::map tabDart; + List_iterator it; + LCC_iterator it2; + + Dart_handle first = NULL; + Dart_handle prec = NULL; + typename LCC::Point sommet1, sommet2; + + for (unsigned int i = 0; i < initVertices.size(); ++i) + { + it = testVertices[i].begin(); + if (it != testVertices[i].end()) // Si la liste n'est pas vide. + { + // 1. We insert all the darts and sort them depending on the direction + tabDart.clear(); + + sommet1 = LCC::point(*it); + sommet2 = LCC::point((*it)->beta(2)); + + tabDart.insert(std::pair + (typename LCC::Construct_direction_2() + (typename LCC::Construct_vector() + (sommet1,sommet2)), *it)); + + ++it; + while (it != testVertices[i].end()) { - std::cout << "Problem: file does not contain enough edges." - << std::endl; - return NULL; + sommet2 = LCC::point((*it)->beta(2)); + tabDart.insert(std::pair + (typename LCC::Construct_direction_2() + (typename LCC::Construct_vector() + (sommet1,sommet2)), *it)); + ++it; } + + // 2. We run through the array of darts and 1 links darts. + it2 = tabDart.begin(); + first = it2->second; + prec = first; + ++it2; - // We read an egde (given by the number of its two vertices). - ais >> v1 >> v2; ais.ignore(256, '\n'); - --nbAretes; - - CGAL_assertion(v1 < initVertices.size()); - CGAL_assertion(v2 < initVertices.size()); - - d1 = amap.create_dart(initVertices[v1]); - d2 = amap.create_dart(initVertices[v2]); - amap.link_beta(d1, d2, 2); - - testVertices[v1].push_back(d1); - testVertices[v2].push_back(d2); - } - - // Map associating directions and darts. - std::map tabDart; - List_iterator it; - Map_iterator it2; - - Dart_handle first = NULL; - Dart_handle prec = NULL; - typename Map::Point sommet1, sommet2; - - for (unsigned int i = 0; i < initVertices.size(); ++i) - { - it = testVertices[i].begin(); - if (it != testVertices[i].end()) // Si la liste n'est pas vide. + while (it2 != tabDart.end()) { - // 1. We insert all the darts and sort them depending on the direction - tabDart.clear(); - - sommet1 = Map::point(*it); - sommet2 = Map::point((*it)->beta(2)); - - tabDart.insert(std::pair - (typename Map::Construct_direction() - (typename Map::Construct_vector() - (sommet1,sommet2)), *it)); - - ++it; - while (it != testVertices[i].end()) - { - sommet2 = Map::point((*it)->beta(2)); - tabDart.insert(std::pair - (typename Map::Construct_direction() - (typename Map::Construct_vector() - (sommet1,sommet2)), *it)); - ++it; - } - - // 2. We run through the array of darts and 1 links darts. - it2 = tabDart.begin(); - first = it2->second; - prec = first; - ++it2; - - while (it2 != tabDart.end()) - { - amap.template link_beta<0>(prec, it2->second->beta(2)); - prec = it2->second; - ++it2; - } - amap.template link_beta<0>(prec, first->beta(2)); + alcc.template link_beta<0>(prec, it2->second->beta(2)); + prec = it2->second; + ++it2; } - } - - // We return a dart from the imported object. - return first; + alcc.template link_beta<0>(prec, first->beta(2)); + } + } + // We return a dart from the imported object. + return first; } -/** Convert a given Triangulation_3 into the 3D combinatorial map. - * @param amap the used combinatorial map. +/** Convert a given Triangulation_3 into a 3D linear cell complex. + * @param alcc the used linear cell complex. * @param atr the Triangulation_3. * @return A dart incident to the infinite vertex. */ -template < class Map, class Triangulation > -typename Map::Dart_handle import_from_triangulation_3(Map& amap, + template < class LCC, class Triangulation > + typename LCC::Dart_handle import_from_triangulation_3(LCC& alcc, const Triangulation &atr) { // Case of empty triangulations. @@ -232,17 +182,17 @@ typename Map::Dart_handle import_from_triangulation_3(Map& amap, typedef typename Triangulation::Vertex_iterator TVertex_iterator; typedef typename Triangulation::Cell_iterator TCell_iterator; typedef typename - std::map< TCell_iterator, typename Map::Dart_handle >::iterator itmap_tcell; + std::map< TCell_iterator, typename LCC::Dart_handle >::iterator itmap_tcell; // Create vertices in the map and associate in a map // TVertex_handle and vertices in the map. - std::map< TVertex_handle, typename Map::Vertex_attribute_handle > TV; + std::map< TVertex_handle, typename LCC::Vertex_attribute_handle > TV; for (TVertex_iterator it = atr.vertices_begin(); it != atr.vertices_end(); ++it) { // if (it != atr.infinite_vertex()) { - TV[it] = amap.create_vertex_attribute(it->point()); + TV[it] = alcc.create_vertex_attribute(it->point()); } } @@ -250,11 +200,11 @@ typename Map::Dart_handle import_from_triangulation_3(Map& amap, // and tetrahedron. TCell_iterator it; - std::map< TCell_iterator, typename Map::Dart_handle > TC; + std::map< TCell_iterator, typename LCC::Dart_handle > TC; itmap_tcell maptcell_it; - typename Map::Dart_handle res=NULL, dart=NULL; - typename Map::Dart_handle init=NULL, cur=NULL, neighbor=NULL; + typename LCC::Dart_handle res=NULL, dart=NULL; + typename LCC::Dart_handle init=NULL, cur=NULL, neighbor=NULL; for (it = atr.cells_begin(); it != atr.cells_end(); ++it) { @@ -264,7 +214,7 @@ typename Map::Dart_handle import_from_triangulation_3(Map& amap, it->vertex(3) != atr.infinite_vertex()) */ { - res = amap.make_tetrahedron(TV[it->vertex(0)], + res = alcc.make_tetrahedron(TV[it->vertex(0)], TV[it->vertex(1)], TV[it->vertex(2)], TV[it->vertex(3)]); @@ -297,10 +247,10 @@ typename Map::Dart_handle import_from_triangulation_3(Map& amap, maptcell_it->second->beta(2); break; case 3: neighbor = maptcell_it->second; break; } - while (Map::vertex_attribute(neighbor) != - Map::vertex_attribute(cur->other_extremity()) ) + while (LCC::vertex_attribute(neighbor) != + LCC::vertex_attribute(cur->other_extremity()) ) neighbor = neighbor->beta(1); - amap.template topo_sew<3>(cur, neighbor); + alcc.template topo_sew<3>(cur, neighbor); if (!neighbor->beta(2)->is_free(3) && !neighbor->beta(0)->beta(2)->is_free(3) && !neighbor->beta(1)->beta(2)->is_free(3)) @@ -332,86 +282,84 @@ struct Hedge_cmp }; } -/** Convert a given Polyhedron_3 into 3D combinatorial map. - * @param amap the combinatorial map where Polyhedron_3 will be converted. +/** Import a given Polyhedron_3 into a Linear_cell_complex. + * @param alcc the combinatorial map where Polyhedron_3 will be converted. * @param apoly the Polyhedron. * @return A dart created during the convertion. */ -template< class Map, class Polyhedron > -typename Map::Dart_handle import_from_polyhedron(Map& amap, - const Polyhedron &apoly) +template< class LCC, class Polyhedron > +typename LCC::Dart_handle import_from_polyhedron(LCC& alcc, + const Polyhedron &apoly) { - typedef typename Polyhedron::Halfedge_const_handle Halfedge_handle; - typedef typename Polyhedron::Facet_const_iterator Facet_iterator; - typedef typename Polyhedron::Halfedge_around_facet_const_circulator - HF_circulator; + typedef typename Polyhedron::Halfedge_const_handle Halfedge_handle; + typedef typename Polyhedron::Facet_const_iterator Facet_iterator; + typedef typename Polyhedron::Halfedge_around_facet_const_circulator + HF_circulator; - typedef std::map < Halfedge_handle, typename Map::Dart_handle> - Halfedge_handle_map; - typedef typename Halfedge_handle_map::iterator itmap_hds; - Halfedge_handle_map TC; + typedef std::map < Halfedge_handle, typename LCC::Dart_handle> + Halfedge_handle_map; + typedef typename Halfedge_handle_map::iterator itmap_hds; + Halfedge_handle_map TC; - itmap_hds it; - typename Map::Dart_handle d = NULL, prev = NULL, - firstFacet = NULL, firstAll = NULL; + itmap_hds it; + typename LCC::Dart_handle d = NULL, prev = NULL; + typename LCC::Dart_handle firstFacet = NULL, firstAll = NULL; - // First traversal to build the darts and link them. - for (Facet_iterator i = apoly.facets_begin(); i != apoly.facets_end(); ++i) - { - HF_circulator j = i->facet_begin(); - prev = NULL; - do - { - d = amap.create_dart(); - TC[j] = d; - - if (prev != NULL) amap.template link_beta<1>(prev, d); - else firstFacet = d; - it = TC.find(j->opposite()); - if (it != TC.end()) - amap.link_beta(d, it->second, 2); - prev = d; + // First traversal to build the darts and link them. + for (Facet_iterator i = apoly.facets_begin(); i != apoly.facets_end(); ++i) + { + HF_circulator j = i->facet_begin(); + prev = NULL; + do + { + d = alcc.create_dart(); + TC[j] = d; + + if (prev != NULL) alcc.template link_beta<1>(prev, d); + else firstFacet = d; + it = TC.find(j->opposite()); + if (it != TC.end()) + alcc.link_beta(d, it->second, 2); + prev = d; + } + while (++j != i->facet_begin()); + alcc.template link_beta<1>(prev, firstFacet); + if (firstAll == NULL) firstAll = firstFacet; + } + + // Second traversal to update the geometry. + // We run one again through the facets of the HDS. + for (Facet_iterator i = apoly.facets_begin(); i != apoly.facets_end(); ++i) + { + HF_circulator j = i->facet_begin(); + do + { + d = TC[j]; // Get the dart associated to the Halfedge + if (LCC::vertex_attribute(d) == NULL) + { + alcc.set_vertex_attribute + (d, alcc.create_vertex_attribute(j->opposite()->vertex()->point())); } - while (++j != i->facet_begin()); - amap.template link_beta<1>(prev, firstFacet); - if (firstAll == NULL) firstAll = firstFacet; - } - - // Second traversal to update the geometry. - // We run one again through the facets of the HDS. - for (Facet_iterator i = apoly.facets_begin(); i != apoly.facets_end(); ++i) - { - HF_circulator j = i->facet_begin(); - do - { - d = TC[j]; // Get the dart associated to the Halfedge - if (Map::vertex_attribute(d) == NULL) - { - amap.set_vertex_attribute(d, - amap.create_vertex_attribute(j->opposite()->vertex()->point())); - } - } - while (++j != i->facet_begin()); - } - return firstAll; + } + while (++j != i->facet_begin()); + } + return firstAll; } -template < class Map > - // class Polyhedron=CGAL::Polyhedron_3 > -void -load_off(Map& amap, std::istream& in) +template < class LCC > +void load_off(LCC& alcc, std::istream& in) { File_header_OFF m_file_header; File_scanner_OFF scanner( in, m_file_header.verbose()); if ( ! in) return; m_file_header = scanner; // Remember file header after return. - Linear_cell_complex_incremental_builder_3 B( amap); + Linear_cell_complex_incremental_builder_3 B( alcc); B.begin_surface( scanner.size_of_vertices(), scanner.size_of_facets(), scanner.size_of_halfedges()); - typedef typename Map::Point Point; + typedef typename LCC::Point Point; // read in all vertices std::size_t i; @@ -479,24 +427,23 @@ if ( ! in || B.error()) { } /** Convert a Polyhedron_3 read into a flux into 3D combinatorial map. - * @param amap the combinatorial map where Polyhedron_3 will be converted. + * @param alcc the combinatorial map where Polyhedron_3 will be converted. * @param ais the istream where read the Polyhedron_3. * @return A dart created during the convertion. */ -template < class Map > - // class Polyhedron=CGAL::Polyhedron_3 > -typename Map::Dart_handle -import_from_polyhedron_flux(Map& amap, std::istream& ais) +template < class LCC > +typename LCC::Dart_handle +import_from_polyhedron_flux(LCC& alcc, std::istream& ais) { - if (!ais.good()) - { - std::cout << "Error reading flux." << std::endl; - return NULL; - } - CGAL::Polyhedron_3 P; - ais >> P; - return import_from_polyhedron > (amap, P); + if (!ais.good()) + { + std::cout << "Error reading flux." << std::endl; + return NULL; + } + CGAL::Polyhedron_3 P; + ais >> P; + return import_from_polyhedron > + (alcc, P); } } // namespace CGAL diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h index 25a60174a20..21352601b98 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h @@ -16,8 +16,8 @@ // // Author(s) : Guillaume Damiand // -#ifndef CGAL_COMBINATORIAL_MAP_WITH_POINTS_OPERATIONS_H -#define CGAL_COMBINATORIAL_MAP_WITH_POINTS_OPERATIONS_H 1 +#ifndef CGAL_LINEAR_CELL_COMPLEX_OPERATIONS_H +#define CGAL_LINEAR_CELL_COMPLEX_OPERATIONS_H 1 #include #include @@ -37,9 +37,9 @@ namespace CGAL { * @param adart a dart incident to the facet. * @return the normal of the facet. */ -template -typename CMap::Vector compute_normal_of_cell_2 -(const CMap& amap, typename CMap::Dart_const_handle adart) +template +typename LCC::Vector compute_normal_of_cell_2 +(const LCC& amap, typename LCC::Dart_const_handle adart) { // TODO Better approximation by using Newell's method // Nx += (Vy - V'y) * (Vz + V'z); @@ -47,9 +47,9 @@ typename CMap::Vector compute_normal_of_cell_2 // Nz += (Vx - V'x) * (Vy + V'y); // But problem with functor since this is not the sum of normal vectors. - typedef typename CMap::Point Point; - typedef typename CMap::Vector Vector; - typename CMap::Dart_const_handle start=adart; + typedef typename LCC::Point Point; + typedef typename LCC::Vector Vector; + typename LCC::Dart_const_handle start=adart; Vector normal(CGAL::NULL_VECTOR); while ( !start->is_free(0) && start->beta(0)!=adart ) @@ -61,24 +61,23 @@ typename CMap::Vector compute_normal_of_cell_2 unsigned int nb = 0; adart = start->beta(1); - const Point* prev = &CMap::point(start); - const Point* curr = &CMap::point(adart); + const Point* prev = &LCC::point(start); + const Point* curr = &LCC::point(adart); for ( ; adart!=start && adart->other_extremity()!=NULL; adart=adart->beta(1) ) + { + const Point* next = &LCC::point(adart->other_extremity()); + if ( !typename LCC::Collinear()(*prev, *curr, *next) ) { - const Point* next = &CMap::point(adart->other_extremity()); - if ( !typename CMap::Collinear()(*prev, *curr, *next) ) - { - normal = typename CMap::Construct_sum_of_vectors() - (normal, typename CMap::Construct_normal()(*prev, *curr, *next)); - prev = curr; - ++nb; - } - curr = next; + normal = typename LCC::Construct_sum_of_vectors() + (normal, typename LCC::Construct_normal_3()(*prev, *curr, *next)); + prev = curr; + ++nb; } + curr = next; + } if ( nb<2 ) return normal; - return (typename CMap::Construct_scaled_vector()(normal, 1.0/nb)); - + return (typename LCC::Construct_scaled_vector()(normal, 1.0/nb)); // return normal / std::sqrt(normal * normal); } @@ -87,109 +86,27 @@ typename CMap::Vector compute_normal_of_cell_2 * @param adart a dart incident to the vertex. * @return the normal of the vertex. */ -template -typename CMap::Vector compute_normal_of_cell_0 -(const CMap& amap, typename CMap::Dart_const_handle adart) +template +typename LCC::Vector compute_normal_of_cell_0 +(const LCC& amap, typename LCC::Dart_const_handle adart) { - typedef typename CMap::Point Point; - typedef typename CMap::Vector Vector; + typedef typename LCC::Point Point; + typedef typename LCC::Vector Vector; Vector normal(CGAL::NULL_VECTOR); unsigned int nb = 0; - for ( CMap_one_dart_per_incident_cell_const_iterator it(amap, adart); - it.cont(); ++it) - { - normal = typename CMap::Construct_sum_of_vectors() - (normal, CGAL::compute_normal_of_cell_2(amap,it)); - ++nb; - } + for ( CMap_one_dart_per_incident_cell_const_iterator it(amap, adart); + it.cont(); ++it) + { + normal = typename LCC::Construct_sum_of_vectors() + (normal, CGAL::compute_normal_of_cell_2(amap,it)); + ++nb; + } if ( nb<2 ) return normal; - return (typename CMap::Construct_scaled_vector()(normal, 1.0/nb)); + return (typename LCC::Construct_scaled_vector()(normal, 1.0/nb)); // return normal / std::sqrt(normal * normal); } - -/** Insert a vertex in the center (barycenter) of the given facet, - * the facet is splitted in triangles, once for each inital edge of the facet. - * @param amap the used combinatorial map. - * @param adart a dart of the facet to triangulate. - * @return A dart incident to the new vertex. - */ -template -typename CMap::Dart_handle insert_center_cell_0_in_cell_2 -(CMap& amap, typename CMap::Dart_handle adart) -{ - CGAL_assertion(adart != NULL); - - typename CMap::Vertex_attribute_handle v = - amap.create_vertex_attribute(amap.barycenter<2>(adart)); - - typename CMap::Dart_handle first = - CGAL::insert_cell_0_in_cell_2(amap, adart); - - if (first != NULL) // If the triangulated facet was not made of one dart - amap.set_vertex_attribute(first, v); - else - amap.erase_vertex_attribute(v); - - // CGAL_postcondition(amap.is_valid()); - - return first; -} - -/** Insert a vertex in a given edge. - * @param amap the used combinatorial map. - * @param adart a dart of the edge (!=NULL). - * @param apoint the coordinates of the new vertex. - * @return a dart of the new vertex. - */ -template -typename CMap::Dart_handle insert_cell_0_in_cell_1 -(CMap& amap, typename CMap::Dart_handle adart, - const typename CMap::Point& apoint) -{ - typename CMap::Vertex_attribute_handle v=amap.create_vertex_attribute(apoint); - typename CMap::Dart_handle res = insert_cell_0_in_cell_1(amap,adart); - amap.set_vertex_attribute(res, v); - return res; -} - -/** Insert a vertex in the middle of a given edge. - * @param amap the used combinatorial map. - * @param adart a dart of the edge (!=NULL). - * @return a dart of the new vertex. - */ -template -typename CMap::Dart_handle insert_middle_cell_0_in_cell_1 -(CMap& amap, typename CMap::Dart_handle adart) -{ - CGAL_assertion(adart!=NULL); - - typename CMap::Dart_handle d2 = adart->other_extremity(); - - if ( d2==NULL ) - return insert_cell_0_in_cell_1(amap, adart, CMap::point(adart)); - - return insert_cell_0_in_cell_1(amap, adart, typename CMap::Construct_midpoint() - (CMap::point(adart), CMap::point(d2))); -} - -/** Insert a dangling edge in a given facet. - * @param amap the used combinatorial map. - * @param adart a dart of the facet (!=NULL). - * @param apoint the coordinates of the new vertex. - * @return a dart of the new edge, incident to the new vertex. - */ -template -typename Map::Dart_handle insert_dangling_cell_1_in_cell_2 -(Map& amap, typename Map::Dart_handle adart, const typename Map::Point& apoint) -{ - typename Map::Vertex_attribute_handle - v = amap.create_vertex_attribute(apoint); - typename Map::Dart_handle res = insert_dangling_cell_1_in_cell_2(amap,adart); - amap.set_vertex_attribute(res, v); - return res; -} /** Compute the dual of a combinatorial map. * @param amap1 the initial map. @@ -199,7 +116,7 @@ typename Map::Dart_handle insert_dangling_cell_1_in_cell_2 */ template typename Map::Dart_handle dual(Map& amap1, Map& amap2, - typename Map::Dart_handle adart=NULL) + typename Map::Dart_handle adart=NULL) { CGAL_assertion( amap1.is_without_boundary(Map::dimension) ); @@ -227,41 +144,41 @@ typename Map::Dart_handle dual(Map& amap1, Map& amap2, Dart_iterator it2=amap2.darts().begin(); for (Dart_iterator it=amap1.darts().begin(); it!=amap1.darts().end(); ++it, ++it2) + { + d = it2; // The supposition on the order allows to avoid d=dual[it]; + CGAL_assertion(it2 == dual[it]); + + // First case outside the loop since we need to use link_beta1 + if ( it->beta(Map::dimension)->beta(Map::dimension-1)!=Map::null_dart_handle ) + amap2. template + link_beta<1>(d, + dual[it->beta(Map::dimension)->beta(Map::dimension-1)]); + + // and during the loop we use link_beta(d1,d2,i) + for (unsigned int i=Map::dimension-2; i>=1; --i) { - d = it2; // The supposition on the order allows to avoid d=dual[it]; - CGAL_assertion(it2 == dual[it]); - - // First case outside the loop since we need to use link_beta1 - if ( it->beta(Map::dimension)->beta(Map::dimension-1)!=Map::null_dart_handle ) - amap2. template - link_beta<1>(d, - dual[it->beta(Map::dimension)->beta(Map::dimension-1)]); - - // and during the loop we use link_beta(d1,d2,i) - for (unsigned int i=Map::dimension-2; i>=1; --i) - { - if ( it->beta(Map::dimension)->beta(i)!=Map::null_dart_handle ) - amap2.link_beta(d, dual[it->beta(Map::dimension)->beta(i)], - Map::dimension-i); - } - CGAL_assertion ( !it->is_free(Map::dimension) ); - amap2.link_beta(d, dual[it->beta(Map::dimension)],Map::dimension); + if ( it->beta(Map::dimension)->beta(i)!=Map::null_dart_handle ) + amap2.link_beta(d, dual[it->beta(Map::dimension)->beta(i)], + Map::dimension-i); } + CGAL_assertion ( !it->is_free(Map::dimension) ); + amap2.link_beta(d, dual[it->beta(Map::dimension)],Map::dimension); + } // Now the map amap is topologically correct, we just need to add // its geometry to each vertex (the barycenter of the corresponding // volume in the initial map). it2 = amap2.darts().begin(); - for (Dart_iterator it(amap1.darts().begin()); - it!=amap1.darts().end(); ++it, ++it2) + for (Dart_iterator it(amap1.darts().begin()); it!=amap1.darts().end(); + ++it, ++it2) + { + if (Map::vertex_attribute(it2) == NULL) { - if (Map::vertex_attribute(it2) == NULL) - { - amap2.set_vertex_attribute(it2, - amap2.create_vertex_attribute - (amap1.barycenter(it))); - } + amap2.set_vertex_attribute(it2, + amap2.create_vertex_attribute + (amap1.barycenter(it))); } + } // CGAL_postcondition(amap2.is_valid()); @@ -271,5 +188,5 @@ typename Map::Dart_handle dual(Map& amap1, Map& amap2, } // namespace CGAL -#endif // CGAL_COMBINATORIAL_MAP_WITH_EMBEDDING_OPERATIONS_H // +#endif // CGAL_LINEAR_CELL_COMPLEX_OPERATIONS_H // // EOF // diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_traits.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_traits.h index 0b473668b6c..053cea8d85c 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_traits.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_traits.h @@ -36,40 +36,24 @@ namespace CGAL { typedef typename Kernel::FT FT; typedef typename Kernel::Point_d Point; typedef typename Kernel::Vector_d Vector; - typedef typename Kernel::Direction_d Direction; // Constructions struct Construct_translated_point { + Point operator() (const CGAL::Origin&, const Vector& v) + { Point p(ambient_dimension, CGAL::Origin()); return p+v; } Point operator() (const Point&p, const Vector& v) { return p+v; } }; - // TODO THE Construct_vector struct Construct_vector : public Kernel::Construct_vector_d { - using Kernel::Construct_vector_d::operator(); - Vector operator() (typename Kernel::FT x1) - { - Vector v(d_, NULL_VECTOR); v[0]=x1; - return v; - } - Vector operator() (typename Kernel::FT x1, typename Kernel::FT x2) - { - Vector v(d_, NULL_VECTOR); v[0]=x1; v[1]=x2; - return v; - } - Vector operator() (typename Kernel::FT x1, - typename Kernel::FT x2, - typename Kernel::FT x3) - { - Vector v(d_, NULL_VECTOR); v[0]=x1; v[1]=x2; v[2]=x3; - return v; - } - Vector operator() (const Origin&, const Point& p) - { return typename Kernel::Point_to_vector_d()(p); } + Vector operator() (const Point& p1, const Point& p2) + { return p2-p1; } + Vector operator() (const CGAL::Origin&, const Point& p) + { return operator() (Point(ambient_dimension, CGAL::Origin()),p); } }; - + struct Construct_sum_of_vectors { Vector operator() (const Vector&v1, const Vector& v2) @@ -78,8 +62,7 @@ namespace CGAL { struct Construct_scaled_vector { - Vector operator() (const Vector& v, - typename Kernel::FT scale) + Vector operator() (const Vector& v, typename Kernel::FT scale) { return scale*v; } }; @@ -88,15 +71,6 @@ namespace CGAL { Point operator() (const Point&p1, const Point& p2) { return typename Kernel::Midpoint_d()(p1, p2); } }; - - // TODO Make the Construct_direction - - // Predicates - struct Collinear - { - bool operator() (const Point&p1, const Point&p2, const Point&p3) - { return ((p2-p1)*(p3-p2))==0; } - }; }; /** Trait class for Linear_cell_complex class. @@ -110,19 +84,12 @@ namespace CGAL { typedef typename Kernel::FT FT; typedef typename Kernel::Point_2 Point; typedef typename Kernel::Vector_2 Vector; - typedef typename Kernel::Direction_2 Direction; // Constructions typedef typename Kernel::Construct_translated_point_2 Construct_translated_point; - // TODO THE Construct_vector functor with two operators () (verify the kernel doc) - struct Construct_vector : public Kernel::Construct_vector_2 - { - using Kernel::Construct_vector_2::operator(); - Vector operator() (typename Kernel::FT x1) - { return Kernel::Construct_vector_2()(x1, 0); } - }; + typedef typename Kernel::Construct_vector_2 Construct_vector; typedef typename Kernel::Construct_sum_of_vectors_2 Construct_sum_of_vectors; @@ -132,18 +99,6 @@ namespace CGAL { typedef typename Kernel::Construct_midpoint_2 Construct_midpoint; - - typedef typename Kernel::Construct_direction_2 - Construct_direction; - - /* struct Vector_to_point TO REMOVE ? - { - Point operator() (const Vector&v) - { return Kernel::Construct_translated_point(ORIGIN, v); } - };*/ - - // Predicates - typedef typename Kernel::Collinear_2 Collinear; }; /** Trait class for Linear_cell_complex class. @@ -157,21 +112,12 @@ namespace CGAL { typedef typename Kernel::FT FT; typedef typename Kernel::Point_3 Point; typedef typename Kernel::Vector_3 Vector; - typedef typename Kernel::Direction_3 Direction; // Constructions typedef typename Kernel::Construct_translated_point_3 Construct_translated_point; - // TODO the Construct_vector - struct Construct_vector : public Kernel::Construct_vector_3 - { - using Kernel::Construct_vector_3::operator(); - Vector operator() (typename Kernel::FT x1) - { return Kernel::Construct_vector_3()(x1, 0, 0); } - Vector operator() (typename Kernel::FT x1, typename Kernel::FT x2) - { return Kernel::Construct_vector_3()(x1, x2, 0); } - }; + typedef typename Kernel::Construct_vector_3 Construct_vector; typedef typename Kernel::Construct_sum_of_vectors_3 Construct_sum_of_vectors; @@ -181,15 +127,6 @@ namespace CGAL { typedef typename Kernel::Construct_midpoint_3 Construct_midpoint; - - typedef typename Kernel::Construct_direction_3 - Construct_direction; - - typedef typename Kernel::Construct_normal_3 - Construct_normal; - - // Predicates - typedef typename Kernel::Collinear_3 Collinear; }; } // namespace CGAL