From 8d22d7e7dc73e3640b730b2d5aa9c751d043e2cd Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Thu, 20 Oct 2016 12:47:36 -0400 Subject: [PATCH] Update LCC to be compatible both for CMap and GMap. --- .../demo/Linear_cell_complex/CMakeLists.txt | 1 + .../demo/Linear_cell_complex/Viewer.cpp | 11 +- .../demo/Linear_cell_complex/typedefs.h | 2 +- .../CGAL/CMap_linear_cell_complex_storages.h | 37 +- .../include/CGAL/Cell_attribute_with_point.h | 6 - .../CGAL/GMap_linear_cell_complex_storages.h | 14 +- .../include/CGAL/Linear_cell_complex.h | 6 +- ...inear_cell_complex_for_combinatorial_map.h | 811 +----------------- .../Linear_cell_complex_for_generalized_map.h | 53 +- .../CGAL/Linear_cell_complex_operations.h | 54 +- 10 files changed, 125 insertions(+), 870 deletions(-) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt index b0da937077a..fcc79607b4d 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt +++ b/Linear_cell_complex/demo/Linear_cell_complex/CMakeLists.txt @@ -64,6 +64,7 @@ add_executable(Linear_cell_complex_3_demo Linear_cell_complex_3_demo.cpp MainWindow.cpp Viewer.cpp Linear_cell_complex_3_subdivision.cpp Linear_cell_complex_pqq_subdivision.cpp + typedefs.h import_moka.h ${uis} ${CGAL_Qt5_RESOURCE_FILES} ${CGAL_Qt5_MOC_FILES}) qt5_use_modules(Linear_cell_complex_3_demo Xml Script OpenGL Svg) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp index 8918bb40804..632ecc1dccf 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp +++ b/Linear_cell_complex/demo/Linear_cell_complex/Viewer.cpp @@ -324,6 +324,7 @@ void Viewer::compute_face(Dart_handle dh, LCC::size_type markface) he_circ_end = lcc.darts_of_orbit<1>(dh).end(); he_circ!=he_circ_end; ++he_circ) { + std::cout<camera()->setSceneBoundingBox(qglviewer::Vec(bb.xmin(), - bb.ymin(), - bb.zmin()), - qglviewer::Vec(bb.xmax(), - bb.ymax(), - bb.zmax())); + bb.ymin(), + bb.zmin()), + qglviewer::Vec(bb.xmax(), + bb.ymax(), + bb.zmax())); are_buffers_initialized = false; if (m_previous_scene_empty) diff --git a/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h b/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h index 09077a33fb7..ab191a7f286 100644 --- a/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h +++ b/Linear_cell_complex/demo/Linear_cell_complex/typedefs.h @@ -185,7 +185,7 @@ struct Face_info { bool is_process; }; -typedef CGAL::Triangulation_2_projection_traits_3 P_traits; +typedef CGAL::Triangulation_2_projection_traits_3 P_traits; typedef CGAL::Triangulation_vertex_base_with_info_2 Vb; typedef CGAL::Triangulation_face_base_with_info_2 Fb1; diff --git a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h index fedab8aff0a..8ccf8e9cc6b 100644 --- a/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/CMap_linear_cell_complex_storages.h @@ -17,10 +17,13 @@ // // Author(s) : Guillaume Damiand // -#ifndef CGAL_LINEAR_CELL_COMPLEX_STORAGES_H -#define CGAL_LINEAR_CELL_COMPLEX_STORAGES_H 1 +#ifndef CGAL_CMAP_LINEAR_CELL_COMPLEX_STORAGES_H +#define CGAL_CMAP_LINEAR_CELL_COMPLEX_STORAGES_H 1 -#include +#include +#include +#include +#include #include #if (BOOST_GCC >= 40900) @@ -30,8 +33,13 @@ _Pragma("GCC diagnostic ignored \"-Warray-bounds\"") namespace CGAL { - /** @file Linear_cell_complex_storages.h - * Definition of storages for dD Linear cell complex. + namespace internal { + template + struct Combinatorial_map_helper; + } + + /** @file CMap_linear_cell_complex_storages.h + * Definition of storages for dD Linear cell complex for combinatorial maps. */ // Storage of darts with compact container, beta with handles @@ -41,14 +49,14 @@ namespace CGAL { // the correct type). template - class Linear_cell_complex_storage_1 + class CMap_linear_cell_complex_storage_1 { public: typedef typename Traits_::Point Point; typedef typename Traits_::Vector Vector; typedef typename Traits_::FT FT; - typedef Linear_cell_complex_storage_1 Self; typedef CGAL::Tag_false Use_index; @@ -315,9 +323,9 @@ namespace CGAL { #if !defined(CGAL_CMAP_DART_DEPRECATED) || defined(CGAL_NO_DEPRECATED_CODE) // Get the information associated with a given dart - typename Dart::Info& info(Dart_handle adart) + Dart_info& info(Dart_handle adart) { return adart->info(); } - const typename Dart::Info& info(Dart_const_handle adart) const + const Dart_info& info(Dart_const_handle adart) const { return adart->info(); } #endif @@ -458,15 +466,16 @@ namespace CGAL { /// null_handle template - const typename Linear_cell_complex_storage_1::Null_handle_type - Linear_cell_complex_storage_1:: - null_handle = NULL; + const typename CMap_linear_cell_complex_storage_1::Null_handle_type + CMap_linear_cell_complex_storage_1::null_handle = NULL; } // namespace CGAL #if (BOOST_GCC >= 40900) _Pragma("GCC diagnostic pop") #endif -#endif // CGAL_LINEAR_CELL_COMPLEX_STORAGES_H // + +#endif // CGAL_CMAP_LINEAR_CELL_COMPLEX_STORAGES_H // // EOF // diff --git a/Linear_cell_complex/include/CGAL/Cell_attribute_with_point.h b/Linear_cell_complex/include/CGAL/Cell_attribute_with_point.h index 4a76b725794..bf1006c8718 100644 --- a/Linear_cell_complex/include/CGAL/Cell_attribute_with_point.h +++ b/Linear_cell_complex/include/CGAL/Cell_attribute_with_point.h @@ -63,9 +63,6 @@ namespace CGAL { Functor_on_merge_, Functor_on_split_>, public Point_for_cell { - /* template < unsigned int, class, class, class, class > - friend class Combinatorial_map_base; - */ template friend class Compact_container; @@ -118,9 +115,6 @@ namespace CGAL { public Cell_attribute, public Point_for_cell { - /* template < unsigned int, class, class, class, class > - friend class Combinatorial_map_base; - */ template friend class Compact_container; diff --git a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h index e7df9e4b92d..dab4c68d9b5 100644 --- a/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h +++ b/Linear_cell_complex/include/CGAL/GMap_linear_cell_complex_storages.h @@ -20,7 +20,10 @@ #ifndef CGAL_GMAP_LINEAR_CELL_COMPLEX_STORAGES_H #define CGAL_GMAP_LINEAR_CELL_COMPLEX_STORAGES_H 1 -#include +#include +#include +#include +#include #include #if (BOOST_GCC >= 40900) @@ -30,6 +33,11 @@ _Pragma("GCC diagnostic ignored \"-Warray-bounds\"") namespace CGAL { + namespace internal { + template + struct Combinatorial_map_helper; + } + /** @file GMap_linear_cell_complex_storages.h * Definition of storages for dD Linear cell complex for generalized map. */ @@ -308,9 +316,9 @@ namespace CGAL { } // Get the information associated with a given dart - typename Dart::Info& info(Dart_handle adart) + Dart_info& info(Dart_handle adart) { return adart->info(); } - const typename Dart::Info& info(Dart_const_handle adart) const + const Dart_info& info(Dart_const_handle adart) const { return adart->info(); } // Get the info of the given attribute diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex.h index fe83f3059ed..2e25ef5c06e 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex.h @@ -40,9 +40,9 @@ namespace CGAL { class Alloc_ = CGAL_ALLOCATOR(int), template class CMap = Combinatorial_map_base, - class Storage_ = Linear_cell_complex_storage_1 > + class Storage_ = CMap_linear_cell_complex_storage_1 > class CGAL_DEPRECATED Linear_cell_complex: public Linear_cell_complex_for_combinatorial_map diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h index 5fc5f1b31ab..e8f05aa244b 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_combinatorial_map.h @@ -20,778 +20,20 @@ #ifndef CGAL_LINEAR_CELL_COMPLEX_FOR_COMBINATORIAL_MAP_H #define CGAL_LINEAR_CELL_COMPLEX_FOR_COMBINATORIAL_MAP_H 1 -#include -#include -#include -#include +#include #include -#include +#include +#include +#include namespace CGAL { /** @file Linear_cell_complex_for_combinatorial_map.h - * Definition of a linear cell complex, i.e. a combinatorial map with points - * associated to all vertices. + * Definition of a linear cell complex based on combinatorial map, having + * points associated to all vertices. */ - /** Linear_cell_complex_base class. - * The Linear_cell_complex a nD object with linear geometry, ie - * an nD combinatorial map with point associated to each vertex. - */ - template < unsigned int d_, unsigned int ambient_dim, - class Traits_, - class Items_, - class Alloc_, - template - class CMap, - class Refs, - class Storage_> - class Linear_cell_complex_base: - public CMap - { - public: - typedef Linear_cell_complex_base Self; - typedef CMap Base; - - typedef Traits_ Traits; - typedef Items_ Items; - typedef Alloc_ Alloc; - typedef Storage_ Storage; - - static const unsigned int ambient_dimension = ambient_dim; - static const unsigned int dimension = Base::dimension; - - typedef typename Storage::Dart_handle Dart_handle; - typedef typename Storage::Dart_const_handle Dart_const_handle; - typedef typename Storage::Helper Helper; - - typedef typename Storage::Point Point; - typedef typename Storage::Vector Vector; - typedef typename Storage::FT FT; - - typedef typename Base::Dart_range Dart_range; - - /// Typedef for attributes - template - struct Attribute_type: public Base::template Attribute_type - {}; - template - struct Attribute_handle: public Base::template Attribute_handle - {}; - template - struct Attribute_const_handle: - public Base::template Attribute_const_handle - {}; - template - struct Attribute_range: public Base::template Attribute_range - {}; - template - struct Attribute_const_range: - public Base::template Attribute_const_range - {}; - - typedef typename Base::template Attribute_type<0>::type Vertex_attribute; - typedef typename Base::template Attribute_handle<0>::type - Vertex_attribute_handle; - typedef typename Base::template Attribute_const_handle<0>::type - Vertex_attribute_const_handle; - - typedef typename Base::template Attribute_range<0>::type - Vertex_attribute_range; - typedef typename Base::template Attribute_const_range<0>::type - Vertex_attribute_const_range; - - typedef typename Base::size_type size_type; - typedef typename Base::Use_index Use_index; - typedef typename Base::Exception_no_more_available_mark - Exception_no_more_available_mark; - - /// To use previous definition of create_dart methods. - using Base::create_dart; - using Base::attribute; - using Base::null_handle; - using Base::point_of_vertex_attribute; - - using Base::are_attributes_automatically_managed; - using Base::mark; - using Base::unmark; - using Base::free_mark; - using Base::get_new_mark; - - using Base::make_segment; - using Base::make_triangle; - using Base::make_quadrangle; - - using Base::insert_cell_0_in_cell_1; - using Base::insert_cell_0_in_cell_2; - using Base::insert_dangling_cell_1_in_cell_2; - using Base::insert_cell_1_in_cell_2; - using Base::insert_cell_2_in_cell_3; - - Linear_cell_complex_base() : Base() - {} - - /** Copy the given linear cell complex into *this. - * Note that both LCC can have different dimensions and/or non void attributes. - * @param alcc the linear cell complex to copy. - * @post *this is valid. - */ - Linear_cell_complex_base(const Self& alcc) : Base() - { Base::copy/**/(alcc); } - - template < class LCC2 > - Linear_cell_complex_base(const LCC2& alcc) : Base() - { Base::copy/**/(alcc);} - - template < class LCC2, typename Converters > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters) : Base() - { Base::copy/**/(alcc, converters);} - - template < class LCC2, typename Converters, typename DartInfoConverter > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters, - const DartInfoConverter& dartinfoconverter) : Base() - { Base::copy// TODO REMOVEtemplate copy - (alcc, converters, dartinfoconverter);} - - template < class LCC2, typename Converters, typename DartInfoConverter, - typename Pointconverter > - Linear_cell_complex_base(const LCC2& alcc, Converters& converters, - const DartInfoConverter& dartinfoconverter, - const Pointconverter& pointconverter) : Base() - { Base::copy//template copy - (alcc, converters, dartinfoconverter, pointconverter);} - - /** Affectation operation. Copies one map to the other. - * @param amap a lcc. - * @return A copy of that lcc. - */ - Self & operator= (const Self & alcc) - { - if (this!=&alcc) - { - Self tmp(alcc); - this->swap(tmp); - } - return *this; - } - - /** Create a vertex attribute. - * @return an handle on the new attribute. - */ -#ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES - template - Vertex_attribute_handle create_vertex_attribute(const Args&... args) - { return Base::template create_attribute<0>(args...); } -#else - Vertex_attribute_handle create_vertex_attribute() - { return Base::template create_attribute<0>(); } - - template - Vertex_attribute_handle create_vertex_attribute(const T1& t1) - { return Base::template create_attribute<0>(t1); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2) - { return Base::template create_attribute<0>(t1, t2); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3) - { return Base::template create_attribute<0>(t1, t2, t3); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4) - { return Base::template create_attribute<0>(t1, t2, t3, t4); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4, - const T5 &t5) - { return Base::template create_attribute<0>(t1, t2, t3, t4, t5); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4, - const T5 &t5, const T6 &t6) - { return Base::template create_attribute<0>(t1, t2, t3, t4, t5, t6); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4, - const T5 &t5, const T6 &t6, const T7 &t7) - { return Base::template create_attribute<0>(t1, t2, t3, t4, t5, t6, t7); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4, - const T5 &t5, const T6 &t6, const T7 &t7, const T8 &t8) - { return Base::template create_attribute<0>(t1, t2, t3, t4, t5, t6, t7, - t8); } - - template - Vertex_attribute_handle create_vertex_attribute - (const T1& t1, const T2 &t2, const T3 &t3, const T4 &t4, - const T5 &t5, const T6 &t6, const T7 &t7, const T8 &t8, const T9 &t9) - { return Base::template create_attribute<0>(t1, t2, t3, t4, t5, t6, t7, - t8, t9); } -#endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES - - /** - * Create a new dart associated with an handle through an attribute. - * @param ahandle the point handle to associated with the dart. - * @return a Dart_handle on the new dart. - */ - Dart_handle create_dart(Vertex_attribute_handle ahandle) - { - Dart_handle res = create_dart(); - set_vertex_attribute_of_dart(res,ahandle); - return res; - } - - /** Create a new dart associated with a point. - * @param apoint the point to associated with the dart. - * @return a Dart_handle on the new dart. - */ - Dart_handle create_dart(const Point& apoint) - { return create_dart(create_vertex_attribute(apoint)); } - - /** Erase a given vertex attribute. - * @param ahandle the handle to the vertex attribute to erase. - */ - void erase_vertex_attribute(Vertex_attribute_handle ahandle) - { Base::template erase_attribute<0>(ahandle); } - - /** Set the vertex attribute of the given dart. - * @param adart a dart. - * @param ah the attribute to set. - */ - void set_vertex_attribute_of_dart(Dart_handle adart, - Vertex_attribute_handle ah) - { - return CGAL::internal::Set_i_attribute_of_dart_functor:: - run(*this, adart, ah); - } - - /** Set the vertex attribute of all the darts of the vertex. - * @param adart a dart of the vertex. - * @param ah the attribute to set. - */ - void set_vertex_attribute(Dart_handle adart, - Vertex_attribute_handle ah) - { return CGAL::Set_i_attribute_functor::run(*this, adart, ah); } - - /// @return the Vertex_attribute_range for all vertex_attributes. - Vertex_attribute_range& vertex_attributes() - { return this->template attributes<0>(); } - - /// @return the Vertex_attribute_const_range for all vertex_attributes. - Vertex_attribute_const_range& vertex_attributes() const - { return this->template attributes<0>(); } - - /// @return the size of the vertex_attribute container. - typename Base::size_type number_of_vertex_attributes() const - { return Base::template number_of_attributes<0>(); } - - /// Get the vertex_attribute associated with a dart. - /// @param a dart - /// @return the vertex_attribute. - Vertex_attribute_handle vertex_attribute(Dart_handle adart) - { return this->template attribute<0>(adart); } - - /// Get the vertex_attribute associated with a const dart. - /// @param a dart - /// @return the vertex_const_attribute. - Vertex_attribute_const_handle - vertex_attribute(Dart_const_handle adart) const - { return this->template attribute<0>(adart); } - - /// Get the point associated with a dart. - /// @param a dart - /// @return the point. - Point& point(Dart_handle adart) - { - CGAL_assertion(this->template attribute<0>(adart)!=null_handle ); - return point_of_vertex_attribute(this->template attribute<0>(adart)); - } - - /// Get the point associated with a const dart. - /// @param a dart - /// @return the point. - const Point& point(Dart_const_handle adart) const - { - CGAL_assertion(this->template attribute<0>(adart)!=null_handle ); - return point_of_vertex_attribute(this->template attribute<0>(adart)); - } - - /** Test if the lcc is valid. - * A Linear_cell_complex is valid if it is a valid Combinatorial_map with - * an attribute associated to each dart. - * @return true iff the map is valid. - */ - bool is_valid() const - { - bool valid = Base::is_valid(); - for (typename Dart_range::const_iterator it(this->darts().begin()), - itend(this->darts().end()); valid && it != itend; ++it) - { - if ( vertex_attribute(it)==null_handle ) - { - std::cerr << "Map not valid: dart "<<&(*it) - <<" does not have a vertex."<< std::endl; - valid = false; - } - } - return valid; - } - - /** validate the lcc - */ - void correct_invalid_attributes() - { - // Copy of the code in CMap::correct_invalid_attributes() to avoid - // 2 iterations through the darts of the map. - - std::vector marks(dimension+1); - for ( unsigned int i=0; i<=dimension; ++i) - marks[i] = Base::INVALID_MARK; - - Helper::template - Foreach_enabled_attributes >:: - run(*this, marks); - - for ( typename Dart_range::iterator it(this->darts().begin()), - itend(this->darts().end()); it!=itend; ++it) - { - Helper::template Foreach_enabled_attributes - >:: - run(*this, it, marks); - - if ( vertex_attribute(it)==null_handle ) - { - // If a dart don't have a 0-attribute, we create a Point at the origin - set_vertex_attribute(it, create_vertex_attribute(CGAL::ORIGIN)); - } - } - - for ( unsigned int i=0; i<=dimension; ++i) - if ( marks[i]!=Base::INVALID_MARK ) - { - CGAL_assertion( this->is_whole_map_marked(marks[i]) ); - free_mark(marks[i]); - } - - Helper::template - Foreach_enabled_attributes >:: - run(*this); - } - - /** test if the two given facets have the same geometry - * @return true iff the two facets have the same geometry. - */ - bool are_facets_same_geometry(Dart_const_handle d1, - Dart_const_handle d2) const - { - typename Base::template Dart_of_orbit_range<1>::const_iterator - it1(*this,d1); - typename Base::template Dart_of_orbit_range<0>::const_iterator - it2(*this,d2); - bool samegeometry = true; - for ( ; samegeometry && it1.cont() && it2.cont(); ++it1, ++it2) - { - if ( this->other_extremity(it2)!=null_handle && - point(it1)!=point(this->other_extremity(it2)) ) - samegeometry = false; - } - if ( it1.cont() != it2.cont() ) samegeometry = false; - return samegeometry; - } - - /// Sew3 the marked facets having same geometry - /// (a facet is considered marked if one of its dart is marked). - unsigned int sew3_same_facets(size_type AMark) - { - unsigned int res = 0; - - std::map > one_dart_per_facet; - size_type mymark = get_new_mark(); - - // First we fill the std::map by one dart per facet, and by using - // the minimal point as index. - for (typename Dart_range::iterator it(this->darts().begin()), - itend(this->darts().end()); it!=itend; ++it ) - { - if ( !this->is_marked(it, mymark) && this->is_marked(it, AMark) ) - { - Point min_point=point(it); - Dart_handle min_dart = it; - this->mark(it, mymark); - typename Base::template - Dart_of_orbit_range<1>::iterator it2(*this,it); - ++it2; - for ( ; it2.cont(); ++it2 ) - { - Point cur_point=point(it2); - this->mark(it2, mymark); - if ( cur_point < min_point ) - { - min_point = cur_point; - min_dart = it2; - } - } - one_dart_per_facet[min_point].push_back(min_dart); - } - else - this->mark(it, mymark); - } - - // Second we run through the map: candidates for sew3 have necessary the - // same minimal point. - typename std::map >::iterator - itmap=one_dart_per_facet.begin(), - itmapend=one_dart_per_facet.end(); - - for ( ; itmap!=itmapend; ++itmap ) - { - for ( typename std::vector::iterator - it1=(itmap->second).begin(), - it1end=(itmap->second).end(); it1!=it1end; ++it1 ) - { - typename std::vector::iterator it2=it1; - for ( ++it2; it2!= it1end; ++it2 ) - { - if ( *it1!=*it2 && - !this->template is_opposite_exist<3>(*it1) && - !this->template is_opposite_exist<3>(*it2) && - are_facets_same_geometry(*it1,this->beta(*it2, 0)) ) - { - ++res; - this->template sew<3>(*it1,this->beta(*it2, 0)); - } - } - } - } - - CGAL_assertion( this->is_whole_map_marked(mymark) ); - this->free_mark(mymark); - return res; - } - - /// Sew3 the facets having same geometry - /// (all the facets of the map are considered) - unsigned int sew3_same_facets() - { - size_type mark = this->get_new_mark(); - this->negate_mark(mark); - unsigned int res=sew3_same_facets(mark); - this->free_mark(mark); - return res; - } - - /** Create a segment given 2 points. - * @param p0 the first point. - * @param p1 the second point. - * @return the dart of the new segment incident to p0. - */ - Dart_handle make_segment(const Point& p0,const Point& p1) - { - return make_segment(create_vertex_attribute(p0), - create_vertex_attribute(p1)); - } - - /** Create a triangle given 3 points. - * @param p0 the first point. - * @param p1 the second point. - * @param p2 the third point. - * @return the dart of the new triangle incident to p0 and edge p0p1. - */ - Dart_handle make_triangle(const Point& p0, - const Point& p1, - const Point& p2) - { - return make_triangle(create_vertex_attribute(p0), - create_vertex_attribute(p1), - create_vertex_attribute(p2)); - } - - /** Create a quadrangle given 4 points. - * @param p0 the first point. - * @param p1 the second point. - * @param p2 the third point. - * @param p3 the fourth point. - * @return the dart of the new quadrangle incident to p0 and edge p0p1. - */ - Dart_handle make_quadrangle(const Point& p0, - const Point& p1, - const Point& p2, - const Point& p3) - { - return make_quadrangle(create_vertex_attribute(p0), - create_vertex_attribute(p1), - create_vertex_attribute(p2), - create_vertex_attribute(p3)); - } - - - /** Create a tetrahedron given 4 Vertex_attribute_handle. - * @param h0 the first vertex handle. - * @param h1 the second vertex handle. - * @param h2 the third vertex handle. - * @param h3 the fourth vertex handle. - * @return the dart of the new tetrahedron incident to h0, to edge - * h0,h1 and to facet h0,h1,h2. - */ - Dart_handle make_tetrahedron(Vertex_attribute_handle h0, - Vertex_attribute_handle h1, - Vertex_attribute_handle h2, - Vertex_attribute_handle h3) - { - Dart_handle d1 = make_triangle(h0, h1, h2); - Dart_handle d2 = make_triangle(h1, h0, h3); - Dart_handle d3 = make_triangle(h1, h3, h2); - Dart_handle d4 = make_triangle(h3, h0, h2); - - return this->make_combinatorial_tetrahedron(d1, d2, d3, d4); - } - - /** Create a tetrahedron given 4 points. - * @param p0 the first point. - * @param p1 the second point. - * @param p2 the third point. - * @param p3 the fourth point. - * @return the dart of the new tetrahedron incident to p0, to edge - * p0,p1 and to facet p0,p1,p2. - */ - Dart_handle make_tetrahedron(const Point& p0, - const Point& p1, - const Point& p2, - const Point& p3) - { - return make_tetrahedron(create_vertex_attribute(p0), - create_vertex_attribute(p1), - create_vertex_attribute(p2), - create_vertex_attribute(p3)); - } - - /** Create an hexahedron given 8 Vertex_attribute_handle. - * (8 vertices, 12 edges and 6 facets) - * \verbatim - * 4----7 - * /| /| - * 5----6 | - * | 3--|-2 - * |/ |/ - * 0----1 - * \endverbatim - * @param h0 the first vertex handle. - * @param h1 the second vertex handle. - * @param h2 the third vertex handle. - * @param h3 the fourth vertex handle. - * @param h4 the fifth vertex handle. - * @param h5 the sixth vertex handle. - * @param h6 the seventh vertex handle. - * @param h7 the height vertex handle. - * @return the dart of the new hexahedron incident to h0, to edge - * h0,h5 and to the facet (h0,h5,h6,h1). - */ - Dart_handle make_hexahedron(Vertex_attribute_handle h0, - Vertex_attribute_handle h1, - Vertex_attribute_handle h2, - Vertex_attribute_handle h3, - Vertex_attribute_handle h4, - Vertex_attribute_handle h5, - Vertex_attribute_handle h6, - Vertex_attribute_handle h7) - { - Dart_handle d1 = make_quadrangle(h0, h5, h6, h1); - Dart_handle d2 = make_quadrangle(h1, h6, h7, h2); - Dart_handle d3 = make_quadrangle(h2, h7, h4, h3); - Dart_handle d4 = make_quadrangle(h3, h4, h5, h0); - Dart_handle d5 = make_quadrangle(h0, h1, h2, h3); - Dart_handle d6 = make_quadrangle(h5, h4, h7, h6); - - return this->make_combinatorial_hexahedron(d1, d2, d3, d4, d5, d6); - } - - /** Create an hexahedron given 8 points. - * \verbatim - * 4----7 - * /| /| - * 5----6 | - * | 3--|-2 - * |/ |/ - * 0----1 - * \endverbatim - * @param p0 the first point. - * @param p1 the second point. - * @param p2 the third point. - * @param p3 the fourth point. - * @param p4 the fifth point. - * @param p5 the sixth point. - * @param p6 the seventh point. - * @param p7 the height point. - * @return the dart of the new hexahedron incident to p0, to edge - * p0,p5 and to the facet (p0,p5,p6,p1). - */ - Dart_handle make_hexahedron(const Point& p0, - const Point& p1, - const Point& p2, - const Point& p3, - const Point& p4, - const Point& p5, - const Point& p6, - const Point& p7) - { - return make_hexahedron(create_vertex_attribute(p0), - create_vertex_attribute(p1), - create_vertex_attribute(p2), - create_vertex_attribute(p3), - create_vertex_attribute(p4), - create_vertex_attribute(p5), - create_vertex_attribute(p6), - create_vertex_attribute(p7)); - } - - /** Compute the barycenter of a given cell. - * @param adart a dart incident to the cell. - * @param adim the dimension of the cell. - * @return the barycenter of the cell. - */ - template - Point barycenter(Dart_const_handle adart) const - { - return CGAL::Barycenter_functor::run(*this, adart); - } - - /** Insert a point in a given 1-cell. - * @param dh a dart handle to the 1-cell - * @param p the point to insert - * @param update_attributes a boolean to update the enabled attributes - * @return a dart handle to the new vertex containing p. - */ - Dart_handle insert_point_in_cell_1(Dart_handle dh, const Point& p, - bool update_attributes) - { - return this->insert_cell_0_in_cell_1(dh, - create_vertex_attribute(p), - update_attributes); - } - - /** Insert a point in a given 2-cell. - * @param dh a dart handle to the 2-cell - * @param p the point to insert - * @param update_attributes a boolean to update the enabled attributes - * @return a dart handle to the new vertex containing p. - */ - Dart_handle insert_point_in_cell_2(Dart_handle dh, const Point& p, - bool update_attributes) - { - Vertex_attribute_handle v = create_vertex_attribute(p); - - Dart_handle first = this->insert_cell_0_in_cell_2(dh, v, update_attributes); - - if ( first==null_handle ) // If the triangulated facet was made of one dart - erase_vertex_attribute(v); - -#ifdef CGAL_CMAP_TEST_VALID_INSERTIONS - CGAL_assertion( is_valid() ); -#endif - - return first; - } - - /** Insert a point in a given i-cell. - * @param dh a dart handle to the i-cell - * @param p the point to insert - * @param update_attributes a boolean to update the enabled attributes - * @return a dart handle to the new vertex containing p. - */ - template - Dart_handle insert_point_in_cell(Dart_handle dh, const Point& p, - bool update_attributes = true) - { - CGAL_static_assertion(1<=i && i<=2); - if (i==1) return insert_point_in_cell_1(dh, p, update_attributes); - return insert_point_in_cell_2(dh, p, update_attributes); - } - - /** Insert a dangling edge in a given facet. - * @param dh a dart of the facet (!=NULL). - * @param p the coordinates of the new vertex. - * @param update_attributes a boolean to update the enabled attributes - * @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, - bool update_attributes = true) - { - return this->insert_dangling_cell_1_in_cell_2 - (dh, create_vertex_attribute(p), update_attributes); - } - - /** Insert a point in a given i-cell. - * @param dh a dart handle to the i-cell - * @param p the point to insert - * @param update_attributes a boolean to update the enabled attributes - * @return a dart handle to the new vertex containing p. - */ - template - Dart_handle insert_barycenter_in_cell(Dart_handle dh, bool update_attributes = true) - { return insert_point_in_cell(dh, barycenter(dh), update_attributes); } - - /** Compute the dual of a Linear_cell_complex. - * @param alcc the lcc in which we build the dual of this lcc. - * @param adart a dart of the initial lcc, NULL by default. - * @return adart of the dual lcc, the dual of adart if adart!=NULL, - * any dart otherwise. - * As soon as we don't modify this lcc and alcc lcc, we can iterate - * simultaneously through all the darts of the two lcc and we have - * each time of the iteration two "dual" darts. - */ - Dart_handle dual_points_at_barycenter(Self & alcc, Dart_handle adart=null_handle) - { - Dart_handle res = Base::dual(alcc, adart); - - // Now the lcc alcc is topologically correct, we just need to add - // its geometry to each vertex (the barycenter of the corresponding - // dim-cell in the initial map). - typename Dart_range::iterator it2 = alcc.darts().begin(); - for (typename Dart_range::iterator it(this->darts().begin()); - it!=this->darts().end(); ++it, ++it2) - { - if (vertex_attribute(it2)==null_handle) - { - alcc.set_vertex_attribute(it2, alcc.create_vertex_attribute - (barycenter(it))); - } - } - - return res; - } - - /** Set the status of the managment of the attributes of the CMap - */ - void set_update_attributes(bool newval) - { - if (this->automatic_attributes_management == false && newval == true) - { - // We need to recode this function because correct_invalid_attributes - // is not a virtual function. - correct_invalid_attributes(); - } - - this->automatic_attributes_management = newval; - } - }; - - // Linear_cell_complex using compact container with handle. + // Linear_cell_complex_for_combinatorial_map class. // No difference with class Linear_cell_complex_base except the default // template parameters for Refs class which is a combinatorial map. template < unsigned int d_, unsigned int ambient_dim = d_, @@ -804,9 +46,9 @@ namespace CGAL { class Alloc_ = CGAL_ALLOCATOR(int), template class CMap = Combinatorial_map_base, - class Storage_ = Linear_cell_complex_storage_1 > + class Storage_ = CMap_linear_cell_complex_storage_1 > class Linear_cell_complex_for_combinatorial_map: public Linear_cell_complex_base*/(alcc); } + Linear_cell_complex_for_combinatorial_map(const Self & alcc) : Base(alcc) + {} template < class LCC2 > - Linear_cell_complex_for_combinatorial_map(const LCC2& alcc) : Base() - { Base::copy/**/(alcc);} + Linear_cell_complex_for_combinatorial_map(const LCC2& alcc) : Base(alcc) + {} template < class LCC2, typename Converters > Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, - Converters& converters) : Base() - { Base::copy/**/(alcc, converters);} + Converters& converters) : + Base(alcc, converters) + {} - template < class LCC2, typename Converters, typename DartInfoConverter> + template < class LCC2, typename Converters, typename DartInfoConverter > Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, Converters& converters, const DartInfoConverter& - dartinfoconverter) : Base() - { Base::copy // TODO REMOVE template copy - (alcc, converters, dartinfoconverter); } + dartinfoconverter) : + Base(alcc, converters, dartinfoconverter) + {} - template < class LCC2, typename Converters, typename Pointconverter, - typename DartInfoConverter> + template < class LCC2, typename Converters, typename DartInfoConverter, + typename PointConverter > Linear_cell_complex_for_combinatorial_map(const LCC2& alcc, Converters& converters, const DartInfoConverter& dartinfoconverter, - const Pointconverter& - pointconverter) : Base() - { Base::copy//TODO REMOVE ::template copy - (alcc, converters, dartinfoconverter, pointconverter); } + const PointConverter& + pointconverter) : + Base(alcc, converters, dartinfoconverter, pointconverter) + {} }; diff --git a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h index 590b1df9f4e..0b600cf2094 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_for_generalized_map.h @@ -20,18 +20,20 @@ #ifndef CGAL_LINEAR_CELL_COMPLEX_FOR_GENERALIZED_MAP_H #define CGAL_LINEAR_CELL_COMPLEX_FOR_GENERALIZED_MAP_H 1 -#include +#include +#include +#include #include #include namespace CGAL { /** @file Linear_cell_complex_for_generalized_map.h - * Definition of a linear cell complex based on generalized map, having points - * associated to all vertices. + * Definition of a linear cell complex based on generalized map, having + * points associated to all vertices. */ - // GMap_linear_cell_complex using compact container with handle. + // Linear_cell_complex_for_generalized_map class. // No difference with class Linear_cell_complex_base except the default // template parameters for Refs class which is a generalized map. template < unsigned int d_, unsigned int ambient_dim = d_, @@ -44,13 +46,13 @@ namespace CGAL { Traits_, Items_, Alloc_> > class Linear_cell_complex_for_generalized_map: - public Linear_cell_complex_base, - Storage_> + public Linear_cell_complex_base, + Storage_> { public: typedef Linear_cell_complex_for_generalized_map - Linear_cell_complex_for_generalized_map(const LCC2& alcc) - { Base::copy(alcc);} + Linear_cell_complex_for_generalized_map(const LCC2& alcc) : Base(alcc) + {} template < class LCC2, typename Converters > Linear_cell_complex_for_generalized_map(const LCC2& alcc, - Converters& converters) - { Base::copy(alcc, converters);} + Converters& converters) : + Base(alcc, converters) + {} template < class LCC2, typename Converters, typename DartInfoConverter > Linear_cell_complex_for_generalized_map(const LCC2& alcc, Converters& converters, const DartInfoConverter& - dartinfoconverter) - { Base::copy//TODO REMOVE - (alcc, converters, dartinfoconverter);} + dartinfoconverter) : + Base(alcc, converters, dartinfoconverter) + {} template < class LCC2, typename Converters, typename DartInfoConverter, - typename Pointconverter > + typename PointConverter > Linear_cell_complex_for_generalized_map(const LCC2& alcc, Converters& converters, const DartInfoConverter& dartinfoconverter, - const Pointconverter& - pointconverter) - { Base::copy//TODO REMOVE - (alcc, converters, dartinfoconverter, pointconverter);} + const PointConverter& + pointconverter) : + Base(alcc, converters, dartinfoconverter, pointconverter) + {} }; 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 6794f39228b..18c91f8b348 100644 --- a/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h +++ b/Linear_cell_complex/include/CGAL/Linear_cell_complex_operations.h @@ -32,7 +32,15 @@ namespace CGAL { /** @file Linear_cell_complex_operations.h * Basic operators on a linear cell complex. */ - + namespace internal { + template + void newell_single_step_3_for_lcc(const Point& p, const Point& q, Vector& n) + { + n = Vector(n.x()+((p.y()-q.y())*(p.z()+q.z())), + n.y()+((p.z()-q.z())*(p.x()+q.x())), + n.z()+((p.x()-q.x())*(p.y()+q.y()))); + } + } // End namespace internal /** Compute the normal of the given facet. * @param amap the used linear cell complex. @@ -43,46 +51,34 @@ namespace CGAL { 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); - // Ny += (Vz - V'z) * (Vx + V'x); - // Nz += (Vx - V'x) * (Vy + V'y); - // But problem with functor since this is not the sum of normal vectors. - + // Compute normal of the face by using Newell's method: for each edge PQ + // Nx += (Py - Qy) * (Pz + Qz); + // Ny += (Pz - Qz) * (Px + Qx); + // Nz += (Px - Qx) * (Py + Qy); + typedef typename LCC::Point Point; typedef typename LCC::Vector Vector; + typename LCC::Dart_const_handle start=adart; Vector normal(CGAL::NULL_VECTOR); - while ( !amap.template is_free<0>(start) && - amap.template beta<0>(start)!=adart ) - start = amap.template beta<0>(start); - - if ( amap.template is_free<1>(start) || - amap.other_extremity(amap.template beta<1>(start))==LCC::null_handle ) - return normal; + // We go to the beginning of the face (first dart) + while ( amap.is_previous_exist(start) && amap.previous(start)!=adart ) + start = amap.previous(start); + // Now we advance to process each edge unsigned int nb = 0; - adart = amap.template beta<1>(start); - - const Point* prev = &amap.point(start); const Point* curr = &amap.point(adart); - for ( ; adart!=start && amap.other_extremity(adart)!=LCC::null_handle; - adart=amap.template beta<1>(adart) ) + + for ( adart=start; adart!=start && amap.is_next_exist(adart); + adart=next(adart) ) { - const Point* next = &amap.point( amap.other_extremity(adart)); - if ( !typename LCC::Traits::Collinear_3()(*prev, *curr, *next) ) - { - normal = typename LCC::Traits::Construct_sum_of_vectors() - (normal, typename LCC::Traits::Construct_normal_3() - (*prev, *curr, *next)); - prev = curr; - ++nb; - } + const Point* next = &amap.point(amap.other_extremity(adart)); + internal::newell_single_step_3_for_lcc(*curr, *next, normal); + ++nb; curr = next; } - if ( nb<2 ) return normal; return (typename LCC::Traits::Construct_scaled_vector()(normal, 1.0/nb)); // return normal / std::sqrt(normal * normal); }