diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h index 8d561e377f2..38d3c6ec88c 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/distance.h @@ -438,6 +438,7 @@ struct Triangle_structure_sampler_for_triangle_mesh Vpm pmap; double min_sq_edge_length; const Mesh& tm; + CGAL::Random rnd; Triangle_structure_sampler_for_triangle_mesh(const Mesh& m, PointOutputIterator& out, @@ -446,9 +447,12 @@ struct Triangle_structure_sampler_for_triangle_mesh { using parameters::choose_parameter; using parameters::get_parameter; + using parameters::is_default_parameter; pmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, tm)); + if (!(is_default_parameter(get_parameter(np, internal_np::random_seed)))) + rnd = CGAL::Random(choose_parameter(get_parameter(np, internal_np::random_seed),0)); min_sq_edge_length = (std::numeric_limits::max)(); } @@ -549,7 +553,7 @@ struct Triangle_structure_sampler_for_triangle_mesh Randomizer get_randomizer() { - return Randomizer(tm, pmap); + return Randomizer(tm, pmap, rnd); } void internal_sample_triangles(double grid_spacing_, bool smpl_fcs, bool smpl_dgs) @@ -609,6 +613,7 @@ struct Triangle_structure_sampler_for_triangle_soup double min_sq_edge_length; const PointRange& points; const TriangleRange& triangles; + Random rnd; Triangle_structure_sampler_for_triangle_soup(const PointRange& pts, const TriangleRange& trs, @@ -616,7 +621,13 @@ struct Triangle_structure_sampler_for_triangle_soup const NamedParameters& np) : Base(out, np), points(pts), triangles(trs) { + using parameters::choose_parameter; + using parameters::get_parameter; + using parameters::is_default_parameter; + min_sq_edge_length = (std::numeric_limits::max)(); + if (!(is_default_parameter(get_parameter(np, internal_np::random_seed)))) + rnd = CGAL::Random(choose_parameter(get_parameter(np, internal_np::random_seed),0)); } std::pair get_range() @@ -681,7 +692,7 @@ struct Triangle_structure_sampler_for_triangle_soup Randomizer get_randomizer() { - return Randomizer(triangles, points); + return Randomizer(triangles, points, rnd); } void internal_sample_triangles(double distance, bool, bool) @@ -737,6 +748,12 @@ struct Triangle_structure_sampler_for_triangle_soup * \cgalParamExtra{The geometric traits class must be compatible with the vertex point type.} * \cgalParamNEnd * + * \cgalParamNBegin{random_seed} + * \cgalParamDescription{a value to seed the random number generator} + * \cgalParamType{unsigned int} + * \cgalParamDefault{a value generated with `std::time()`} + * \cgalParamNEnd + * * \cgalParamNBegin{use_random_uniform_sampling} * \cgalParamDescription{If `true` is passed, points are generated uniformly at random on faces and/or edges of `tm`. If `do_sample_faces` is `true`, random points will be iteratively generated uniformly at random in the triangle of a face @@ -898,6 +915,12 @@ sample_triangle_mesh(const TriangleMesh& tm, * \cgalParamExtra{The geometric traits class must be compatible with the point range's point type.} * \cgalParamNEnd * + * \cgalParamNBegin{random_seed} + * \cgalParamDescription{a value to seed the random number generator} + * \cgalParamType{unsigned int} + * \cgalParamDefault{a value generated with `std::time()`} + * \cgalParamNEnd + * * \cgalParamNBegin{use_random_uniform_sampling} * \cgalParamDescription{If `true` is passed, points are generated in a random and uniform way * over the triangles of the soup.} diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_distance.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_distance.cpp index c8d1040383d..d3d9fb023f4 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_distance.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/test_pmp_distance.cpp @@ -269,7 +269,7 @@ void general_tests(const TriangleMesh& m1, << "\n"; std::vector samples; - PMP::sample_triangle_mesh(m1, std::back_inserter(samples)); + PMP::sample_triangle_mesh(m1, std::back_inserter(samples), CGAL::parameters::random_seed(0)); std::cout << samples.size()<<" points sampled on mesh."<