From 780e01dc900ec7e2e90cfe320774d35cfa16e541 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Thu, 2 Mar 2017 15:51:41 +0100 Subject: [PATCH] WIP: test_meshing_polyhedron_with_features compiles and crashes in odt --- .../include/CGAL/Compact_mesh_cell_base_3.h | 6 +- Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h | 92 ++++++++++--------- Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h | 71 +++++++------- .../CGAL/Mesh_3/Mesh_global_optimizer.h | 15 +-- .../include/CGAL/Mesh_3/Mesh_sizing_field.h | 58 ++++++------ Mesh_3/include/CGAL/Mesh_3/Mesher_3.h | 3 +- Mesh_3/include/CGAL/Mesh_3/Odt_move.h | 3 +- .../CGAL/Mesh_3/Refine_facets_manifold_base.h | 13 ++- ..._weighted_circumcenter_filtered_traits_3.h | 3 +- Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h | 2 +- .../CGAL/Mesh_3/Triangulation_helpers.h | 31 ++++--- .../include/CGAL/Mesh_3/vertex_perturbation.h | 19 ++-- .../include/CGAL/Regular_traits_adaptor.h | 35 +++++++ .../include/CGAL/Regular_triangulation_3.h | 26 ++++++ 14 files changed, 233 insertions(+), 144 deletions(-) diff --git a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h index 5a386ef5d99..47b47922f1f 100644 --- a/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h +++ b/Mesh_3/include/CGAL/Compact_mesh_cell_base_3.h @@ -242,9 +242,9 @@ public: typedef typename GT::Weighted_point_3 Weighted_point_3; - typedef Point* Point_container; - typedef Point* Point_iterator; - typedef const Point* Point_const_iterator; + typedef Weighted_point_3* Point_container; + typedef Weighted_point_3* Point_iterator; + typedef const Weighted_point_3* Point_const_iterator; public: void invalidate_circumcenter() const diff --git a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h index e01cefea2d5..89d0c8b5dcc 100644 --- a/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/C3T3_helpers.h @@ -387,6 +387,7 @@ class C3T3_helpers_base protected: typedef typename Tr::Geom_traits Gt; typedef typename Tr::Bare_point Bare_point; + typedef typename Tr::Weighted_point Weighted_point; typedef typename Gt::FT FT; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; @@ -402,7 +403,7 @@ protected: public: // Dummy locks/unlocks - bool try_lock_point(const Bare_point &, int = 0) const + bool try_lock_point(const Weighted_point &, int = 0) const { return true; } @@ -412,7 +413,7 @@ public: return true; } - bool try_lock_point_no_spin(const Bare_point &, int = 0) const + bool try_lock_point_no_spin(const Weighted_point &, int = 0) const { return true; } @@ -433,7 +434,7 @@ public: } - bool is_point_locked_by_this_thread(const Bare_point &) const + bool is_point_locked_by_this_thread(const Weighted_point &) const { return false; } bool is_cell_locked_by_this_thread(const Cell_handle &) const @@ -457,7 +458,8 @@ class C3T3_helpers_base { protected: typedef typename Tr::Geom_traits Gt; - typedef typename Gt::Bare_point Bare_point; + typedef typename Tr::Bare_point Bare_point; + typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef typename Tr::Facet Facet; @@ -475,7 +477,7 @@ public: return m_lock_ds; }*/ - bool try_lock_point(const Bare_point &p, int lock_radius = 0) const + bool try_lock_point(const Weighted_point &p, int lock_radius = 0) const { if (m_lock_ds) { @@ -493,7 +495,7 @@ public: return true; } - bool try_lock_point_no_spin(const Bare_point &p, int lock_radius = 0) const + bool try_lock_point_no_spin(const Weighted_point &p, int lock_radius = 0) const { if (m_lock_ds) { @@ -537,7 +539,7 @@ public: return success; } - bool is_point_locked_by_this_thread(const Bare_point &p) const + bool is_point_locked_by_this_thread(const Weighted_point &p) const { bool locked = true; if (m_lock_ds) @@ -634,11 +636,13 @@ class C3T3_helpers typedef typename Gt::Vector_3 Vector_3; typedef typename Gt::Bare_point Bare_point; + typedef typename Gt::Weighted_point_3 Weighted_point; typedef typename Gt::Plane_3 Plane_3; typedef typename Gt::FT FT; typedef typename Gt::Tetrahedron_3 Tetrahedron; typedef typename Gt::Construct_point_3 Construct_point_3; + typedef typename Gt::Construct_weighted_point_3 Construct_weighted_point_3; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; @@ -715,6 +719,7 @@ public: , tr_(c3t3.triangulation()) , domain_(domain) , wp2p_(tr_.geom_traits().construct_point_3_object()) + , p2wp_(tr_.geom_traits().construct_weighted_point_3_object()) { } /** @@ -733,7 +738,7 @@ public: */ template std::pair - update_mesh(const Bare_point& new_position, + update_mesh(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -747,7 +752,7 @@ public: */ template std::pair - update_mesh_topo_change(const Bare_point& new_position, + update_mesh_topo_change(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -760,7 +765,7 @@ public: * Insert into modified vertices the vertices which are impacted by to move. */ template - Vertex_handle update_mesh(const Bare_point& new_position, + Vertex_handle update_mesh(const Weighted_point& new_position, const Vertex_handle& old_vertex, OutputIterator modified_vertices, bool fill_modified_vertices = true); @@ -769,7 +774,7 @@ public: * Updates mesh moving vertex \c old_vertex to \c new_position. Returns the * new vertex of the triangulation. */ - Vertex_handle update_mesh(const Bare_point& new_position, + Vertex_handle update_mesh(const Weighted_point& new_position, const Vertex_handle& old_vertex) { return update_mesh(new_position, old_vertex, Emptyset_iterator(), false); @@ -821,11 +826,11 @@ public: * The second one (with the could_lock_zone param) is for the parallel version */ Vertex_handle move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, Moving_vertices_set& moving_vertices) const; Vertex_handle move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, Moving_vertices_set& moving_vertices, bool *could_lock_zone) const; @@ -1631,7 +1636,7 @@ private: */ template std::pair - update_mesh_no_topo_change(const Bare_point& new_position, + update_mesh_no_topo_change(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -1644,13 +1649,13 @@ private: template < typename OutdatedCellsOutputIterator, typename DeletedCellsOutputIterator > Vertex_handle move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells, DeletedCellsOutputIterator deleted_cells) const; Vertex_handle move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, bool *could_lock_zone = NULL) const; @@ -1658,22 +1663,22 @@ private: typename DeletedCellsOutputIterator > Vertex_handle move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells, DeletedCellsOutputIterator deleted_cells) const; Vertex_handle move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position) const; + const Weighted_point& new_position) const; template < typename OutdatedCellsOutputIterator > Vertex_handle move_point_no_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells) const; Vertex_handle move_point_no_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position) const; + const Weighted_point& new_position) const; /** * Returns the least square plane from v, using adjacent surface points @@ -1698,7 +1703,7 @@ private: */ template Vertex_handle revert_move(const Vertex_handle& new_vertex, - const Bare_point& old_point, + const Weighted_point& old_point, OutputIterator outdated_cells) { // Move vertex @@ -1753,14 +1758,14 @@ private: template OutputIterator get_conflict_zone_topo_change(const Vertex_handle& vertex, - const Bare_point& conflict_point, + const Weighted_point& conflict_point, OutputIterator conflict_cells) const; template void get_conflict_zone_topo_change(const Vertex_handle& v, - const Bare_point& conflict_point, + const Weighted_point& conflict_point, CellsOutputIterator insertion_conflict_cells, FacetsOutputIterator insertion_conflict_boundary, CellsOutputIterator removal_conflict_cells, @@ -1772,7 +1777,7 @@ private: typename DeletedCellsOutputIterator > Vertex_handle move_point_topo_change_conflict_zone_known(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, const Facet& insertion_boundary_facet, ConflictCellsInputIterator insertion_conflict_cells_begin, ConflictCellsInputIterator insertion_conflict_cells_end, @@ -2398,6 +2403,7 @@ private: Tr& tr_; const MeshDomain& domain_; Construct_point_3 wp2p_; + Construct_weighted_point_3 p2wp_; }; // class C3T3_helpers @@ -2405,7 +2411,7 @@ template template std::pair::Vertex_handle> C3T3_helpers:: -update_mesh(const Bare_point& new_position, +update_mesh(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -2444,7 +2450,7 @@ template template std::pair::Vertex_handle> C3T3_helpers:: -update_mesh_no_topo_change(const Bare_point& new_position, +update_mesh_no_topo_change(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -2461,7 +2467,7 @@ update_mesh_no_topo_change(const Bare_point& new_position, // Get old values criterion.before_move(c3t3_cells(conflict_cells)); // std::cerr << "old_sliver_value=" << old_sliver_value << std::endl; - Bare_point old_position = wp2p_(old_vertex->point()); + Weighted_point old_position = old_vertex->point(); // Move point reset_circumcenter_cache(conflict_cells); @@ -2503,7 +2509,7 @@ template template std::pair::Vertex_handle> C3T3_helpers:: -update_mesh_topo_change(const Bare_point& new_position, +update_mesh_topo_change(const Weighted_point& new_position, const Vertex_handle& old_vertex, const SliverCriterion& criterion, OutputIterator modified_vertices, @@ -2545,7 +2551,7 @@ update_mesh_topo_change(const Bare_point& new_position, criterion.before_move(c3t3_cells(conflict_cells)); // std::cerr << "old_sliver_value=" << old_sliver_value << std::endl; - Bare_point old_position = wp2p_(old_vertex->point()); + Weighted_point old_position = old_vertex->point(); // Keep old boundary Vertex_set old_incident_surface_vertices; @@ -2621,7 +2627,7 @@ template template typename C3T3_helpers::Vertex_handle C3T3_helpers:: -update_mesh(const Bare_point& new_position, +update_mesh(const Weighted_point& new_position, const Vertex_handle& old_vertex, OutputIterator modified_vertices, bool fill_vertices) @@ -2764,7 +2770,7 @@ rebuild_restricted_delaunay(OutdatedCells& outdated_cells, // Update moving vertices (it becomes new_vertex) moving_vertices.erase(*it); - Vertex_handle new_vertex = update_mesh(new_pos,*it); + Vertex_handle new_vertex = update_mesh(p2wp_(new_pos),*it); c3t3_.set_dimension(new_vertex,2); moving_vertices.insert(new_vertex); @@ -2897,7 +2903,7 @@ template ::Vertex_handle C3T3_helpers:: move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells, DeletedCellsOutputIterator deleted_cells) const { @@ -2929,7 +2935,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, Moving_vertices_set& moving_vertices) const { @@ -2963,7 +2969,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, Moving_vertices_set& moving_vertices, bool *could_lock_zone) const @@ -3039,7 +3045,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, Outdated_cell_set& outdated_cells_set, bool *could_lock_zone) const { @@ -3098,7 +3104,7 @@ template ::Vertex_handle C3T3_helpers:: move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells, DeletedCellsOutputIterator deleted_cells) const { @@ -3137,7 +3143,7 @@ typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point_topo_change_conflict_zone_known( const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, const Facet& insertion_boundary_facet, ConflictCellsInputIterator insertion_conflict_cells_begin,//ordered ConflictCellsInputIterator insertion_conflict_cells_end, @@ -3148,7 +3154,7 @@ move_point_topo_change_conflict_zone_known( //o.w. deleted_cells will point to null pointer or so and crash const { - Bare_point old_position = wp2p_(old_vertex->point()); + Weighted_point old_position = old_vertex->point(); // make one set with conflict zone Cell_set conflict_zone; std::set_union(insertion_conflict_cells_begin, insertion_conflict_cells_end, @@ -3203,7 +3209,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position) const + const Weighted_point& new_position) const { // Insert new_vertex, remove old_vertex int dimension = c3t3_.in_dimension(old_vertex); @@ -3230,7 +3236,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point_no_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position, + const Weighted_point& new_position, OutdatedCellsOutputIterator outdated_cells) const { @@ -3246,7 +3252,7 @@ template typename C3T3_helpers::Vertex_handle C3T3_helpers:: move_point_no_topo_change(const Vertex_handle& old_vertex, - const Bare_point& new_position) const + const Weighted_point& new_position) const { // Change vertex position old_vertex->set_point(new_position); @@ -3768,7 +3774,7 @@ template :: get_conflict_zone_topo_change(const Vertex_handle& v, - const Bare_point& conflict_point, + const Weighted_point& conflict_point, CellsOutputIterator insertion_conflict_cells, FacetsOutputIterator insertion_conflict_boundary, CellsOutputIterator removal_conflict_cells, @@ -3805,7 +3811,7 @@ template OutputIterator C3T3_helpers:: get_conflict_zone_topo_change(const Vertex_handle& vertex, - const Bare_point& conflict_point, + const Weighted_point& conflict_point, OutputIterator conflict_cells) const { // Get triangulation_vertex incident cells diff --git a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h index 202a20f9de4..ca195b4751b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h +++ b/Mesh_3/include/CGAL/Mesh_3/Lloyd_move.h @@ -112,7 +112,7 @@ public: private: /** - * Project_on_plane defines operator() to project Weighted_point object on plane. + * Project_on_plane defines operator() to project point object on plane. */ struct Project_on_plane { @@ -126,14 +126,14 @@ private: }; /** - * To_2d defines operator() to transform Weighted_point into Point_2 + * To_2d defines operator() to transform Bare_point into Point_2 */ struct To_2d { To_2d(const Aff_transformation_3& to_2d) : to_2d_(to_2d) {} - Point_2 operator()(const Weighted_point& p) const - { return Point_2(to_2d_.transform(p.point()).x(), to_2d_.transform(p.point()).y()); } + Point_2 operator()(const Bare_point& p) const + { return Point_2(to_2d_.transform(p).x(), to_2d_.transform(p).y()); } private: const Aff_transformation_3& to_2d_; @@ -146,7 +146,7 @@ private: { To_3d(const Aff_transformation_3& to_3d) : to_3d_(to_3d) {} - Weighted_point operator()(const Point_2& p) const + Bare_point operator()(const Point_2& p) const { return to_3d_.transform((Bare_point(p.x(),p.y(),0))); } private: @@ -221,16 +221,16 @@ private: } case 2: // centroid { - const Weighted_point& a = points.front(); - const Weighted_point& b = points.back(); + const Bare_point& a = points.front(); + const Bare_point& b = points.back(); return centroid_segment_move(v,a,b,sizing_field); break; } case 3: // triangle centroid { - const Weighted_point& a = points.at(0); - const Weighted_point& b = points.at(1); - const Weighted_point& c = points.at(2); + const Bare_point& a = points.at(0); + const Bare_point& b = points.at(1); + const Bare_point& c = points.at(2); return centroid_triangle_move(v,a,b,c,sizing_field); break; } @@ -275,14 +275,15 @@ private: * Return move from \c v to centroid of segment [a,b] */ Vector_3 centroid_segment_move(const Vertex_handle& v, - const Weighted_point& a, - const Weighted_point& b, + const Bare_point& a, + const Bare_point& b, const Sizing_field& sizing_field) const { typename Gt::Construct_vector_3 vector = Gt().construct_vector_3_object(); - const Weighted_point& p = v->point(); + typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + const Bare_point& p = wp2p(v->point()); FT da = density_1d(a,v,sizing_field); FT db = density_1d(b,v,sizing_field); @@ -295,15 +296,16 @@ private: * Return move from \c v to centroid of triangle [a,b,c] */ Vector_3 centroid_triangle_move(const Vertex_handle& v, - const Weighted_point& a, - const Weighted_point& b, - const Weighted_point& c, + const Bare_point& a, + const Bare_point& b, + const Bare_point& c, const Sizing_field& sizing_field) const { typename Gt::Construct_vector_3 vector = Gt().construct_vector_3_object(); - const Weighted_point& p = v->point(); + typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + const Bare_point& p = wp2p(v->point()); FT da = density_2d(a,v,sizing_field); FT db = density_2d(b,v,sizing_field); @@ -353,7 +355,7 @@ private: std::back_inserter(ch_2d)); // Lift back convex hull to 3D - std::vector polygon_3d; + std::vector polygon_3d; polygon_3d.reserve(ch_2d.size()); std::transform(ch_2d.begin(), ch_2d.end(), std::back_inserter(polygon_3d), To_3d(to_3d)); @@ -389,13 +391,13 @@ private: const Weighted_point& vertex_position = v->point(); // Use as reference point to triangulate - const Weighted_point& a = *first++; - const Weighted_point* b = &(*first++); + const Bare_point& a = *first++; + const Bare_point* b = &(*first++); // Treat first point (optimize density_2d call) - const Weighted_point& c = *first++; + const Bare_point& c = *first++; - Weighted_point triangle_centroid = centroid(a,*b,c); + Bare_point triangle_centroid = centroid(a,*b,c); FT density = density_2d(triangle_centroid, v, sizing_field); FT sum_masses = density * area(a,*b,c); @@ -406,9 +408,9 @@ private: // Next points while ( first != last ) { - const Weighted_point& c = *first++; + const Bare_point& c = *first++; - Weighted_point triangle_centroid = centroid(a,*b,c); + Bare_point triangle_centroid = centroid(a,*b,c); FT density = density_2d(triangle_centroid, v, sizing_field); FT mass = density * area(a,*b,c); @@ -427,7 +429,7 @@ private: * Returns the transformation from reference_point to plane */ Aff_transformation_3 compute_to_3d_transform(const Plane_3& plane, - const Weighted_point& reference_point) const + const Bare_point& reference_point) const { typename Gt::Construct_base_vector_3 base = Gt().construct_base_vector_3_object(); @@ -453,7 +455,7 @@ private: * returns density_1d */ template - FT density_1d(const Weighted_point& p, + FT density_1d(const Bare_point& p, const Vertex_handle& v, const Sizing_field& sizing_field) const { @@ -468,7 +470,7 @@ private: * returns density_2d */ template - FT density_2d(const Weighted_point& p, + FT density_2d(const Bare_point& p, const Vertex_handle& v, const Sizing_field& sizing_field) const { @@ -483,7 +485,7 @@ private: * returns density_3d */ template - FT density_3d(const Weighted_point& p, + FT density_3d(const Bare_point& p, const Cell_handle& cell, const Sizing_field& sizing_field) const { @@ -519,23 +521,26 @@ private: typename Gt::Construct_vector_3 vector = Gt().construct_vector_3_object(); + typename Gt::Construct_point_3 wp2p = + Gt().construct_point_3_object(); + Cell_circulator current_cell = tr.incident_cells(edge); Cell_circulator done = current_cell; // a & b are fixed points - const Weighted_point& a = v->point(); - const Weighted_point b = tr.dual(current_cell++); + const Bare_point& a = wp2p(v->point()); + const Bare_point b = tr.dual(current_cell++); CGAL_assertion(current_cell != done); // c & d are moving points - Weighted_point c = tr.dual(current_cell++); + Bare_point c = tr.dual(current_cell++); CGAL_assertion(current_cell != done); while ( current_cell != done ) { - const Weighted_point d = tr.dual(current_cell++); + const Bare_point d = tr.dual(current_cell++); - Weighted_point tet_centroid = centroid(a,b,c,d); + Bare_point tet_centroid = centroid(a,b,c,d); // Compute mass FT density = density_3d(tet_centroid, current_cell, sizing_field); diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h index 6bd2356271c..81d9935d38b 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesh_global_optimizer.h @@ -346,6 +346,7 @@ private: #endif // CGAL_LINKED_WITH_TBB { typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + typename Gt::Construct_weighted_point_3 p2wp = Gt().construct_weighted_point_3_object(); // Get move for each moving vertex typename Moving_vertices_set::iterator vit = moving_vertices.begin(); for ( ; vit != moving_vertices.end() ; ) @@ -359,7 +360,7 @@ private: Bare_point new_position = translate(wp2p(oldv->point()),move); FT size = (Sizing_field::is_vertex_update_needed ? sizing_field_(new_position, oldv) : 0); - moves.push_back(cpp11::make_tuple(oldv,new_position,size)); + moves.push_back(cpp11::make_tuple(oldv,p2wp(new_position),size)); } else // CGAL::NULL_VECTOR == move { @@ -480,6 +481,7 @@ private: { Vector_3 move = m_mgo.compute_move(oldv); typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + typename Gt::Construct_weighted_point_3 p2wp = Gt().construct_weighted_point_3_object(); if ( CGAL::NULL_VECTOR != move ) { Bare_point new_position = m_translate(wp2p(oldv->point()), move); @@ -489,7 +491,7 @@ private: //if( !Th().inside_protecting_balls(tr_, oldv, new_position)) //note : this is not happening for Lloyd and ODT so it's commented // maybe for a new global optimizer it should be de-commented - m_moves.push_back(cpp11::make_tuple(oldv, new_position, size)); + m_moves.push_back(cpp11::make_tuple(oldv, p2wp(new_position), size)); } else // CGAL::NULL_VECTOR == move { @@ -574,7 +576,7 @@ private: for( size_t i = r.begin() ; i != r.end() ; ++i) { const Vertex_handle& v = cpp11::get<0>(m_moves[i]); - const Bare_point& new_position = wp2p(cpp11::get<1>(m_moves[i])); + const Weighted_point& new_position = cpp11::get<1>(m_moves[i]); // Get size at new position if ( MGO::Sizing_field::is_vertex_update_needed ) { @@ -937,7 +939,7 @@ update_mesh(const Moves_vector& moves, typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); const Vertex_handle& v = cpp11::get<0>(*it); - const Bare_point& new_position = wp2p(cpp11::get<1>(*it)); + const Weighted_point& new_position = cpp11::get<1>(*it); // Get size at new position if ( Sizing_field::is_vertex_update_needed ) { @@ -1002,7 +1004,7 @@ void Mesh_global_optimizer:: fill_sizing_field() { - std::map value_map; + std::map value_map; #ifdef CGAL_LINKED_WITH_TBB // Parallel @@ -1032,7 +1034,8 @@ fill_sizing_field() vit != tr_.finite_vertices_end(); ++vit) { - value_map.insert(std::make_pair(vit->point(), + typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + value_map.insert(std::make_pair(wp2p(vit->point()), average_circumradius_length(vit))); } } diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h b/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h index 5f8bf8cadae..67ce3228ae1 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesh_sizing_field.h @@ -96,7 +96,7 @@ class Mesh_sizing_field { // Types typedef typename Tr::Geom_traits Gt; - typedef typename Tr::Weighted_point Weighted_point; + typedef typename Tr::Bare_point Bare_point; typedef typename Gt::FT FT; typedef typename Tr::Vertex_handle Vertex_handle; @@ -115,43 +115,43 @@ public: /** * Fill sizing field, using size associated to point in \c value_map */ - void fill(const std::map& value_map); + void fill(const std::map& value_map); /** * Returns size at point \c p. */ - FT operator()(const Weighted_point& p) const + FT operator()(const Bare_point& p) const { return this->operator()(p, this->get_last_cell()); } /** * Returns size at point \c p, using \c v to accelerate \c p location * in triangulation */ - FT operator()(const Weighted_point& p, const Vertex_handle& v) const + FT operator()(const Bare_point& p, const Vertex_handle& v) const { return this->operator()(p,v->cell()); } /** * Returns size at point \c p. */ - FT operator()(const Weighted_point& p, const Cell_handle& c) const; + FT operator()(const Bare_point& p, const Cell_handle& c) const; /** * Returns size at point \c p. Assumes that p is the centroid of c. */ - FT operator()(const Weighted_point& p, const std::pair& c) const; + FT operator()(const Bare_point& p, const std::pair& c) const; private: /** * Returns size at point \c p, by interpolation into tetrahedron. */ - FT interpolate_on_cell_vertices(const Weighted_point& p, + FT interpolate_on_cell_vertices(const Bare_point& p, const Cell_handle& cell) const; /** * Returns size at point \c p, by interpolation into facet (\c cell is assumed * to be an infinite cell). */ - FT interpolate_on_facet_vertices(const Weighted_point& p, + FT interpolate_on_facet_vertices(const Bare_point& p, const Cell_handle& cell) const; private: @@ -172,7 +172,7 @@ Mesh_sizing_field(Tr& tr) template void Mesh_sizing_field:: -fill(const std::map& value_map) +fill(const std::map& value_map) { typedef typename Tr::Finite_vertices_iterator Fvi; @@ -180,8 +180,8 @@ fill(const std::map& value_map) vit != tr_.finite_vertices_end() ; ++ vit ) { - typename std::map::const_iterator find_result = - value_map.find(vit->point()); + typename std::map::const_iterator find_result = + value_map.find(tr_.geom_traits().construct_point_3_object()(vit->point())); if ( find_result != value_map.end() ) { @@ -198,16 +198,16 @@ fill(const std::map& value_map) template typename Mesh_sizing_field::FT Mesh_sizing_field:: -operator()(const Weighted_point& p, const Cell_handle& c) const +operator()(const Bare_point& p, const Cell_handle& c) const { #ifdef CGAL_MESH_3_SIZING_FIELD_INEXACT_LOCATE //use the inexact locate (much faster than locate) to get a hint //and then use locate to check whether p is really inside hint // if not, an exact locate will be performed - Cell_handle hint = tr_.inexact_locate(p,c); - const Cell_handle cell = tr_.locate(p, hint); + Cell_handle hint = tr_.inexact_locate(tr_.geom_traits().construct_weighted_point_3_object()(p),c); + const Cell_handle cell = tr_.locate(tr_.geom_traits().construct_weighted_point_3_object()(p), hint); #else - const Cell_handle cell = tr_.locate(p,c); + const Cell_handle cell = tr_.locate(tr_.geom_traits().construct_weighted_point_3_object()(p),c); #endif this->set_last_cell(cell); @@ -221,7 +221,7 @@ operator()(const Weighted_point& p, const Cell_handle& c) const template typename Mesh_sizing_field::FT Mesh_sizing_field:: -operator()(const Weighted_point&, const std::pair& c) const +operator()(const Bare_point&, const std::pair& c) const { // Assumes that p is the centroid of c const Cell_handle& cell = c.first; @@ -239,10 +239,10 @@ operator()(const Weighted_point&, const std::pair& c) const template typename Mesh_sizing_field::FT Mesh_sizing_field:: -interpolate_on_cell_vertices(const Weighted_point& p, const Cell_handle& cell) const +interpolate_on_cell_vertices(const Bare_point& p, const Cell_handle& cell) const { - typename Gt::Compute_volume_3 volume = - Gt().compute_volume_3_object(); + typename Gt::Compute_volume_3 volume = tr_.geom_traits().compute_volume_3_object(); + typename Gt::Construct_point_3 wp2p = tr_.geom_traits().construct_point_3_object(); // Interpolate value using tet vertices values const FT& va = cell->vertex(0)->meshing_info(); @@ -250,10 +250,10 @@ interpolate_on_cell_vertices(const Weighted_point& p, const Cell_handle& cell) c const FT& vc = cell->vertex(2)->meshing_info(); const FT& vd = cell->vertex(3)->meshing_info(); - const Weighted_point& a = cell->vertex(0)->point(); - const Weighted_point& b = cell->vertex(1)->point(); - const Weighted_point& c = cell->vertex(2)->point(); - const Weighted_point& d = cell->vertex(3)->point(); + const Bare_point& a = wp2p(cell->vertex(0)->point()); + const Bare_point& b = wp2p(cell->vertex(1)->point()); + const Bare_point& c = wp2p(cell->vertex(2)->point()); + const Bare_point& d = wp2p(cell->vertex(3)->point()); const FT abcp = CGAL::abs(volume(a,b,c,p)); const FT abdp = CGAL::abs(volume(a,d,b,p)); @@ -272,11 +272,11 @@ interpolate_on_cell_vertices(const Weighted_point& p, const Cell_handle& cell) c template typename Mesh_sizing_field::FT Mesh_sizing_field:: -interpolate_on_facet_vertices(const Weighted_point& p, const Cell_handle& cell) const +interpolate_on_facet_vertices(const Bare_point& p, const Cell_handle& cell) const { - typename Gt::Compute_area_3 area = - Gt().compute_area_3_object(); + typename Gt::Compute_area_3 area = tr_.geom_traits().compute_area_3_object(); + typename Gt::Construct_point_3 wp2p = tr_.geom_traits().construct_point_3_object(); // Find infinite vertex and put it in k0 int k0 = 0; int k1 = 1; @@ -295,9 +295,9 @@ interpolate_on_facet_vertices(const Weighted_point& p, const Cell_handle& cell) const FT& vb = cell->vertex(k2)->meshing_info(); const FT& vc = cell->vertex(k3)->meshing_info(); - const Weighted_point& a = cell->vertex(k1)->point(); - const Weighted_point& b = cell->vertex(k2)->point(); - const Weighted_point& c = cell->vertex(k3)->point(); + const Bare_point& a = wp2p(cell->vertex(k1)->point()); + const Bare_point& b = wp2p(cell->vertex(k2)->point()); + const Bare_point& c = wp2p(cell->vertex(k3)->point()); const FT abp = area(a,b,p); const FT acp = area(a,c,p); diff --git a/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h b/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h index 6de90fb577f..c11aec4bf0f 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Mesher_3.h @@ -555,7 +555,8 @@ initialize() float(tbb::task_scheduler_init::default_num_threads()) * Concurrent_mesher_config::get().num_pseudo_infinite_vertices_per_core); for (int i = 0 ; i < NUM_PSEUDO_INFINITE_VERTICES ; ++i, ++random_point) - r_c3t3_.add_far_point(r_c3t3_.triangulation().geom_traits().construct_translated_point_3_object()(*random_point, center)); + r_c3t3_.add_far_point(r_c3t3_.triangulation().geom_traits().construct_weighted_point_3_object() + (r_c3t3_.triangulation().geom_traits().construct_translated_point_3_object()(*random_point, center))); # ifdef CGAL_CONCURRENT_MESH_3_VERBOSE std::cerr << "done." << std::endl; diff --git a/Mesh_3/include/CGAL/Mesh_3/Odt_move.h b/Mesh_3/include/CGAL/Mesh_3/Odt_move.h index 7466d2b8726..4f5d34b900a 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Odt_move.h +++ b/Mesh_3/include/CGAL/Mesh_3/Odt_move.h @@ -51,6 +51,7 @@ class Odt_move typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Facet Facet; typedef typename Tr::Weighted_point Weighted_point; + typedef typename Tr::Bare_point Bare_point; typedef typename std::vector Cell_vector; typedef typename std::vector Vertex_vector; @@ -133,7 +134,7 @@ private: typename Gt::Construct_centroid_3 centroid = Gt().construct_centroid_3_object(); - Weighted_point c = centroid(tr.tetrahedron(cell)); + Bare_point c = centroid(tr.tetrahedron(cell)); FT s = sizing_field(c,std::make_pair(cell,true)); CGAL_assertion(!is_zero(s)); diff --git a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h index 7783d2db858..8e913d7cb34 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h +++ b/Mesh_3/include/CGAL/Mesh_3/Refine_facets_manifold_base.h @@ -117,6 +117,7 @@ public: typedef Complex3InTriangulation3 C3t3; typedef MeshDomain Mesh_domain; typedef typename Tr::Point Point; + typedef typename Tr::Bare_point Bare_point; typedef typename Tr::Facet Facet; typedef typename Tr::Vertex_handle Vertex_handle; @@ -125,6 +126,7 @@ public: protected: typedef typename Tr::Geom_traits GT; typedef typename GT::FT FT; + typedef typename GT::Construct_point_3 Construct_point_3; typedef typename Tr::Edge Edge; typedef typename Tr::Cell_handle Cell_handle; @@ -179,13 +181,14 @@ private: FT compute_sq_distance_to_facet_center(const Facet& f, const Vertex_handle v) const { - const Point& fcenter = f.first->get_facet_surface_center(f.second); - const Point& vpoint = v->point(); + Construct_point_3 wp2p = this->r_tr_.geom_traits().construct_point_3_object(); + const Bare_point& fcenter = f.first->get_facet_surface_center(f.second); + const Bare_point& vpoint = wp2p(v->point()); return - this->r_tr_.geom_traits().compute_squared_distance_3_object() - (fcenter.point(), vpoint.point()) - - vpoint.weight(); + this->r_tr_.geom_traits().compute_squared_distance_3_object()(fcenter, + vpoint) + - v->point().weight(); } Facet diff --git a/Mesh_3/include/CGAL/Mesh_3/Robust_weighted_circumcenter_filtered_traits_3.h b/Mesh_3/include/CGAL/Mesh_3/Robust_weighted_circumcenter_filtered_traits_3.h index 84d7aa95f0f..b60f6ffbd8c 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Robust_weighted_circumcenter_filtered_traits_3.h +++ b/Mesh_3/include/CGAL/Mesh_3/Robust_weighted_circumcenter_filtered_traits_3.h @@ -174,6 +174,7 @@ public: typedef Bare_point result_type; typename Rt::Construct_point_3 wp2p = Rt().construct_point_3_object(); + typename Rt::Construct_weighted_point_3 p2wp = Rt().construct_weighted_point_3_object(); Bare_point operator() ( const Weighted_point & p, const Weighted_point & q, @@ -215,7 +216,7 @@ public: return res; } else { // Fast output - if ( power_side_of_oriented_power_sphere(p,q,r,s,res) == CGAL::ON_POSITIVE_SIDE ) + if ( power_side_of_oriented_power_sphere(p,q,r,s,p2wp(res)) == CGAL::ON_POSITIVE_SIDE ) return res; } } diff --git a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h index e8e4e467908..863713bbffc 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h +++ b/Mesh_3/include/CGAL/Mesh_3/Sliver_perturber.h @@ -1312,7 +1312,7 @@ perturb_vertex( PVertex pv } Point_3 p = wp2p(pv.vertex()->point()); - if (!helper_.try_lock_point_no_spin(p) || ! Gt().equal_3_object()(p,wp2p(pv.vertex()->point()))) + if (!helper_.try_lock_point_no_spin(pv.vertex()->point()) || ! Gt().equal_3_object()(p,wp2p(pv.vertex()->point()))) { #ifdef CGAL_CONCURRENT_MESH_3_PROFILING bcounter.increment_branch_2(); // THIS is an early withdrawal! diff --git a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h index 7ffd8e0551a..43f42f8bc77 100644 --- a/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h +++ b/Mesh_3/include/CGAL/Mesh_3/Triangulation_helpers.h @@ -41,6 +41,7 @@ class Triangulation_helpers { typedef typename Tr::Geom_traits Gt; typedef typename Tr::Bare_point Bare_point; + typedef typename Tr::Weighted_point Weighted_point; typedef typename Tr::Vertex_handle Vertex_handle; typedef typename Tr::Cell_handle Cell_handle; typedef std::vector Cell_vector; @@ -65,18 +66,18 @@ class Triangulation_helpers { /// When the requested will be about vh, the returned point will be p /// instead of vh->point() - Point_getter(const Vertex_handle &vh, const Bare_point&p) + Point_getter(const Vertex_handle &vh, const Weighted_point&p) : m_vh(vh), m_p(p) {} - const Bare_point& operator()(const Vertex_handle &vh) const + const Weighted_point& operator()(const Vertex_handle &vh) const { - return (vh == m_vh ? m_p : vh->point().point()); // AF: Can this be NOT a weighted point? + return (vh == m_vh ? m_p : vh->point()); } private: const Vertex_handle m_vh; - const Bare_point &m_p; + const Weighted_point &m_p; }; public: @@ -89,7 +90,7 @@ public: */ void move_point(Tr& tr, const Vertex_handle& v, - const Bare_point& p) const; + const Weighted_point& p) const; /** * Returns true if moving \c v to \c p makes no topological @@ -97,21 +98,21 @@ public: */ bool no_topological_change(const Tr& tr, const Vertex_handle& v, - const Bare_point& p, + const Weighted_point& p, Cell_vector& cells_tos) const; bool no_topological_change__without_set_point( const Tr& tr, const Vertex_handle& v, - const Bare_point& p, + const Weighted_point& p, Cell_vector& cells_tos) const; bool no_topological_change(const Tr& tr, const Vertex_handle& v, - const Bare_point& p) const; + const Weighted_point& p) const; bool no_topological_change__without_set_point( const Tr& tr, const Vertex_handle& v, - const Bare_point& p) const; + const Weighted_point& p) const; bool inside_protecting_balls(const Tr& tr, @@ -137,7 +138,7 @@ void Triangulation_helpers:: move_point(Tr& tr, const Vertex_handle& v, - const Bare_point& p) const + const Weighted_point& p) const { if ( no_topological_change(tr, v, p) ) v->set_point(p); @@ -153,12 +154,12 @@ bool Triangulation_helpers:: no_topological_change(const Tr& tr, const Vertex_handle& v0, - const Bare_point& p, + const Weighted_point& p, Cell_vector& cells_tos) const { Tr::Geom_traits::Construct_point_3 wp2p = tr.geom_traits().construct_point_3_object(); bool np = true; - Bare_point fp = wp2p(v0->point()); + const Weighted_point& fp = v0->point(); v0->set_point(p); if(!well_oriented(tr, cells_tos)) @@ -222,7 +223,7 @@ Triangulation_helpers:: no_topological_change__without_set_point( const Tr& tr, const Vertex_handle& v0, - const Bare_point& p, + const Weighted_point& p, Cell_vector& cells_tos) const { bool np = true; @@ -311,7 +312,7 @@ bool Triangulation_helpers:: no_topological_change(const Tr& tr, const Vertex_handle& v0, - const Bare_point& p) const + const Weighted_point& p) const { Cell_vector cells_tos; cells_tos.reserve(64); @@ -325,7 +326,7 @@ Triangulation_helpers:: no_topological_change__without_set_point( const Tr& tr, const Vertex_handle& v0, - const Bare_point& p) const + const Weighted_point& p) const { Cell_vector cells_tos; cells_tos.reserve(64); diff --git a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h index 3c1c5ad3582..2f82639ce12 100644 --- a/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h +++ b/Mesh_3/include/CGAL/Mesh_3/vertex_perturbation.h @@ -445,6 +445,7 @@ protected: typedef typename C3T3::Triangulation::Geom_traits Gt; typedef typename Gt::FT FT; typedef typename C3T3::Triangulation::Bare_point Bare_point; + typedef typename C3T3::Triangulation::Weighted_point Weighted_point; typedef Triangulation_helpers Th; typename Gt::Compute_squared_length_3 sq_length = @@ -456,6 +457,9 @@ protected: typename Gt::Construct_point_3 wp2p = Gt().construct_point_3_object(); + typename Gt::Construct_weighted_point_3 p2wp = + Gt().construct_weighted_point_3_object(); + // create a helper typedef C3T3_helpers C3T3_helpers; C3T3_helpers helper(c3t3, domain); @@ -466,8 +470,8 @@ protected: FT sq_norm = this->compute_perturbation_sq_amplitude(v, c3t3, sq_step_size_); FT step_length = CGAL::sqrt(sq_norm/sq_length(gradient_vector)); Bare_point new_loc = translate(wp2p(v->point()), step_length * gradient_vector); - Bare_point final_loc = new_loc; + if ( c3t3.in_dimension(v) < 3 ) final_loc = helper.project_on_surface(new_loc, v); @@ -477,7 +481,7 @@ protected: if (could_lock_zone) { while(Th().no_topological_change__without_set_point(c3t3.triangulation(), - v, final_loc) + v, p2wp(final_loc)) && (++i <= max_step_nb_) ) { new_loc = translate(new_loc, step_length * gradient_vector); @@ -490,7 +494,7 @@ protected: } else { - while( Th().no_topological_change(c3t3.triangulation(), v, final_loc) + while( Th().no_topological_change(c3t3.triangulation(), v, p2wp(final_loc)) && (++i <= max_step_nb_) ) { new_loc = translate(new_loc, step_length * gradient_vector); @@ -508,7 +512,7 @@ protected: return std::make_pair(false,v); // we know that there will be a combinatorial change - return helper.update_mesh_topo_change(final_loc, + return helper.update_mesh_topo_change(p2wp(final_loc), v, criterion, std::back_inserter(modified_vertices), @@ -1255,9 +1259,12 @@ private: typename Gt::Construct_translated_point_3 translate = Gt().construct_translated_point_3_object(); + typename Gt::Construct_weighted_point_3 p2wp = + Gt().construct_weighted_point_3_object(); + modified_vertices.clear(); - // Create an helper + // Create a helper typedef C3T3_helpers C3T3_helpers; C3T3_helpers helper(c3t3, domain); @@ -1291,7 +1298,7 @@ private: // try to move vertex std::vector tmp_mod_vertices; std::pair update = - helper.update_mesh(new_location, + helper.update_mesh(p2wp(new_location), moving_vertex, criterion, std::back_inserter(tmp_mod_vertices), diff --git a/Triangulation_3/include/CGAL/Regular_traits_adaptor.h b/Triangulation_3/include/CGAL/Regular_traits_adaptor.h index 190ecaca14b..880da748ee3 100644 --- a/Triangulation_3/include/CGAL/Regular_traits_adaptor.h +++ b/Triangulation_3/include/CGAL/Regular_traits_adaptor.h @@ -123,11 +123,46 @@ public: return f(p0, p1); } + typename cpp11::result_of< Functor(Point_3,Point_3, Point_3) >::type operator() (const Point_3& p0, const Point_3& p1, const Point_3& p2) const + { + return f(p0, p1, p2); + } + + typename cpp11::result_of< Functor(Point_3,Point_3, Point_3,Point_3) >::type operator() (const Point_3& p0, const Point_3& p1, const Point_3& p2, const Point_3& p3) const + { + return f(p0, p1, p2, p3); + } + + typename cpp11::result_of< Functor(Point_3,Origin) >::type operator() (const Point_3& p0, const Origin& o) const + { + return f(p0, o); + } + + typename cpp11::result_of< Functor(Point_3,Origin) >::type operator() (const Origin& o, const Point_3& p0) const + { + return f(o, p0); + } + + typename cpp11::result_of< Functor(Plane_3,Point_3) >::type operator() (const Plane_3& pl, const Point_3& p) const + { + return f(pl, p); + } + typename cpp11::result_of< Functor(Point_3,Point_3) >::type operator() (const Weighted_point_3& p0, const Weighted_point_3& p1) const { return f(cp(p0), cp(p1)); } + typename cpp11::result_of< Functor(Point_3,Point_3) >::type operator() (const Point_3& p0, const Weighted_point_3& p1) const + { + return f(p0, cp(p1)); + } + + typename cpp11::result_of< Functor(Point_3,Point_3) >::type operator() (const Weighted_point_3& p0, const Point_3& p1) const + { + return f(cp(p0), p1); + } + typename cpp11::result_of::type operator() (const Plane_3& p0, const Weighted_point_3& p1) const { return f(p0, cp(p1)); diff --git a/Triangulation_3/include/CGAL/Regular_triangulation_3.h b/Triangulation_3/include/CGAL/Regular_triangulation_3.h index 4d43e6838e4..2a69f76941b 100644 --- a/Triangulation_3/include/CGAL/Regular_triangulation_3.h +++ b/Triangulation_3/include/CGAL/Regular_triangulation_3.h @@ -550,6 +550,27 @@ namespace CGAL { public: + + Cell_handle locate(const Bare_point& bp) const + { + return this->locate(geom_traits().construct_weighted_point_3_object()(bp)); + } + + + Cell_handle locate(const Bare_point& bp, Locate_type & lt, int & li, int & lj, + Cell_handle start = Cell_handle()) const + { + return this->locate(geom_traits().construct_weighted_point_3_object()(bp), + lt, li, lj, start); + } + + + Cell_handle locate(const Bare_point& bp, Locate_type & lt, int & li, int & lj, + Vertex_handle start) const + { + return this->locate(geom_traits().construct_weighted_point_3_object()(bp), + lt, li, lj, start); + } #ifndef CGAL_TRIANGULATION_3_DONT_INSERT_RANGE_OF_POINTS_WITH_INFO template < class InputIterator > std::ptrdiff_t @@ -791,6 +812,11 @@ namespace CGAL { Vertex_handle insert(const Weighted_point & p, Locate_type lt, Cell_handle c, int li, int, bool *could_lock_zone = NULL); + Vertex_handle insert(const Bare_point & p) + { + return insert(geom_traits().construct_weighted_point_3_object()(p, typename Geom_traits::FT(0))); + } + template Vertex_handle insert_in_hole(const Weighted_point & p, CellIt cell_begin, CellIt cell_end,