mirror of https://github.com/CGAL/cgal
add a random generator on edges of a mesh
This commit is contained in:
parent
3e018b4d1a
commit
1d1b0301fe
|
|
@ -273,6 +273,22 @@ public:
|
|||
{
|
||||
generate_point();
|
||||
}
|
||||
|
||||
template <class Segment_3>
|
||||
Random_points_on_segment_3( const Segment_3& s,
|
||||
Random& rnd = CGAL::get_default_random())
|
||||
// g is an input iterator creating points of type `P' uniformly
|
||||
// distributed on the segment from p to q except q, i.e. `*g' ==
|
||||
// \lambda p + (1-\lambda)\, q where 0 <= \lambda < 1 . A single
|
||||
// random number is needed from `rnd' for each point.
|
||||
: Random_generator_base<P>( (std::max)( (std::max)( (std::max)(to_double(s[0].x()), to_double(s[1].x())),
|
||||
(std::max)(to_double(s[0].y()), to_double(s[1].y()))),
|
||||
(std::max)(to_double(s[0].z()), to_double(s[1].z()))),
|
||||
rnd) , _p(s[0]), _q(s[1])
|
||||
{
|
||||
generate_point();
|
||||
}
|
||||
|
||||
const P& source() const { return _p; }
|
||||
const P& target() const { return _q; }
|
||||
This& operator++() {
|
||||
|
|
@ -373,13 +389,11 @@ struct Random_points_in_triangle_mesh_3
|
|||
typedef typename boost::property_traits<VertexPointMap>::value_type P;
|
||||
typedef Generic_random_point_generator<
|
||||
typename boost::graph_traits <TriangleMesh>::face_descriptor ,
|
||||
CGAL::Property_map_to_unary_function<typename CGAL::Triangle_from_face_descriptor_map<
|
||||
CGAL::Property_map_to_unary_function<CGAL::Triangle_from_face_descriptor_map<
|
||||
TriangleMesh,VertexPointMap> >,
|
||||
Random_points_in_triangle_3<P, Creator> , P> Base;
|
||||
typedef typename CGAL::Triangle_from_face_descriptor_map<
|
||||
TriangleMesh,VertexPointMap> Pmap;
|
||||
typedef typename CGAL::Triangle_from_face_descriptor_map<
|
||||
TriangleMesh,VertexPointMap> Object_from_id_map;
|
||||
TriangleMesh,VertexPointMap> Object_from_id;
|
||||
typedef typename boost::graph_traits<TriangleMesh>::face_descriptor Id;
|
||||
typedef P result_type;
|
||||
typedef Random_points_in_triangle_mesh_3< TriangleMesh, VertexPointMap, Creator> This;
|
||||
|
|
@ -387,14 +401,14 @@ struct Random_points_in_triangle_mesh_3
|
|||
|
||||
Random_points_in_triangle_mesh_3( const TriangleMesh& mesh,Random& rnd = get_default_random())
|
||||
: Base( faces(mesh),
|
||||
CGAL::Property_map_to_unary_function<Pmap>(Pmap(&mesh, get(vertex_point, mesh))),
|
||||
CGAL::Property_map_to_unary_function<Object_from_id>(Object_from_id(&mesh, get(vertex_point, mesh))),
|
||||
internal::Apply_approx_sqrt<typename Kernel_traits<P>::Kernel::Compute_squared_area_3>(),
|
||||
rnd )
|
||||
{
|
||||
}
|
||||
Random_points_in_triangle_mesh_3( const TriangleMesh& mesh, VertexPointMap vpm, Random& rnd = get_default_random())
|
||||
: Base( faces(mesh),
|
||||
CGAL::Property_map_to_unary_function<Pmap>(Pmap(&mesh, vpm)),
|
||||
CGAL::Property_map_to_unary_function<Object_from_id>(Object_from_id(&mesh, vpm)),
|
||||
internal::Apply_approx_sqrt<typename Kernel_traits<P>::Kernel::Compute_squared_area_3>(),
|
||||
rnd )
|
||||
{
|
||||
|
|
@ -414,6 +428,62 @@ struct Random_points_in_triangle_mesh_3
|
|||
}
|
||||
};
|
||||
|
||||
template <class EdgeListGraph,
|
||||
class VertexPointMap = typename boost::property_map<EdgeListGraph,
|
||||
CGAL::vertex_point_t>::const_type,
|
||||
class Creator = Creator_uniform_3<
|
||||
typename Kernel_traits< typename boost::property_traits<VertexPointMap>::value_type >::Kernel::RT,
|
||||
typename boost::property_traits<VertexPointMap>::value_type >
|
||||
>
|
||||
struct Random_points_on_edge_list_graph_3
|
||||
: public Generic_random_point_generator<
|
||||
typename boost::graph_traits <EdgeListGraph>::edge_descriptor,
|
||||
CGAL::Property_map_to_unary_function<CGAL::Segment_from_edge_descriptor_map<
|
||||
EdgeListGraph, VertexPointMap > >,
|
||||
Random_points_on_segment_3<typename boost::property_traits<VertexPointMap>::value_type, Creator>,
|
||||
typename boost::property_traits<VertexPointMap>::value_type>
|
||||
{
|
||||
typedef typename boost::property_traits<VertexPointMap>::value_type P;
|
||||
typedef Generic_random_point_generator<
|
||||
typename boost::graph_traits <EdgeListGraph>::edge_descriptor,
|
||||
CGAL::Property_map_to_unary_function<CGAL::Segment_from_edge_descriptor_map<
|
||||
EdgeListGraph, VertexPointMap > >,
|
||||
Random_points_on_segment_3<P, Creator> , P> Base;
|
||||
typedef typename CGAL::Segment_from_edge_descriptor_map<
|
||||
EdgeListGraph,VertexPointMap> Object_from_id;
|
||||
typedef typename boost::graph_traits<EdgeListGraph>::edge_descriptor Id;
|
||||
typedef P result_type;
|
||||
typedef Random_points_on_edge_list_graph_3< EdgeListGraph, VertexPointMap, Creator> This;
|
||||
|
||||
Random_points_on_edge_list_graph_3( const EdgeListGraph& mesh,Random& rnd = get_default_random())
|
||||
: Base( edges(mesh),
|
||||
CGAL::Property_map_to_unary_function<Object_from_id>(Object_from_id(&mesh, get(vertex_point, mesh))),
|
||||
internal::Apply_approx_sqrt<typename Kernel_traits<P>::Kernel::Compute_squared_length_3>(),
|
||||
rnd )
|
||||
{
|
||||
}
|
||||
Random_points_on_edge_list_graph_3( const EdgeListGraph& mesh, VertexPointMap vpm, Random& rnd = get_default_random())
|
||||
: Base( edges(mesh),
|
||||
CGAL::Property_map_to_unary_function<Object_from_id>(Object_from_id(&mesh, vpm)),
|
||||
internal::Apply_approx_sqrt<typename Kernel_traits<P>::Kernel::Compute_squared_length_3>(),
|
||||
rnd )
|
||||
{
|
||||
}
|
||||
This& operator++() {
|
||||
Base::generate_point();
|
||||
return *this;
|
||||
}
|
||||
This operator++(int) {
|
||||
This tmp = *this;
|
||||
++(*this);
|
||||
return tmp;
|
||||
}
|
||||
double mesh_length() const
|
||||
{
|
||||
return this->sum_of_weights();
|
||||
}
|
||||
};
|
||||
|
||||
namespace internal
|
||||
{
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue