diff --git a/Kernel_23/include/CGAL/internal/Projection_traits_3.h b/Kernel_23/include/CGAL/internal/Projection_traits_3.h index 67e2760cfe2..0f15a7e084f 100644 --- a/Kernel_23/include/CGAL/internal/Projection_traits_3.h +++ b/Kernel_23/include/CGAL/internal/Projection_traits_3.h @@ -248,6 +248,8 @@ public: typedef typename R::Point_2 Point_2; typedef typename R::Line_3 Line_3; typedef typename R::Line_2 Line_2; + typedef typename R::Segment_3 Segment_3; + typedef typename R::Segment_2 Segment_2; typedef typename R::FT RT; typename R::FT x(const Point_3 &p) const { return Projector::x(p); } typename R::FT y(const Point_3 &p) const { return Projector::y(p); } @@ -270,6 +272,13 @@ public: Line_2 l2(project(l.point(0)), project(l.point(1))); return squared_distance(p2, l2); } + + RT operator()(const Segment_3& s, const Point_3& p) const + { + Point_2 p2(project(p)); + Segment_2 s2(project(s.source()), project(s.target())); + return squared_distance(p2, s2); + } }; template diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt b/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt index 04d89c86104..d094507e9e2 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/Polyline_simplification_2.txt @@ -196,6 +196,12 @@ At the end we remove the points that were kept from the constraints. \cgalExample{Polyline_simplification_2/points_and_vertices.cpp} +\subsection Subsection_PolylineSimplification_Terrain Simplification of a Terrain + +It is possible to use the class `Projection_traits_xy_3` in order to simplify polylines in space. +Note that the segment length is computed in the xy-plane, and the polyline must not have any vertical segment. + +\cgalExample{Polyline_simplification_2/simplify_terrain.cpp} \section Section_PolylineSimplification_History Design and Implementation History diff --git a/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt b/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt index de187d52b28..a0713d4fd20 100644 --- a/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt +++ b/Polyline_simplification_2/doc/Polyline_simplification_2/examples.txt @@ -1,5 +1,6 @@ /*! \example Polyline_simplification_2/simplify_polygon.cpp \example Polyline_simplification_2/simplify.cpp +\example Polyline_simplification_2/simplify_terrain.cpp \example Polyline_simplification_2/points_and_vertices.cpp */ diff --git a/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cin b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cin new file mode 100644 index 00000000000..37ac2bedd1c --- /dev/null +++ b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cin @@ -0,0 +1 @@ +4 0 0 0 1 0 0 2 4 0 3 10 0 diff --git a/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cpp b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cpp new file mode 100644 index 00000000000..4ba1a4d41d7 --- /dev/null +++ b/Polyline_simplification_2/examples/Polyline_simplification_2/simplify_terrain.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace PS = CGAL::Polyline_simplification_2; + +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic; +typedef CGAL::Projection_traits_xy_3 K; +typedef CGAL::Polygon_2 Polygon_2; + +typedef PS::Vertex_base_2 Vb; +typedef CGAL::Constrained_triangulation_face_base_2 Fb; +typedef CGAL::Triangulation_data_structure_2 TDS; +typedef CGAL::Constrained_Delaunay_triangulation_2 CDT; +typedef CGAL::Constrained_triangulation_plus_2 CT; +typedef CT::Point Point; +typedef CT::Constraint_iterator Constraint_iterator; +typedef CT::Vertices_in_constraint_iterator Vertices_in_constraint_iterator; +typedef CT::Points_in_constraint_iterator Points_in_constraint_iterator; +typedef PS::Stop_below_count_ratio_threshold Stop; +typedef PS::Squared_distance_cost Cost; + +int main() +{ + CT ct; + Polygon_2 P; + while(std::cin >> P){ + ct.insert_constraint(P); + } + PS::simplify(ct, Cost(), Stop(0.5)); + + for(Constraint_iterator cit = ct.constraints_begin(); + cit != ct.constraints_end(); + ++cit) { + std::cout << "simplified polyline" << std::endl; + for(Points_in_constraint_iterator vit = + ct.points_in_constraint_begin(*cit); + vit != ct.points_in_constraint_end(*cit); + ++vit) + std::cout << *vit << std::endl; + } + return 0; +} + +