Revision 1 :

Doc fix +
Deleted default_initial_points_generation() +
Created Construct_initial_points_gray_image.h
This commit is contained in:
ange-clement 2023-10-25 14:57:48 +02:00
parent 976e73cf89
commit ec5539eac3
9 changed files with 117 additions and 43 deletions

View File

@ -451,29 +451,6 @@ unspecified_type odt(const Named_function_parameters& np = parameters::default_v
template <class NamedParameters = parameters::Default_named_parameters>
unspecified_type perturb(const Named_function_parameters& np = parameters::default_values());
/*!
* \ingroup PkgMesh3Parameters
*
* The function `parameters::default_initial_points_generation()` enables the user to
* tell the mesh generation function `make_mesh_3()`
* that the domain's `construct_initial_points_object()`
* will be called for the points initialization.
*
* \cgalHeading{Example}
*
* \code{.cpp}
* // Mesh generation using the domlain's construct_initial_points_object
* C3t3 c3t3 = make_mesh_3<c3t3>(domain,
* criteria,
* parameters::default_initial_points_generation());
* \endcode
*
* \sa `CGAL::parameters::initial_points_generator()`
* \sa `CGAL::make_mesh_3()`
* \sa `MeshDomain_3::Construct_initial_points`
*
*/
unspecified_type default_initial_points_generation();
/*!
* \ingroup PkgMesh3Parameters
*
@ -481,6 +458,9 @@ unspecified_type default_initial_points_generation();
* specify a Functor of the `InitialPointsGenerator` concept
* to the mesh generation function `make_mesh_3()`.
* The functor will be called for the points initialization.
* If this parameter is specified without argument, the default behaviour is executed,
* i.e. the domain's `construct_initial_points_object()`
* will be called for the points initialization.
*
* \cgalHeading{Example}
*
@ -491,8 +471,8 @@ unspecified_type default_initial_points_generation();
* parameters::initial_points_generator(CGAL::Construct_initial_points_labeled_image(image)));
* \endcode
*
* \sa `CGAL::parameters::default_initial_points_generation()`
* \sa `CGAL::make_mesh_3()`
* \sa `MeshDomain_3::Construct_initial_points`
*
*/
template <typename InitialPointsGenerator>

View File

@ -7,6 +7,7 @@ a set of initial points on the surface of the domain.
\cgalHasModelsBegin
\cgalHasModels{CGAL::Construct_initial_points_labeled_image}
\cgalHasModels{CGAL::Construct_initial_points_gray_image}
\cgalHasModelsEnd
\sa `MeshCellCriteria_3`

View File

@ -40,7 +40,8 @@ INPUT += \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_in_image.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Detect_features_on_image_bbox.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_edge_criteria_3.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Construct_initial_points_labeled_image.h
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Construct_initial_points_labeled_image.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/Construct_initial_points_gray_image.h
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Mesh Generation"
HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/implicit_domain_3.jpg \

View File

@ -751,7 +751,7 @@ For the meshing, in the previous example (\ref Mesh_3/mesh_3D_image.cpp), we cal
In the example \ref Mesh_3/mesh_3D_image_with_custom_initialization.cpp,
that call is replaced by:
-# the creation of an empty `%c3t3` object,
-# a call to a non-documented function
-# a call to the function
`initialize_triangulation_from_labeled_image()` that inserts points in
the triangulation,
-# then the call to `refine_mesh_3()`.
@ -761,9 +761,9 @@ that call is replaced by:
The code of the function `initialize_triangulation_from_labeled_image()` is
in the header \ref
CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h. It gets points from
\ref CGAL/Mesh_3/Construct_initial_points_labeled_image.h and insert them
in the triangulation. The code of the Construct_initial_points_labeled_image
function is rather complicated. The following lines show how to insert new
\ref CGAL/Mesh_3/Construct_initial_points_labeled_image.h and inserts them
in the triangulation. The code of the `Construct_initial_points_labeled_image`
functor is rather complicated. The following lines show how to insert new
points in the `%c3t3` object, with the calls to
`MeshVertexBase_3::set_dimension()` and
`MeshVertexBase_3::set_index()`.
@ -836,7 +836,7 @@ CGAL/Mesh_3/initialize_triangulation_from_gray_image.h.
The example \ref Mesh_3/mesh_3D_image_with_initial_points.cpp is another
way to achieve the same results. Instead of a custom initialization,
it uses the parameter `CGAL::parameters::initial_points_generator` for the function
`CGAL::make_mesh_3`. This parameter expect a functor that ouputs points for
`CGAL::make_mesh_3`. This parameter expects a functor that returns a set of points for
the mesh initialization (concept `InitialPointsGenerator`).
\snippet Mesh_3/mesh_3D_image_with_initial_points.cpp Meshing

View File

@ -117,6 +117,7 @@ The following functors are available for feature detection:
The following functors are available for mesh initialization:
- `CGAL::Construct_initial_points_labeled_image`
- `CGAL::Construct_initial_points_gray_image`
\cgalCRPSection{Function Templates}

View File

@ -0,0 +1,76 @@
// Copyright (c) 20XX,20XX GeometryFactory
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Laurent Rineau and Ange Clement
#ifndef CGAL_MESH_3_CONSTRUCT_INITIAL_POINTS_GRAY_IMAGE_H
#define CGAL_MESH_3_CONSTRUCT_INITIAL_POINTS_GRAY_IMAGE_H
#include <CGAL/license/Mesh_3.h>
#include <CGAL/Labeled_mesh_domain_3.h>
#include <CGAL/Mesh_3/Construct_initial_points_labeled_image.h>
#include <CGAL/Image_3.h>
namespace CGAL
{
/*!
* \ingroup PkgMesh3Initializers
*
* Functor for initial points generation in gray images.
* This functor is a model of concept `InitialPointsGenerator`,
* and thus can be passed to `CGAL::make_mesh_3` with the parameter
* `CGAL::parameters::initial_points_generator()`
*
* \sa `CGAL::parameters::initial_points_generator()`
* \sa `CGAL::make_mesh_3()`
*/
template <typename Functor = CGAL::Null_functor>
struct Construct_initial_points_gray_image
{
const CGAL::Image_3 & image_;
double iso_value_;
Functor image_values_to_subdomain_indices_;
template <typename FT>
Construct_initial_points_gray_image(const CGAL::Image_3 & image,
const FT& iso_value,
const Functor image_values_to_subdomain_indices = CGAL::Null_functor())
: image_(image)
, iso_value_(iso_value)
, image_values_to_subdomain_indices_(image_values_to_subdomain_indices)
{ }
/*!
* \brief Constructs the initial points using the gray image.
*
* @tparam OutputIterator an `OutputIterator` of points of type
* `std::pair<MeshDomain::Point_3, MeshDomain::Index>`
* @tparam MeshDomain a model of `MeshDomain_3`
* @tparam C3t3 a model of `MeshComplex_3InTriangulation_3`
*/
template <typename OutputIterator, typename MeshDomain, typename C3t3>
OutputIterator operator()(OutputIterator pts, const MeshDomain& domain, const C3t3& c3t3, int n = 20) const
{
using CGAL::Mesh_3::internal::Create_gray_image_values_to_subdomain_indices;
typedef Create_gray_image_values_to_subdomain_indices<Functor> C_i_v_t_s_i;
typedef typename C_i_v_t_s_i::type Image_values_to_subdomain_indices;
Image_values_to_subdomain_indices transform_fct =
C_i_v_t_s_i()(image_values_to_subdomain_indices_, iso_value_);
Construct_initial_points_labeled_image(image_).operator()(pts, domain, transform_fct, c3t3, n);
return pts;
}
};
} // end namespace CGAL
#endif // CGAL_MESH_3_CONSTRUCT_INITIAL_POINTS_GRAY_IMAGE_H

View File

@ -80,6 +80,7 @@ struct Get_point
*
* \sa `CGAL::parameters::initial_points_generator()`
* \sa `CGAL::make_mesh_3()`
* \sa `CGAL::Construct_initial_points_gray_image()`
*/
struct Construct_initial_points_labeled_image
{
@ -90,7 +91,7 @@ struct Construct_initial_points_labeled_image
{ }
/*!
* \brief operator () The points are constructed using the API of the mesh domain, as follows.
* \brief Constructs the points using the API of the mesh domain, as follows.
* First the functor `construct_intersect` is created
*
* \snippet this construct intersection
@ -112,6 +113,20 @@ struct Construct_initial_points_labeled_image
return pts;
}
/*!
* \brief Same as above, but a `TransformOperator` is used
*
* @tparam OutputIterator an `OutputIterator` of points of type
* `std::pair<MeshDomain::Point_3, MeshDomain::Index>`
* @tparam MeshDomain a model of `MeshDomain_3`
* @tparam TransformOperator a functor to transform values of the image.
* It must provides the following type:<br>
* `result_type`<br>
* and the following operator:<br>
* `template<typename FT>`<br>
* `result_type operator()(FT v)`
* @tparam C3t3 a model of `MeshComplex_3InTriangulation_3`
*/
template <typename OutputIterator, typename MeshDomain, typename C3t3, typename TransformOperator>
OutputIterator operator()(OutputIterator pts, const MeshDomain& domain, TransformOperator transform, const C3t3& c3t3, int n = 20) const
{
@ -179,10 +194,10 @@ struct Construct_initial_points_labeled_image
const double radius = double(seed.radius + 1)* max_v;
CGAL::Random_points_on_sphere_3<Point_3> points_on_sphere_3(radius);
/// [construct intersection]
/// \noop [construct intersection]
typename MeshDomain::Construct_intersection construct_intersection =
domain.construct_intersection_object();
/// [construct intersection]
/// \noop [construct intersection]
std::vector<Vector_3> directions;
if(seed.radius < 2) {
@ -206,16 +221,16 @@ struct Construct_initial_points_labeled_image
const Point_3 test = seed_point + v;
const Segment_3 test_segment = Segment_3(seed_point, test);
/// [use construct intersection]
/// \noop [use construct intersection]
const typename MeshDomain::Intersection intersect =
construct_intersection(test_segment);
/// [use construct intersection]
/// \noop [use construct intersection]
if (std::get<2>(intersect) != 0)
{
/// [get construct intersection]
/// \noop [get construct intersection]
const Point_3& intersect_point = std::get<0>(intersect);
const Index& intersect_index = std::get<1>(intersect);
/// [get construct intersection]
/// \noop [get construct intersection]
Weighted_point pi = Weighted_point(intersect_point);
// This would cause trouble to optimizers

View File

@ -417,12 +417,12 @@ struct C3t3_initializer < C3T3, MD, MC, true, CGAL::Tag_false >
* \cgalParamSectionBegin{Mesh initialization}
* \cgalParamDescription{an `InitialPointsGenerator` can optionally be supplied before the meshing process.
* It must follow the `InitialPointsGenerator` concept.
* The following two named parameters control this option:
* The following named parameter control this option:
* <UL>
* <LI> `parameters::initial_points_generator()`
* <LI> `parameters::default_initial_points_generation()`
* </UL>}
* \cgalParamDefault{`parameters::default_initial_points_generation()`}
* \cgalParamDefault{empty `parameters::initial_points_generator()`, the domain's `construct_initial_points_object()`
* will be called for the points initialization.}
* \cgalParamSectionEnd
* \cgalNamedParamsEnd
*
@ -462,7 +462,7 @@ C3T3 make_mesh_3(const MeshDomain& domain, const MeshCriteria& criteria, const C
parameters::internal::Initial_points_generator_options<MeshDomain, C3T3> initial_points_generator_options_param =
parameters::internal::Initial_points_generator_generator<MeshDomain, C3T3>()
(choose_parameter(get_parameter(np, internal_np::initial_points_generator_options_param), parameters::default_initial_points_generation().v));
(choose_parameter(get_parameter(np, internal_np::initial_points_generator_options_param), parameters::initial_points_generator().v));
make_mesh_3_impl(c3t3, domain, criteria,
exude_param, perturb_param, odt_param, lloyd_param,

View File

@ -373,7 +373,7 @@ features(const MeshDomain& /*domain*/)
// Initial_points_generator_options
// -----------------------------------
inline Named_function_parameters<::CGAL::parameters::internal::Initial_points_generator_options_holder<>, ::CGAL::internal_np::initial_points_generator_options_param_t, CGAL_NP_BASE>
default_initial_points_generation() {
initial_points_generator() {
typedef Named_function_parameters<::CGAL::parameters::internal::Initial_points_generator_options_holder<>, ::CGAL::internal_np::initial_points_generator_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Initial_points_generator_options_holder<>());
}