diff --git a/Generator/examples/Generator/random_points_in_triangles_2.cpp b/Generator/examples/Generator/random_points_in_triangles_2.cpp new file mode 100644 index 00000000000..3332408ea08 --- /dev/null +++ b/Generator/examples/Generator/random_points_in_triangles_2.cpp @@ -0,0 +1,36 @@ +#include +#include + +#include +#include +using namespace CGAL; +typedef Simple_cartesian K; +typedef K::Point_2 Point; + + +int main() +{ + // Generated points are in that vector + std::vector points; + // Create input triangles + std::vector triangles; + for(int i=0; i< 5; ++i) + { + triangles.push_back(K::Triangle_2(Point(i,0), Point(i+1,0), Point(i+0.5,1))); + } + + // Create the generator, input is the vector of Triangle_2 + Random_points_in_triangles_2 g(triangles); + // Get 100 random points in cdt + CGAL::cpp11::copy_n(g, 1000, std::back_inserter(points)); + + // Check that we have really created 100 points. + assert( points.size() == 1000); + + // print the first point that was generated + std::cout << points[0] << std::endl; + + return 0; +} + + diff --git a/Generator/include/CGAL/point_generators_2.h b/Generator/include/CGAL/point_generators_2.h index 5d61de79788..52fc3be45fe 100644 --- a/Generator/include/CGAL/point_generators_2.h +++ b/Generator/include/CGAL/point_generators_2.h @@ -1,4 +1,4 @@ -// Copyright (c) 1997 +// Copyright (c) 1997 // Utrecht University (The Netherlands), // ETH Zurich (Switzerland), // INRIA Sophia-Antipolis (France), @@ -595,6 +595,66 @@ public: } }; +namespace internal +{ +template +class Deref +{ +public: + typedef typename std::iterator_traits::value_type result_type; + typename std::iterator_traits::value_type operator()(T triangle)const + { + return *triangle; + } +}; + +template +struct Address_of{ + typedef const A* result_type; + const A* operator()(const A& a) const + { + return &a; + } +}; + +}//namesapce internal + +template +class Random_points_in_triangles_2 : public Generic_random_point_generator< + const typename Kernel_traits::Kernel::Triangle_2*, + internal::Deref::Kernel::Triangle_2*>, + Random_points_in_triangle_2 , + Point_2> { +public: + typedef typename Kernel_traits::Kernel::Triangle_2 Triangle_2; + typedef Generic_random_point_generator< + const typename Kernel_traits::Kernel::Triangle_2*, + internal::Deref, + Random_points_in_triangle_2 ,Point_2> Base; + typedef const Triangle_2* Id; + typedef Point_2 result_type; + typedef Random_points_in_triangles_2 This; + + template + Random_points_in_triangles_2( const TriangleRange& triangles, Random& rnd = default_random) + : Base(make_range( boost::make_transform_iterator(triangles.begin(), internal::Address_of()), + boost::make_transform_iterator(triangles.end(), internal::Address_of()) ), + internal::Deref(), + typename Kernel_traits::Kernel::Compute_area_2() + ,rnd ) + { + } + This& operator++() { + Base::generate_point(); + return *this; + } + This operator++(int) { + This tmp = *this; + ++(*this); + return tmp; + } +}; + } //namespace CGAL #endif // CGAL_POINT_GENERATORS_2_H // // EOF // diff --git a/Generator/include/CGAL/point_generators_3.h b/Generator/include/CGAL/point_generators_3.h index 53dfdbdade5..fd05031ba74 100644 --- a/Generator/include/CGAL/point_generators_3.h +++ b/Generator/include/CGAL/point_generators_3.h @@ -469,27 +469,6 @@ public: } }; -namespace internal -{ -template -class Deref -{ -public: - typedef typename std::iterator_traits::value_type result_type; - typename std::iterator_traits::value_type operator()(T triangle)const - { - return *triangle; - } -}; -template -struct Address_of{ - typedef const A* result_type; - const A* operator()(const A& a) const - { - return &a; - } -}; -}//namesapce internal template class Random_points_on_triangles_3 : public Generic_random_point_generator< diff --git a/Generator/test/Generator/generic_random_test.cpp b/Generator/test/Generator/generic_random_test.cpp index 78b6e559a75..df92f9fdf75 100644 --- a/Generator/test/Generator/generic_random_test.cpp +++ b/Generator/test/Generator/generic_random_test.cpp @@ -30,6 +30,40 @@ typedef CGAL::Polygon_2 Polygon_2; using namespace CGAL; +int test_triangles_2() +{ + typedef K::Point_2 Point; + + // Generated points are in that vector + std::vector points; + // Create input triangles + std::vector triangles; + triangles.push_back(K::Triangle_2(Point(0,0), Point(0.5,0), Point(0,0.5))); + triangles.push_back(K::Triangle_2(Point(0,0.5), Point(0.5,0), Point(0.5,0.5))); + + // Create the generator, input is the vector of Triangle_2 + Random_points_in_triangles_2 g(triangles); + // Get 100 random points in triangle range + CGAL::cpp11::copy_n(g, 100, std::back_inserter(points)); + + // Check that we have really created 100 points. + assert( points.size() == 100); + + BOOST_FOREACH(Point p, points) + { + bool on_quad = p.x() > -0.01 && p.x() < 0.51 + && p.y() > -0.01 && p.y() < 0.51; + if(!on_quad) + { + std::cerr< g(triangles); - // Get 100 random points in cdt + // Get 100 random points in triangle range CGAL::cpp11::copy_n(g, 100, std::back_inserter(points)); // Check that we have really created 100 points. @@ -236,8 +270,9 @@ main( ) int validity = - test_triangles_3() - *test_volume_mesh(polyhedron) + test_triangles_2() + *test_triangles_3() + *test_volume_mesh(polyhedron) *test_T2() *test_on_c3t3(polyhedron) *test_in_c3t3(polyhedron)