From 2d8a91aaa443b5b3651321f3af3d7e8ebff76c03 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 10 Feb 2017 16:32:30 +0100 Subject: [PATCH 01/13] add minimal new example --- Mesh_3/examples/Mesh_3/CMakeLists.txt | 2 + ...olyhedral_domain_with_lipschitz_sizing.cpp | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp diff --git a/Mesh_3/examples/Mesh_3/CMakeLists.txt b/Mesh_3/examples/Mesh_3/CMakeLists.txt index 37828b019fe..612815bfa6a 100644 --- a/Mesh_3/examples/Mesh_3/CMakeLists.txt +++ b/Mesh_3/examples/Mesh_3/CMakeLists.txt @@ -75,6 +75,8 @@ if ( CGAL_FOUND ) create_single_source_cgal_program( "mesh_polyhedral_domain.cpp" ) create_single_source_cgal_program( "remesh_polyhedral_surface.cpp" ) create_single_source_cgal_program( "mesh_polyhedral_domain_with_features.cpp" ) + create_single_source_cgal_program( "mesh_polyhedral_domain_with_lipschitz_sizing.cpp" ) + if( WITH_CGAL_ImageIO ) if( VTK_FOUND AND "${VTK_VERSION_MAJOR}" GREATER "5" ) add_executable ( mesh_3D_gray_vtk_image mesh_3D_gray_vtk_image.cpp ) diff --git a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp new file mode 100644 index 00000000000..c709784f5d4 --- /dev/null +++ b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp @@ -0,0 +1,37 @@ +#include + +#include +#include +#include + +#include +#include + +// Domain +typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef CGAL::Mesh_polyhedron_3::type Polyhedron; +typedef CGAL::Polyhedral_mesh_domain_with_features_3 Mesh_domain; + + +#ifdef CGAL_CONCURRENT_MESH_3 +typedef CGAL::Parallel_tag Concurrency_tag; +#else +typedef CGAL::Sequential_tag Concurrency_tag; +#endif + +// Triangulation +typedef CGAL::Mesh_triangulation_3::type Tr; + +typedef CGAL::Mesh_complex_3_in_triangulation_3< + Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_segment_index> C3t3; + +// Criteria +typedef CGAL::Mesh_criteria_3 Mesh_criteria; + +// To avoid verbose function and named parameters call +using namespace CGAL::parameters; + +int main(int argc, char*argv[]) +{ + return EXIT_SUCCESS; +} From 7bb355c4a32146bd74a8aa07f0a3e646e1b36a01 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Mon, 13 Feb 2017 10:08:43 +0100 Subject: [PATCH 02/13] add experimental per-subdomain lipschitz sizing field --- .../Mesh_3/experimental/Lipschitz_sizing.h | 496 ++++++++++++++++++ .../Lipschitz_sizing_parameters.h | 177 +++++++ 2 files changed, 673 insertions(+) create mode 100644 Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h create mode 100644 Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h new file mode 100644 index 00000000000..6a70110868d --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h @@ -0,0 +1,496 @@ +// Copyright (c) 2016 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// +// +// Author(s) : Jane Tournois +// +//****************************************************************************** +// File Description : +// +// +//****************************************************************************** + + +#ifndef _LIPSCHITZ_SIZING_ +#define _LIPSCHITZ_SIZING_ + +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace CGAL +{ + +template +class Lipschitz_sizing +{ +public: + typedef Kernel K; + typedef typename Kernel::FT FT; + typedef typename Kernel::Triangle_3 Triangle; + typedef typename Kernel::Point_3 Point_3; + + typedef typename std::list::iterator Tr_iterator; + typedef CGAL::AABB_triangle_primitive Primitive; + typedef CGAL::AABB_traits AABB_tr_traits; + typedef CGAL::AABB_tree AABB_tree; + + typedef typename CGAL::Default::Get::type Tree; + + typedef typename C3T3::Triangulation Tr; + typedef typename C3T3::Triangulation::Facet Facet; + + typedef typename MeshDomain::Index Index; + typedef typename MeshDomain::Subdomain_index Subdomain_index; + typedef typename MeshDomain::Surface_patch_index Surface_patch_index; + + typedef typename CGAL::Default::Get::type Patches_ids; + typedef std::vector Patches_ids_map; + + typedef typename CGAL::Default::Get< + Get_facet_patch_id_, + CGAL::Mesh_3::Get_facet_patch_id + >::type Get_facet_patch_id; + + typedef CGAL::Mesh_3::Filtered_projection_traits< + typename Tree::AABB_traits, Get_facet_patch_id> AABB_filtered_traits; + + typedef CGAL::Lipschitz_sizing_parameters Parameters; + +private: + typedef CGAL::Search_traits_3 KdTreeTraits; + typedef CGAL::Orthogonal_k_neighbor_search Neighbor_search; + typedef typename Neighbor_search::Tree Kd_tree; + +private: + //only one of these aabb_trees is needed + const Tree* m_ptree; + boost::shared_ptr m_own_ptree; + + //help to accelerate aabb_tree queries in m_ptree + boost::shared_ptr m_kd_tree; + + C3T3* m_pc3t3; + const MeshDomain& m_domain; + Parameters m_params; + +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE//POLYHEDRAL EXAMPLE + Get_facet_patch_id m_get_facet_patch_id; + const Patches_ids_map& patches_ids_map; + const CGAL::cpp11::array& m_vxyz; + const CGAL::Bbox_3& m_bbox; + const bool m_domain_is_a_box; +#endif + +public: +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + Lipschitz_sizing(C3T3* pc3t3 + , const MeshDomain& domain + ) + : m_ptree(NULL) + , m_own_ptree() + , m_pc3t3(pc3t3) + , m_domain(domain) + , m_params(domain) + { + init_aabb_tree(); + } + +#else //POLYHEDRAL EXAMPLE + Lipschitz_sizing(const MeshDomain& domain + , const Tree* ptree + , const Patches_ids_map& patches_ids_map + , const CGAL::cpp11::array& vxyz + , const CGAL::Bbox_3& bbox + , const bool domain_is_a_box + ) + : m_ptree(ptree) + , m_own_ptree() + , m_pc3t3(NULL) + , m_domain(domain) + , m_params(domain) + , m_get_facet_patch_id() + , patches_ids_map(patches_ids_map) + , m_vxyz(vxyz) + , m_bbox(bbox) + , m_domain_is_a_box(domain_is_a_box) + { +# ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE + const std::vector& + ids = m_domain.boundary_patches(); + + std::cout << "Boundary patch ids : "; + if (ids.empty()) std::cout << "empty"; + BOOST_FOREACH(Surface_patch_index spi, ids) + std::cout << spi << " "; + std::cout << std::endl; +# endif // CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE + kd_tree(); + } +#endif // not CGAL_MESH_3_IMAGE_EXAMPLE + + + FT operator()(const Point_3& p, const int dim, const Index& index) const + { + CGAL_assertion(!m_params.empty()); +#ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE + std::cout << "D = " << dim << "\t"; +#endif + if (dim == 3) + { + return size_in_subdomain(p, m_domain.subdomain_index(index)); + } + else if (dim == 2) + { + Surface_patch_index sp_index = m_domain.surface_patch_index(index); + + if(!is_on_cube_boundary(sp_index) + && !is_on_cube_boundary(p)) + { +#ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE + std::cout << " \n"; +#endif + FT size_max; + m_params.get_parameters(sp_index, size_max); + return size_max; + } + else + { +#ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE + std::cout << "(on cube) "; +#endif + const std::pair& index + = m_params.incident_subdomains(sp_index); + +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + if (index.first == INT_MIN) + return size_in_subdomain(p, index.second); + else + return size_in_subdomain(p, index.first); +#else //==POLYHEDRAL EXAMPLE + if (!is_in_domain(index.first)) + return size_in_subdomain(p, index.second); + else + return size_in_subdomain(p, index.first); +#endif //CGAL_MESH_3_IMAGE_EXAMPLE + + } + } +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE + else if (dim == 1) + { + const typename MeshDomain::Curve_segment_index& curve_id = + m_domain.curve_segment_index(index); + const Patches_ids& ids = patches_ids_map[curve_id]; + + if (m_domain_is_a_box && ids.size() == 2) + { + //we are on an edge of the box + //same code as when dim == 2 + Surface_patch_index spi = *(ids.begin()); + const std::pair& subdomains + = m_params.incident_subdomains(spi); + if (!is_in_domain(subdomains.first)) + return size_in_subdomain(p, subdomains.second); + else + return size_in_subdomain(p, subdomains.first); + } + return min_size_in_incident_subdomains(ids); + } + else if (dim == 0) + { + const Patches_ids& ids = + (m_domain.corners_incidences_map().find(p)->second); + + if (m_domain_is_a_box && ids.size() == 3) + { + //we are on a corner of the box + //same code as when dim == 2 + Surface_patch_index spi = *(ids.begin()); + const std::pair& subdomains + = m_params.incident_subdomains(spi); + if (!is_in_domain(subdomains.first)) + return size_in_subdomain(p, subdomains.second); + else + return size_in_subdomain(p, subdomains.first); + } + + return min_size_in_incident_subdomains(ids);; + } +#endif + + CGAL_assertion(false); + return 0.; + } + +private: + std::vector incident_subdomains(const Patches_ids& ids) const + { + std::vector vec; + BOOST_FOREACH(Surface_patch_index spi, ids) + { + const std::pair& subdomains + = m_params.incident_subdomains(spi); + + if (is_in_domain(subdomains.first)) + vec.push_back(subdomains.first); + + if (is_in_domain(subdomains.second)) + vec.push_back(subdomains.second); + } + return vec; + } + + FT min_size_in_incident_subdomains(const Patches_ids& ids) const + { + FT size = static_cast((std::numeric_limits::max)()); + BOOST_FOREACH(Surface_patch_index spi, ids) + { + const std::pair& subdomains + = m_params.incident_subdomains(spi); + + FT k, layer_thickness, size_in_layer, size_max; + if (is_in_domain(subdomains.first)) + { + m_params.get_parameters(subdomains.first, + k, layer_thickness, size_in_layer, size_max); + size = (std::min)(size, size_in_layer); + } + if (is_in_domain(subdomains.second)) + { + m_params.get_parameters(subdomains.second, + k, layer_thickness, size_in_layer, size_max); + size = (std::min)(size, size_in_layer); + } + } + return size; + } + + void init_aabb_tree() + { +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + static std::list triangles; + for (typename C3T3::Facets_in_complex_iterator + fit = m_pc3t3->facets_in_complex_begin(); + fit != m_pc3t3->facets_in_complex_end(); + ++fit) + { + if (!is_on_cube_boundary(*fit)) + triangles.push_back(m_pc3t3->triangulation().triangle(*fit)); + } + + m_own_ptree.reset(new Tree(triangles.begin(), triangles.end())); + m_own_ptree->build(); + m_own_ptree->accelerate_distance_queries(); +#endif + } + +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + bool is_on_cube_boundary(const Facet& f) const + { + return is_on_cube_boundary(m_pc3t3->surface_patch_index(f)); + } +#endif //CGAL_MESH_3_IMAGE_EXAMPLE + + bool is_on_cube_boundary(const Surface_patch_index& sp_index) const + { + const std::pair& index + = m_params.incident_subdomains(sp_index); + +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + return (index.first == INT_MIN || index.second == INT_MIN); +#else //POLYHEDRAL EXAMPLE + + if (m_domain_is_a_box) + return !is_in_domain(index.first) || !is_in_domain(index.second); + else + return false; + +#endif //CGAL_MESH_3_IMAGE_EXAMPLE + } + + bool is_on_cube_boundary(const Point_3& p) const + { +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE//POLYHEDRAL EXAMPLE + + if (m_domain_is_a_box) + //checks that p is in the outer 'shell' of voxels + return p.x() < m_bbox.xmin() + m_vxyz[0] + || p.x() > m_bbox.xmax() - m_vxyz[0] + || p.y() < m_bbox.ymin() + m_vxyz[1] + || p.y() > m_bbox.ymax() - m_vxyz[1] + || p.z() < m_bbox.zmin() + m_vxyz[2] + || p.z() > m_bbox.zmax() - m_vxyz[2]; + else + return false; + +#else //IMAGE EXAMPLE + CGAL_USE(p); + return false; +#endif //IMAGE_EXAMPLE + } + + bool is_in_domain(const Subdomain_index& index) const + { +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + return (index != 0 && index != INT_MIN); +#else //POLYHEDRAL EXAMPLE + return (index != 0); +#endif + } + + FT size_in_subdomain(const Point_3& p, const Subdomain_index& index) const + { + FT k, layer_thickness, size_in_layer, size_max; + m_params.get_parameters(index, + k, layer_thickness, size_in_layer, size_max); + +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + FT sqdist = (m_ptree->empty()) + ? m_own_ptree->squared_distance(p) + : m_ptree->squared_distance(p); + +#else //POLYHEDRAL EXAMPLE + + Point_3 closest = compute_closest_point(p); + FT sqdist = CGAL::squared_distance(p, closest); + +#endif + + if (sqdist < layer_thickness * layer_thickness)//inside the constant layer + return size_in_layer; + + FT size = k * (CGAL::sqrt(sqdist) - layer_thickness) + size_in_layer; + return (std::min)(size, size_max); + } + + void kd_tree() + { +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE + typedef typename MeshDomain::Polyhedron Polyhedron; + if(m_kd_tree.get() == 0) { + m_kd_tree.reset(new Kd_tree); + BOOST_FOREACH(std::size_t poly_id, m_domain.inside_polyhedra()) { + const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + { + m_kd_tree->insert(v->point()); + } + } + BOOST_FOREACH(std::size_t poly_id, m_domain.boundary_polyhedra()) { + const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + { + if(!is_on_cube_boundary(v->point())) + m_kd_tree->insert(v->point()); + } + } + m_kd_tree->build(); + } +#endif // not CGAL_MESH_3_IMAGE_EXAMPLE + } + +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE + Point_3 compute_closest_point(const Point_3& p) const + { + const std::vector& boundary_ids = + m_domain.boundary_patches(); + + CGAL_STATIC_THREAD_LOCAL_VARIABLE_4(AABB_filtered_traits, + projection_traits, + boundary_ids.begin(), + boundary_ids.end(), + m_ptree->traits(), + m_get_facet_patch_id); + Neighbor_search search(*m_kd_tree, p, 1); + projection_traits.reset(search.begin()->first); + + m_ptree->traversal(p, projection_traits); + CGAL_assertion(projection_traits.found()); + return projection_traits.closest_point(); + } +#endif // not CGAL_MESH_3_IMAGE_EXAMPLE + +public: + void add_parameters_for_subdomain(const Subdomain_index& id + , const FT& k + , const FT& layer_thickness + , const FT& size_in_layer + , const FT& size_max) + { + m_params.add_subdomain(id, k, layer_thickness, size_in_layer, size_max); + } + + bool read_parameters(const char* filename) + { + std::ifstream infile(filename); + if (!infile) + { + std::cerr << "ERROR : " << filename << " is not a valid file name" << std::endl; + return false; + } + else + std::cout << "Reading Lipschitz parameters..."; + + std::string line; + while (std::getline(infile, line)) + { + if (line.empty() || line.at(0) == '#') + continue; //skip comments + + std::istringstream iss(line); + Subdomain_index id; + FT size_in_layer, size_max, layer_thickness, k; + if (!(iss >> id >> size_in_layer >> size_max >> layer_thickness >> k)) + { + std::cerr << "ERROR while reading line : [" << line << "]" << std::endl; + return false; + } + + add_parameters_for_subdomain(id, k, layer_thickness, size_in_layer, size_max); + } + std::cout << "\b\b\b done (" << m_params.size() << " subdomains)." << std::endl; + return !m_params.empty(); + } + +}; + +}//namespace CGAL + +#endif // _LIPSCHITZ_SIZING_ diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h new file mode 100644 index 00000000000..20d8f03ed26 --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h @@ -0,0 +1,177 @@ +// Copyright (c) 2016 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// +// +// Author(s) : Jane Tournois +// +//****************************************************************************** +// File Description : +// +// +//****************************************************************************** + +#ifndef CGAL_LIP_SIZING_PARAMETERS +#define CGAL_LIP_SIZING_PARAMETERS + +#include +#include + +namespace CGAL +{ +template +class Lipschitz_sizing_parameters +{ + struct SubdomainParam + { + FT m_k; + FT m_layer_thickness; + FT m_size_in_layer;//max size in constant-size boundary layer + FT m_size_max;//max size everywhere + + public: + SubdomainParam() + : m_k(0.) + , m_layer_thickness(0.) + , m_size_in_layer(0.) + , m_size_max(0.) + {} + SubdomainParam(const FT& k + , const FT& layer_thickness + , const FT& size_in_layer + , const FT& size_max) + : m_k(k) + , m_layer_thickness(layer_thickness) + , m_size_in_layer(size_in_layer) + , m_size_max(size_max) + {} + + const FT& k() const { return m_k; } + const FT& layer_thickness() const { return m_layer_thickness;} + const FT& size_in_layer() const { return m_size_in_layer; } + const FT& size_max() const { return m_size_max; } + }; + +private: + typedef typename MeshDomain::Subdomain_index Subdomain_index; + typedef typename MeshDomain::Surface_patch_index Surface_patch_index; + + typedef std::map Parameters_map; + Parameters_map m_parameters; + SubdomainParam m_default_params; + const MeshDomain* p_domain_; + +public: + Lipschitz_sizing_parameters(const MeshDomain& domain) + : p_domain_(&domain) + {} + + void add_subdomain(const Subdomain_index& index + , const FT& k + , const FT& layer_thickness + , const FT& size_in_layer + , const FT& size_max) + { + typename Parameters_map::iterator it = m_parameters.find(index); + if (it != m_parameters.end()) + std::cout << "Warning : sizing parameters for subdomain " << index + << "will be overwritten." << std::endl; + + if (index == -1) + m_default_params + = SubdomainParam(k, layer_thickness, size_in_layer, size_max); + else + m_parameters[index] + = SubdomainParam(k, layer_thickness, size_in_layer, size_max); + } + + void get_parameters(const Subdomain_index& index + , FT& k + , FT& layer_thickness + , FT& size_in_layer + , FT& size_max) const + { + typename Parameters_map::const_iterator it + = m_parameters.find(index); + + SubdomainParam p = (it != m_parameters.end()) + ? (*it).second + : m_default_params; + k = p.k(); + layer_thickness = p.layer_thickness(); + size_in_layer = p.size_in_layer(); + size_max = p.size_max(); + } + + void get_parameters(const Surface_patch_index& spi + , FT& size_max) const + { + const std::pair& index + = incident_subdomains(spi); + + typename Parameters_map::const_iterator it1 + = m_parameters.find(index.first); + typename Parameters_map::const_iterator it2 + = m_parameters.find(index.second); + + SubdomainParam p1 + = (it1 != m_parameters.end()) ? (*it1).second : m_default_params; + SubdomainParam p2 + = (it2 != m_parameters.end()) ? (*it2).second : m_default_params; + + bool boundary1 = (index.first == 0); //boundary of the domain, inside the cube + bool boundary2 = (index.second == 0); //boundary of the domain, inside the cube + +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + boundary1 = boundary1 || (index.first == INT_MIN); //boundary of the cube + boundary2 = boundary2 || (index.second == INT_MIN);//boundary of the cube +#endif + CGAL_assertion(!boundary1 || !boundary2); + + if (!boundary1) + { + if (!boundary2) + size_max = (std::min)(p1.size_in_layer(), p2.size_in_layer()); + else + size_max = p1.size_in_layer(); + } + else + size_max = p2.size_in_layer(); + } + + const std::pair & + incident_subdomains(const Surface_patch_index& index) const + { +#ifdef CGAL_MESH_3_IMAGE_EXAMPLE + return index; +#else //POLYHEDRAL_EXAMPLE + return p_domain_->incident_subdomains_indices(index); +#endif + } + + bool empty() const + { + return m_parameters.empty(); + } + std::size_t size() const + { + return m_parameters.size(); + } + +}; +}//namespace CGAL + +#endif //CGAL_LIP_SIZING_PARAMETERS From 67dca100f4db816a26db74d80209e94f3d7c7292 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 14 Feb 2017 09:21:38 +0100 Subject: [PATCH 03/13] write example for Lipschitz sizing and adapt the code while multi-polyhedral surfaces is experimental --- ...olyhedral_domain_with_lipschitz_sizing.cpp | 60 ++++- .../Mesh_3/experimental/Lipschitz_sizing.h | 210 ++++++++---------- .../Lipschitz_sizing_parameters.h | 44 ++-- 3 files changed, 173 insertions(+), 141 deletions(-) diff --git a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp index c709784f5d4..d86f7acb1e5 100644 --- a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp @@ -7,12 +7,19 @@ #include #include -// Domain +#include + +#include +#include + +//Kernel typedef CGAL::Exact_predicates_inexact_constructions_kernel K; +typedef K::FT FT; + +// Domain typedef CGAL::Mesh_polyhedron_3::type Polyhedron; typedef CGAL::Polyhedral_mesh_domain_with_features_3 Mesh_domain; - #ifdef CGAL_CONCURRENT_MESH_3 typedef CGAL::Parallel_tag Concurrency_tag; #else @@ -21,17 +28,64 @@ typedef CGAL::Sequential_tag Concurrency_tag; // Triangulation typedef CGAL::Mesh_triangulation_3::type Tr; - typedef CGAL::Mesh_complex_3_in_triangulation_3< Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_segment_index> C3t3; // Criteria typedef CGAL::Mesh_criteria_3 Mesh_criteria; +// Sizing field +typedef CGAL::Mesh_3::Lipschitz_sizing Lip_sizing; + // To avoid verbose function and named parameters call using namespace CGAL::parameters; int main(int argc, char*argv[]) { + const char* fname = (argc>1) ? argv[1] : "data/fandisk.off"; + std::ifstream input(fname); + Polyhedron polyhedron; + input >> polyhedron; + if (input.fail()){ + std::cerr << "Error: Cannot read file " << fname << std::endl; + return EXIT_FAILURE; + } + // Create domain + Mesh_domain domain(polyhedron); + + // Get sharp features + domain.detect_features(); + + //If domain is a cube + bool domain_is_a_cube = false; + FT eps = 0.05;//epsilon defining cube border + std::array vxyz = {eps, eps, eps}; + CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(polyhedron); + + // Create Lipschitz sizing field + Lip_sizing lip_sizing(domain, &domain.aabb_tree(), + vxyz, + bbox, + domain_is_a_cube); + FT min_size = 0.01; + lip_sizing.add_parameters_for_subdomain(1, //subdomain id + 0.3, //k + min_size,//min_size + 0.5); //max_size + + // Mesh criteria + Mesh_criteria criteria(edge_size = min_size, + facet_angle = 25, + facet_size = min_size, + facet_distance = 0.005, + cell_radius_edge_ratio = 3, + cell_size = lip_sizing); + // Mesh generation + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria); + + // Output + std::ofstream medit_file("out.mesh"); + c3t3.output_to_medit(medit_file); + return EXIT_SUCCESS; } diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h index 6a70110868d..0dde705d91c 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h @@ -35,7 +35,7 @@ #include #include -#include +#include #include #include @@ -51,11 +51,15 @@ namespace CGAL { +namespace Mesh_3 +{ -template class Lipschitz_sizing { @@ -72,16 +76,15 @@ public: typedef typename CGAL::Default::Get::type Tree; - typedef typename C3T3::Triangulation Tr; - typedef typename C3T3::Triangulation::Facet Facet; - typedef typename MeshDomain::Index Index; typedef typename MeshDomain::Subdomain_index Subdomain_index; typedef typename MeshDomain::Surface_patch_index Surface_patch_index; +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS typedef typename CGAL::Default::Get::type Patches_ids; typedef std::vector Patches_ids_map; +#endif typedef typename CGAL::Default::Get< Get_facet_patch_id_, @@ -106,47 +109,44 @@ private: //help to accelerate aabb_tree queries in m_ptree boost::shared_ptr m_kd_tree; - C3T3* m_pc3t3; const MeshDomain& m_domain; Parameters m_params; -#ifndef CGAL_MESH_3_IMAGE_EXAMPLE//POLYHEDRAL EXAMPLE Get_facet_patch_id m_get_facet_patch_id; - const Patches_ids_map& patches_ids_map; const CGAL::cpp11::array& m_vxyz; const CGAL::Bbox_3& m_bbox; const bool m_domain_is_a_box; + +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + const Patches_ids_map& patches_ids_map; #endif public: -#ifdef CGAL_MESH_3_IMAGE_EXAMPLE - Lipschitz_sizing(C3T3* pc3t3 - , const MeshDomain& domain - ) + Lipschitz_sizing(const MeshDomain& domain) : m_ptree(NULL) , m_own_ptree() - , m_pc3t3(pc3t3) , m_domain(domain) , m_params(domain) { - init_aabb_tree(); } -#else //POLYHEDRAL EXAMPLE Lipschitz_sizing(const MeshDomain& domain , const Tree* ptree +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS , const Patches_ids_map& patches_ids_map +#endif , const CGAL::cpp11::array& vxyz , const CGAL::Bbox_3& bbox , const bool domain_is_a_box ) : m_ptree(ptree) , m_own_ptree() - , m_pc3t3(NULL) , m_domain(domain) , m_params(domain) , m_get_facet_patch_id() +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS , patches_ids_map(patches_ids_map) +#endif , m_vxyz(vxyz) , m_bbox(bbox) , m_domain_is_a_box(domain_is_a_box) @@ -163,8 +163,6 @@ public: # endif // CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE kd_tree(); } -#endif // not CGAL_MESH_3_IMAGE_EXAMPLE - FT operator()(const Point_3& p, const int dim, const Index& index) const { @@ -178,6 +176,7 @@ public: } else if (dim == 2) { +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS Surface_patch_index sp_index = m_domain.surface_patch_index(index); if(!is_on_cube_boundary(sp_index) @@ -209,12 +208,18 @@ public: else return size_in_subdomain(p, index.first); #endif //CGAL_MESH_3_IMAGE_EXAMPLE - } + +#else //CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + CGAL_assertion(false); + return 0.; +#endif //CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS } + #ifndef CGAL_MESH_3_IMAGE_EXAMPLE else if (dim == 1) { +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS const typename MeshDomain::Curve_segment_index& curve_id = m_domain.curve_segment_index(index); const Patches_ids& ids = patches_ids_map[curve_id]; @@ -232,9 +237,14 @@ public: return size_in_subdomain(p, subdomains.first); } return min_size_in_incident_subdomains(ids); +#else + CGAL_assertion(false);//should not be used for dimension 1 + return 0.; +#endif } else if (dim == 0) { +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS const Patches_ids& ids = (m_domain.corners_incidences_map().find(p)->second); @@ -252,6 +262,10 @@ public: } return min_size_in_incident_subdomains(ids);; +#else + CGAL_assertion(false);//should not be used for dimension 0 + return 0; +#endif } #endif @@ -260,6 +274,7 @@ public: } private: +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS std::vector incident_subdomains(const Patches_ids& ids) const { std::vector vec; @@ -285,48 +300,47 @@ private: const std::pair& subdomains = m_params.incident_subdomains(spi); - FT k, layer_thickness, size_in_layer, size_max; + FT k, size_min, size_max; if (is_in_domain(subdomains.first)) { - m_params.get_parameters(subdomains.first, - k, layer_thickness, size_in_layer, size_max); - size = (std::min)(size, size_in_layer); + m_params.get_parameters(subdomains.first, k, size_min, size_max); + size = (std::min)(size, size_min); } if (is_in_domain(subdomains.second)) { - m_params.get_parameters(subdomains.second, - k, layer_thickness, size_in_layer, size_max); - size = (std::min)(size, size_in_layer); + m_params.get_parameters(subdomains.second, k, size_min, size_max); + size = (std::min)(size, size_min); } } return size; } +#endif - void init_aabb_tree() +public: + template + void init_aabb_tree_from_c3t3(const C3T3* p_c3t3) { -#ifdef CGAL_MESH_3_IMAGE_EXAMPLE static std::list triangles; for (typename C3T3::Facets_in_complex_iterator - fit = m_pc3t3->facets_in_complex_begin(); - fit != m_pc3t3->facets_in_complex_end(); + fit = p_c3t3->facets_in_complex_begin(); + fit != p_c3t3->facets_in_complex_end(); ++fit) { if (!is_on_cube_boundary(*fit)) - triangles.push_back(m_pc3t3->triangulation().triangle(*fit)); + triangles.push_back(p_c3t3->triangulation().triangle(*fit)); } m_own_ptree.reset(new Tree(triangles.begin(), triangles.end())); m_own_ptree->build(); m_own_ptree->accelerate_distance_queries(); -#endif } -#ifdef CGAL_MESH_3_IMAGE_EXAMPLE +private: + template bool is_on_cube_boundary(const Facet& f) const { - return is_on_cube_boundary(m_pc3t3->surface_patch_index(f)); + return is_on_cube_boundary(f.first->surface_patch_index(f.second)); } -#endif //CGAL_MESH_3_IMAGE_EXAMPLE bool is_on_cube_boundary(const Surface_patch_index& sp_index) const { @@ -377,58 +391,54 @@ private: FT size_in_subdomain(const Point_3& p, const Subdomain_index& index) const { - FT k, layer_thickness, size_in_layer, size_max; - m_params.get_parameters(index, - k, layer_thickness, size_in_layer, size_max); + FT k, size_min, size_max; + m_params.get_parameters(index, k, size_min, size_max); -#ifdef CGAL_MESH_3_IMAGE_EXAMPLE - FT sqdist = (m_ptree->empty()) - ? m_own_ptree->squared_distance(p) - : m_ptree->squared_distance(p); + FT sqdist = 0.; + if(m_ptree == NULL) + { + sqdist = m_own_ptree->squared_distance(p); + } + else + { + Point_3 closest = compute_closest_point(p); + sqdist = CGAL::squared_distance(p, closest); + } -#else //POLYHEDRAL EXAMPLE - - Point_3 closest = compute_closest_point(p); - FT sqdist = CGAL::squared_distance(p, closest); - -#endif - - if (sqdist < layer_thickness * layer_thickness)//inside the constant layer - return size_in_layer; - - FT size = k * (CGAL::sqrt(sqdist) - layer_thickness) + size_in_layer; + FT size = k * CGAL::sqrt(sqdist) + size_min; return (std::min)(size, size_max); } + //comment the kd_tree construction for now void kd_tree() { -#ifndef CGAL_MESH_3_IMAGE_EXAMPLE - typedef typename MeshDomain::Polyhedron Polyhedron; - if(m_kd_tree.get() == 0) { - m_kd_tree.reset(new Kd_tree); - BOOST_FOREACH(std::size_t poly_id, m_domain.inside_polyhedra()) { - const Polyhedron& poly = m_domain.polyhedra()[poly_id]; - BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) - { - m_kd_tree->insert(v->point()); - } - } - BOOST_FOREACH(std::size_t poly_id, m_domain.boundary_polyhedra()) { - const Polyhedron& poly = m_domain.polyhedra()[poly_id]; - BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) - { - if(!is_on_cube_boundary(v->point())) - m_kd_tree->insert(v->point()); - } - } - m_kd_tree->build(); - } -#endif // not CGAL_MESH_3_IMAGE_EXAMPLE + // typedef typename MeshDomain::Polyhedron Polyhedron; + // if(m_kd_tree.get() == 0) { + // m_kd_tree.reset(new Kd_tree); + // BOOST_FOREACH(std::size_t poly_id, m_domain.inside_polyhedra()) { + // const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + // BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + // { + // m_kd_tree->insert(v->point()); + // } + // } + // BOOST_FOREACH(std::size_t poly_id, m_domain.boundary_polyhedra()) { + // const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + // BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + // { + // if(!is_on_cube_boundary(v->point())) + // m_kd_tree->insert(v->point()); + // } + // } + // m_kd_tree->build(); + // } } -#ifndef CGAL_MESH_3_IMAGE_EXAMPLE Point_3 compute_closest_point(const Point_3& p) const { +#ifndef CGAL_MESH_3_IMAGE_EXAMPLE //POLYHEDRAL_EXAMPLE + +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS const std::vector& boundary_ids = m_domain.boundary_patches(); @@ -444,53 +454,29 @@ private: m_ptree->traversal(p, projection_traits); CGAL_assertion(projection_traits.found()); return projection_traits.closest_point(); + +#else //CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + return m_ptree->closest_point(p); +#endif //CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + +#else + CGAL_assertion(false); + return CGAL::ORIGIN;//not used +#endif } -#endif // not CGAL_MESH_3_IMAGE_EXAMPLE public: void add_parameters_for_subdomain(const Subdomain_index& id , const FT& k - , const FT& layer_thickness - , const FT& size_in_layer + , const FT& size_min , const FT& size_max) { - m_params.add_subdomain(id, k, layer_thickness, size_in_layer, size_max); - } - - bool read_parameters(const char* filename) - { - std::ifstream infile(filename); - if (!infile) - { - std::cerr << "ERROR : " << filename << " is not a valid file name" << std::endl; - return false; - } - else - std::cout << "Reading Lipschitz parameters..."; - - std::string line; - while (std::getline(infile, line)) - { - if (line.empty() || line.at(0) == '#') - continue; //skip comments - - std::istringstream iss(line); - Subdomain_index id; - FT size_in_layer, size_max, layer_thickness, k; - if (!(iss >> id >> size_in_layer >> size_max >> layer_thickness >> k)) - { - std::cerr << "ERROR while reading line : [" << line << "]" << std::endl; - return false; - } - - add_parameters_for_subdomain(id, k, layer_thickness, size_in_layer, size_max); - } - std::cout << "\b\b\b done (" << m_params.size() << " subdomains)." << std::endl; - return !m_params.empty(); + m_params.add_subdomain(id, k, size_min, size_max); } }; +}//namespace Mesh_3 }//namespace CGAL #endif // _LIPSCHITZ_SIZING_ diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h index 20d8f03ed26..89041671397 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h @@ -38,30 +38,25 @@ class Lipschitz_sizing_parameters struct SubdomainParam { FT m_k; - FT m_layer_thickness; - FT m_size_in_layer;//max size in constant-size boundary layer - FT m_size_max;//max size everywhere + FT m_size_min;//min size in subdomain + FT m_size_max;//max size in subdomain public: SubdomainParam() : m_k(0.) - , m_layer_thickness(0.) - , m_size_in_layer(0.) + , m_size_min(0.) , m_size_max(0.) {} SubdomainParam(const FT& k - , const FT& layer_thickness - , const FT& size_in_layer + , const FT& size_min , const FT& size_max) : m_k(k) - , m_layer_thickness(layer_thickness) - , m_size_in_layer(size_in_layer) + , m_size_min(size_min) , m_size_max(size_max) {} const FT& k() const { return m_k; } - const FT& layer_thickness() const { return m_layer_thickness;} - const FT& size_in_layer() const { return m_size_in_layer; } + const FT& size_min() const { return m_size_min; } const FT& size_max() const { return m_size_max; } }; @@ -81,8 +76,7 @@ public: void add_subdomain(const Subdomain_index& index , const FT& k - , const FT& layer_thickness - , const FT& size_in_layer + , const FT& size_min , const FT& size_max) { typename Parameters_map::iterator it = m_parameters.find(index); @@ -92,16 +86,15 @@ public: if (index == -1) m_default_params - = SubdomainParam(k, layer_thickness, size_in_layer, size_max); + = SubdomainParam(k, size_min, size_max); else m_parameters[index] - = SubdomainParam(k, layer_thickness, size_in_layer, size_max); + = SubdomainParam(k, size_min, size_max); } void get_parameters(const Subdomain_index& index , FT& k - , FT& layer_thickness - , FT& size_in_layer + , FT& size_min , FT& size_max) const { typename Parameters_map::const_iterator it @@ -111,8 +104,7 @@ public: ? (*it).second : m_default_params; k = p.k(); - layer_thickness = p.layer_thickness(); - size_in_layer = p.size_in_layer(); + size_min = p.size_min(); size_max = p.size_max(); } @@ -144,22 +136,22 @@ public: if (!boundary1) { if (!boundary2) - size_max = (std::min)(p1.size_in_layer(), p2.size_in_layer()); + size_max = (std::min)(p1.size_min(), p2.size_min()); else - size_max = p1.size_in_layer(); + size_max = p1.size_min(); } else - size_max = p2.size_in_layer(); + size_max = p2.size_min(); } const std::pair & incident_subdomains(const Surface_patch_index& index) const { -#ifdef CGAL_MESH_3_IMAGE_EXAMPLE +//#ifdef CGAL_MESH_3_IMAGE_EXAMPLE return index; -#else //POLYHEDRAL_EXAMPLE - return p_domain_->incident_subdomains_indices(index); -#endif +//#else //POLYHEDRAL_EXAMPLE +// return p_domain_->incident_subdomains_indices(index); +//#endif } bool empty() const From 0b0a063db3c338aadbacfb440dc4fa80f64d02ab Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 28 Feb 2017 11:32:53 +0100 Subject: [PATCH 04/13] reorder things to make example more clear --- .../Mesh_3/experimental/Lipschitz_sizing.h | 85 +++++++++---------- 1 file changed, 38 insertions(+), 47 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h index 0dde705d91c..773b248ae55 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h @@ -56,8 +56,8 @@ namespace Mesh_3 template @@ -80,11 +80,12 @@ public: typedef typename MeshDomain::Subdomain_index Subdomain_index; typedef typename MeshDomain::Surface_patch_index Surface_patch_index; + typedef CGAL::Lipschitz_sizing_parameters Parameters; + #ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS typedef typename CGAL::Default::Get::type Patches_ids; typedef std::vector Patches_ids_map; -#endif typedef typename CGAL::Default::Get< Get_facet_patch_id_, @@ -94,30 +95,29 @@ public: typedef CGAL::Mesh_3::Filtered_projection_traits< typename Tree::AABB_traits, Get_facet_patch_id> AABB_filtered_traits; - typedef CGAL::Lipschitz_sizing_parameters Parameters; - private: typedef CGAL::Search_traits_3 KdTreeTraits; typedef CGAL::Orthogonal_k_neighbor_search Neighbor_search; typedef typename Neighbor_search::Tree Kd_tree; +#endif private: //only one of these aabb_trees is needed const Tree* m_ptree; boost::shared_ptr m_own_ptree; - //help to accelerate aabb_tree queries in m_ptree - boost::shared_ptr m_kd_tree; - const MeshDomain& m_domain; Parameters m_params; - Get_facet_patch_id m_get_facet_patch_id; const CGAL::cpp11::array& m_vxyz; const CGAL::Bbox_3& m_bbox; const bool m_domain_is_a_box; #ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + //help to accelerate aabb_tree queries in m_ptree + boost::shared_ptr m_kd_tree; + + Get_facet_patch_id m_get_facet_patch_id; const Patches_ids_map& patches_ids_map; #endif @@ -132,36 +132,25 @@ public: Lipschitz_sizing(const MeshDomain& domain , const Tree* ptree -#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS - , const Patches_ids_map& patches_ids_map -#endif , const CGAL::cpp11::array& vxyz , const CGAL::Bbox_3& bbox , const bool domain_is_a_box +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + , const Patches_ids_map& patches_ids_map +#endif ) : m_ptree(ptree) , m_own_ptree() , m_domain(domain) , m_params(domain) - , m_get_facet_patch_id() -#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS - , patches_ids_map(patches_ids_map) -#endif , m_vxyz(vxyz) , m_bbox(bbox) , m_domain_is_a_box(domain_is_a_box) +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS + , m_get_facet_patch_id() + , patches_ids_map(patches_ids_map) +#endif { -# ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE - const std::vector& - ids = m_domain.boundary_patches(); - - std::cout << "Boundary patch ids : "; - if (ids.empty()) std::cout << "empty"; - BOOST_FOREACH(Surface_patch_index spi, ids) - std::cout << spi << " "; - std::cout << std::endl; -# endif // CGAL_MESH_3_LIPSCHITZ_SIZING_VERBOSE - kd_tree(); } FT operator()(const Point_3& p, const int dim, const Index& index) const @@ -409,30 +398,31 @@ private: return (std::min)(size, size_max); } - //comment the kd_tree construction for now +#ifdef CGAL_MESH_3_EXPERIMENTAL_USE_PATCHES_IDS void kd_tree() { - // typedef typename MeshDomain::Polyhedron Polyhedron; - // if(m_kd_tree.get() == 0) { - // m_kd_tree.reset(new Kd_tree); - // BOOST_FOREACH(std::size_t poly_id, m_domain.inside_polyhedra()) { - // const Polyhedron& poly = m_domain.polyhedra()[poly_id]; - // BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) - // { - // m_kd_tree->insert(v->point()); - // } - // } - // BOOST_FOREACH(std::size_t poly_id, m_domain.boundary_polyhedra()) { - // const Polyhedron& poly = m_domain.polyhedra()[poly_id]; - // BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) - // { - // if(!is_on_cube_boundary(v->point())) - // m_kd_tree->insert(v->point()); - // } - // } - // m_kd_tree->build(); - // } + typedef typename MeshDomain::Polyhedron Polyhedron; + if(m_kd_tree.get() == 0) { + m_kd_tree.reset(new Kd_tree); + BOOST_FOREACH(std::size_t poly_id, m_domain.inside_polyhedra()) { + const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + { + m_kd_tree->insert(v->point()); + } + } + BOOST_FOREACH(std::size_t poly_id, m_domain.boundary_polyhedra()) { + const Polyhedron& poly = m_domain.polyhedra()[poly_id]; + BOOST_FOREACH(typename Polyhedron::Vertex_handle v, vertices(poly)) + { + if(!is_on_cube_boundary(v->point())) + m_kd_tree->insert(v->point()); + } + } + m_kd_tree->build(); + } } +#endif Point_3 compute_closest_point(const Point_3& p) const { @@ -448,6 +438,7 @@ private: boundary_ids.end(), m_ptree->traits(), m_get_facet_patch_id); + kd_tree();//build it if needed Neighbor_search search(*m_kd_tree, p, 1); projection_traits.reset(search.begin()->first); From c699d45e66283e4917b01442fffabdb981e06b32 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 28 Feb 2017 12:19:21 +0100 Subject: [PATCH 05/13] simplify lipschitz sizing for a polyhedral domain it can be enriched later, once we have the multi-polyhedral domain the complete code is in Lipschitz_sizing_experimental.h --- ...olyhedral_domain_with_lipschitz_sizing.cpp | 17 +- ...zing.h => Lipschitz_sizing_experimental.h} | 0 .../Lipschitz_sizing_parameters.h | 18 +- .../Lipschitz_sizing_polyhedron.h | 190 ++++++++++++++++++ 4 files changed, 200 insertions(+), 25 deletions(-) rename Mesh_3/include/CGAL/Mesh_3/experimental/{Lipschitz_sizing.h => Lipschitz_sizing_experimental.h} (100%) create mode 100644 Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h diff --git a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp index d86f7acb1e5..314fa4a9759 100644 --- a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp @@ -7,10 +7,7 @@ #include #include -#include - -#include -#include +#include //Kernel typedef CGAL::Exact_predicates_inexact_constructions_kernel K; @@ -56,17 +53,9 @@ int main(int argc, char*argv[]) // Get sharp features domain.detect_features(); - //If domain is a cube - bool domain_is_a_cube = false; - FT eps = 0.05;//epsilon defining cube border - std::array vxyz = {eps, eps, eps}; - CGAL::Bbox_3 bbox = CGAL::Polygon_mesh_processing::bbox(polyhedron); - // Create Lipschitz sizing field - Lip_sizing lip_sizing(domain, &domain.aabb_tree(), - vxyz, - bbox, - domain_is_a_cube); + Lip_sizing lip_sizing(domain, &domain.aabb_tree()); + FT min_size = 0.01; lip_sizing.add_parameters_for_subdomain(1, //subdomain id 0.3, //k diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h similarity index 100% rename from Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing.h rename to Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h index 89041671397..b29631dcfe6 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h @@ -74,6 +74,9 @@ public: : p_domain_(&domain) {} + bool empty() const { return m_parameters.empty(); } + std::size_t size() const { return m_parameters.size(); } + void add_subdomain(const Subdomain_index& index , const FT& k , const FT& size_min @@ -108,6 +111,7 @@ public: size_max = p.size_max(); } +#ifdef CGAL_MESH_3_LIPSCHITZ_SIZING_EXPERIMENTAL void get_parameters(const Surface_patch_index& spi , FT& size_max) const { @@ -148,20 +152,12 @@ public: incident_subdomains(const Surface_patch_index& index) const { //#ifdef CGAL_MESH_3_IMAGE_EXAMPLE - return index; +// return index; //#else //POLYHEDRAL_EXAMPLE -// return p_domain_->incident_subdomains_indices(index); + return p_domain_->incident_subdomains_indices(index); //#endif } - - bool empty() const - { - return m_parameters.empty(); - } - std::size_t size() const - { - return m_parameters.size(); - } +#endif }; }//namespace CGAL diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h new file mode 100644 index 00000000000..266505fa3be --- /dev/null +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h @@ -0,0 +1,190 @@ +// Copyright (c) 2016 GeometryFactory (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// +// +// Author(s) : Jane Tournois +// +//****************************************************************************** +// File Description : +// +// +//****************************************************************************** + + +#ifndef _LIPSCHITZ_SIZING_POLYHEDRON_ +#define _LIPSCHITZ_SIZING_POLYHEDRON_ + +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace CGAL +{ +namespace Mesh_3 +{ + +template +class Lipschitz_sizing +{ +public: + typedef Kernel K; + typedef typename Kernel::FT FT; + typedef typename Kernel::Triangle_3 Triangle; + typedef typename Kernel::Point_3 Point_3; + + typedef typename std::list::iterator Tr_iterator; + typedef CGAL::AABB_triangle_primitive Primitive; + typedef CGAL::AABB_traits AABB_tr_traits; + typedef CGAL::AABB_tree AABB_tree; + + typedef typename CGAL::Default::Get::type Tree; + + typedef typename MeshDomain::Index Index; + typedef typename MeshDomain::Subdomain_index Subdomain_index; + typedef typename MeshDomain::Surface_patch_index Surface_patch_index; + + typedef CGAL::Lipschitz_sizing_parameters Parameters; + + +private: + const Tree* m_ptree; + boost::shared_ptr m_own_ptree; + + const MeshDomain& m_domain; + Parameters m_params; + +public: + Lipschitz_sizing(const MeshDomain& domain) + : m_ptree(NULL) + , m_own_ptree() + , m_domain(domain) + , m_params(domain) + { + } + + Lipschitz_sizing(const MeshDomain& domain + , const Tree* ptree + ) + : m_ptree(ptree) + , m_own_ptree() + , m_domain(domain) + , m_params(domain) + { + } + + FT operator()(const Point_3& p, const int dim, const Index& index) const + { + CGAL_assertion(!m_params.empty()); + if (dim == 3) + { + return size_in_subdomain(p, m_domain.subdomain_index(index)); + } + else if (dim == 2) + { + CGAL_assertion(false);//should not be used for dimension 2 + return 0.; + } + else if (dim == 1) + { + CGAL_assertion(false);//should not be used for dimension 1 + return 0.; + } + else if (dim == 0) + { + CGAL_assertion(false);//should not be used for dimension 0 + return 0; + } + CGAL_assertion(false); + return 0.; + } + +public: + template + void init_aabb_tree_from_c3t3(const C3T3* p_c3t3) + { + static std::list triangles; + for (typename C3T3::Facets_in_complex_iterator + fit = p_c3t3->facets_in_complex_begin(); + fit != p_c3t3->facets_in_complex_end(); + ++fit) + { + triangles.push_back(p_c3t3->triangulation().triangle(*fit)); + } + + m_own_ptree.reset(new Tree(triangles.begin(), triangles.end())); + m_own_ptree->build(); + m_own_ptree->accelerate_distance_queries(); + } + +private: + FT size_in_subdomain(const Point_3& p, const Subdomain_index& index) const + { + FT k, size_min, size_max; + m_params.get_parameters(index, k, size_min, size_max); + + FT sqdist = 0.; + if(m_ptree == NULL) + { + sqdist = m_own_ptree->squared_distance(p); + } + else + { + Point_3 closest = compute_closest_point(p); + sqdist = CGAL::squared_distance(p, closest); + } + + FT size = k * CGAL::sqrt(sqdist) + size_min; + return (std::min)(size, size_max); + } + +private: + Point_3 compute_closest_point(const Point_3& p) const + { + return m_ptree->closest_point(p); + } + +public: + void add_parameters_for_subdomain(const Subdomain_index& id + , const FT& k + , const FT& size_min + , const FT& size_max) + { + m_params.add_subdomain(id, k, size_min, size_max); + } + +}; + +}//namespace Mesh_3 +}//namespace CGAL + +#endif // _LIPSCHITZ_SIZING_POLYHEDRON_ From 2da9e461c578e8878df980a0fd98ec349503b81b Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 2 Mar 2017 09:59:34 +0100 Subject: [PATCH 06/13] WIP doc Lipschitz example --- Mesh_3/doc/Mesh_3/Mesh_3.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index e4cee4830f4..953454b396e 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -809,6 +809,21 @@ a 3D medical image. View of a 3D mesh produced from a 3D image with different size for different organs. Code from subsection \ref Mesh_3_subsubsection_examples_3d_image_variable generates this file. \cgalFigureEnd +\subsubsection Mesh_3LipschitzSizingField Lipschitz Sizing Field + +\anchor Mesh_3_subsubsection_examples_3d_image_lip_sizing + +The following example shows how to use another custom sizing function, that is +K-Lipschitz, with an arbitrary parameter K provided by the user for +each subdomain. For each subdomain, the user provides a minimal and maximal size +for cells. + +\cgalExample{Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp} + +\cgalFigureBegin{figurefandisk_lip_sizing,fandisk_lip.jpg} +View of a 3D mesh produced . Code from subsection \ref Mesh_3_subsubsection_examples_3d_image_lip_sizing generates this mesh. +\cgalFigureEnd + \subsection Mesh_3MeshingDomainswithSharpFeatures Meshing Domains with Sharp Features \anchor Mesh_3_subsection_example_polyhedral_with_edges From 0d438291c9eb7723fd0f10ca9b238ecc910668e0 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 2 Mar 2017 15:33:22 +0100 Subject: [PATCH 07/13] change min_size to speedup the example --- .../Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp index 314fa4a9759..2d6ff4edde4 100644 --- a/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp +++ b/Mesh_3/examples/Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp @@ -56,7 +56,7 @@ int main(int argc, char*argv[]) // Create Lipschitz sizing field Lip_sizing lip_sizing(domain, &domain.aabb_tree()); - FT min_size = 0.01; + FT min_size = 0.02; lip_sizing.add_parameters_for_subdomain(1, //subdomain id 0.3, //k min_size,//min_size From 8ae1c32d536b96a446fe3bf1afd7e25466d80f64 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 2 Mar 2017 15:59:11 +0100 Subject: [PATCH 08/13] add figure for lipschitz sizing --- Mesh_3/doc/Mesh_3/fig/fandisk_lip.jpg | Bin 0 -> 111790 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Mesh_3/doc/Mesh_3/fig/fandisk_lip.jpg diff --git a/Mesh_3/doc/Mesh_3/fig/fandisk_lip.jpg b/Mesh_3/doc/Mesh_3/fig/fandisk_lip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a7ca2c00be7db6ae0ec59725190b77296075e42 GIT binary patch literal 111790 zcmb5VWmsfQlO|la)4034yEd+kySo)M?$F&>V6P(b7E?(XjH&@AuFywC3J&iCWX zIzQ@EMBI0rEAvD~W>kJGeQW_xWF=)J0bpQY0He}iIA|D{825L|0x9n|CB?+e5?QvA;19OC=e(B0NA_AKi2>Cg%*c8iv?j1#%b6n=Kf&o z{}%u2-Vz5UogEGt37k!|7NpM}t!4M?|5bA^$B{~>#R`#w3drr&Yx(NR!=F`h7wlZS zL=f=H>A&j}%Fm8xdE{wu3=hM~6^Zy9Il)VrH0P;sA>Lefn_Z}Jz!w=$tqO`X{vT!# zxrc~iB)>u~-1x9Vkr5bL*U>k>z_!OO)xch7csL&$|Axf`M`d46<~C zk=j-`x$zUAX2fMq6jRoflCF*MVTHpum&%`5VJH;Fkv;qTnh^~7#|{!Em=*)M-&83g z;Y^bTLa9tr)PN>=WN#o==}40vdl+swbgYh@V~T=HR$L1D`Sc${Fx+20YauZU6eQ#n z)b!XaCnwb&;Ptk;UX$vyrd9uZJB8YHJ+ z#tMgG{~9AfP#uS8l25J$>OUt{SOpOI7^iLPB*Vl zjT;3`VpM+}nJQ1l4n`$$R(r+Gj{sg!Rk50So5-YPY_XxxlmVm9CG!!%i{QXI8cIAN zY*;^fu2sKKiq)@w0}>F4-%5#*EHU6wP*C>zH`5ka5Q2fhUH#1K9rSXI#$C88P0#$Z z1PSp6Y5qq4Rau;xX8{Qu8Jf>U4%GySFLod

$4S}%ERy!HfuA| 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ⅇbO^rpX;%)}kHF@bnk3SfJ*5BP7>ORb+b*VXPR~ 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 literal 0 HcmV?d00001 From bb8548611927821da02206489ea976ce14023b1b Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 2 Mar 2017 16:02:52 +0100 Subject: [PATCH 09/13] improve text --- Mesh_3/doc/Mesh_3/Mesh_3.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mesh_3/doc/Mesh_3/Mesh_3.txt b/Mesh_3/doc/Mesh_3/Mesh_3.txt index 953454b396e..8f09c322fa2 100644 --- a/Mesh_3/doc/Mesh_3/Mesh_3.txt +++ b/Mesh_3/doc/Mesh_3/Mesh_3.txt @@ -814,14 +814,14 @@ View of a 3D mesh produced from a 3D image with different size for different org \anchor Mesh_3_subsubsection_examples_3d_image_lip_sizing The following example shows how to use another custom sizing function, that is -K-Lipschitz, with an arbitrary parameter K provided by the user for -each subdomain. For each subdomain, the user provides a minimal and maximal size -for cells. +`k`-Lipschitz. For each subdomain, the user provides the parameter `k`, +a minimal size and maximal size for cells. \cgalExample{Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp} \cgalFigureBegin{figurefandisk_lip_sizing,fandisk_lip.jpg} -View of a 3D mesh produced . Code from subsection \ref Mesh_3_subsubsection_examples_3d_image_lip_sizing generates this mesh. +View of a 3D mesh produced with a Lipschitz sizing field, +for a single subdomain. Code from subsection \ref Mesh_3_subsubsection_examples_3d_image_lip_sizing generates this mesh. \cgalFigureEnd \subsection Mesh_3MeshingDomainswithSharpFeatures Meshing Domains with Sharp Features From 9d6d548bb04ed1ad89561d1fb1da6852279ea268 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 7 Mar 2017 17:43:25 +0100 Subject: [PATCH 10/13] doc fix : add ref to Lipschitz example --- Mesh_3/doc/Mesh_3/examples.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Mesh_3/doc/Mesh_3/examples.txt b/Mesh_3/doc/Mesh_3/examples.txt index 1ce31f9cfb2..f6e754dd548 100644 --- a/Mesh_3/doc/Mesh_3/examples.txt +++ b/Mesh_3/doc/Mesh_3/examples.txt @@ -17,6 +17,7 @@ \example Mesh_3/mesh_polyhedral_domain.cpp \example Mesh_3/remesh_polyhedral_surface.cpp \example Mesh_3/mesh_polyhedral_domain_with_features.cpp +\example Mesh_3/mesh_polyhedral_domain_with_lipschitz_sizing.cpp \example Mesh_3/mesh_two_implicit_spheres_with_balls.cpp \example Mesh_3/mesh_3D_gray_image.cpp */ From 8a8827add05060b8914fb84c2b4f952faddd6550 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 14 Mar 2017 10:35:00 +0100 Subject: [PATCH 11/13] remove useless file description --- .../CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h | 5 ----- .../CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h | 6 ------ 2 files changed, 11 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h index b29631dcfe6..84451423f74 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h @@ -18,11 +18,6 @@ // // Author(s) : Jane Tournois // -//****************************************************************************** -// File Description : -// -// -//****************************************************************************** #ifndef CGAL_LIP_SIZING_PARAMETERS #define CGAL_LIP_SIZING_PARAMETERS diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h index 266505fa3be..e39b73608ca 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h @@ -18,12 +18,6 @@ // // Author(s) : Jane Tournois // -//****************************************************************************** -// File Description : -// -// -//****************************************************************************** - #ifndef _LIPSCHITZ_SIZING_POLYHEDRON_ #define _LIPSCHITZ_SIZING_POLYHEDRON_ From a88efb41444fb0091a6f0adffe5f5463555623f1 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 14 Mar 2017 10:40:14 +0100 Subject: [PATCH 12/13] rename header protection macros, and include license headers --- .../Mesh_3/experimental/Lipschitz_sizing_experimental.h | 8 +++++--- .../Mesh_3/experimental/Lipschitz_sizing_parameters.h | 8 +++++--- .../Mesh_3/experimental/Lipschitz_sizing_polyhedron.h | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h index 773b248ae55..1a790e7b640 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h @@ -25,8 +25,10 @@ //****************************************************************************** -#ifndef _LIPSCHITZ_SIZING_ -#define _LIPSCHITZ_SIZING_ +#ifndef CGAL_LIPSCHITZ_SIZING_H +#define CGAL_LIPSCHITZ_SIZING_H + +#include #include #include @@ -470,4 +472,4 @@ public: }//namespace Mesh_3 }//namespace CGAL -#endif // _LIPSCHITZ_SIZING_ +#endif // CGAL_LIPSCHITZ_SIZING_H diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h index 84451423f74..bcb326f3480 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_parameters.h @@ -19,8 +19,10 @@ // Author(s) : Jane Tournois // -#ifndef CGAL_LIP_SIZING_PARAMETERS -#define CGAL_LIP_SIZING_PARAMETERS +#ifndef CGAL_LIP_SIZING_PARAMETERS_H +#define CGAL_LIP_SIZING_PARAMETERS_H + +#include #include #include @@ -157,4 +159,4 @@ public: }; }//namespace CGAL -#endif //CGAL_LIP_SIZING_PARAMETERS +#endif //CGAL_LIP_SIZING_PARAMETERS_H diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h index e39b73608ca..5be7c068f13 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_polyhedron.h @@ -19,8 +19,10 @@ // Author(s) : Jane Tournois // -#ifndef _LIPSCHITZ_SIZING_POLYHEDRON_ -#define _LIPSCHITZ_SIZING_POLYHEDRON_ +#ifndef CGAL_LIPSCHITZ_SIZING_POLYHEDRON_H +#define CGAL_LIPSCHITZ_SIZING_POLYHEDRON_H + +#include #include #include @@ -181,4 +183,4 @@ public: }//namespace Mesh_3 }//namespace CGAL -#endif // _LIPSCHITZ_SIZING_POLYHEDRON_ +#endif // CGAL_LIPSCHITZ_SIZING_POLYHEDRON_H From 882893c9d978b8fc5bbd33003edf2a927c64aa26 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Thu, 16 Mar 2017 10:37:58 +0100 Subject: [PATCH 13/13] remove empty file description --- .../Mesh_3/experimental/Lipschitz_sizing_experimental.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h index 1a790e7b640..f224ef85947 100644 --- a/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h +++ b/Mesh_3/include/CGAL/Mesh_3/experimental/Lipschitz_sizing_experimental.h @@ -18,12 +18,6 @@ // // Author(s) : Jane Tournois // -//****************************************************************************** -// File Description : -// -// -//****************************************************************************** - #ifndef CGAL_LIPSCHITZ_SIZING_H #define CGAL_LIPSCHITZ_SIZING_H