diff --git a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp index 1c7309435d2..c7df02791ad 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polylines_item.cpp @@ -327,6 +327,11 @@ QMenu* Scene_polylines_item::contextMenu() QAction* action = menu->addAction(tr("Display corners with radius...")); connect(action, SIGNAL(triggered()), this, SLOT(change_corner_radii())); + + QAction* actionSmoothPolylines = + menu->addAction(tr("Smooth polylines")); + actionSmoothPolylines->setObjectName("actionSmoothPolylines"); + connect(actionSmoothPolylines, SIGNAL(triggered()),this, SLOT(smooth())); menu->setProperty(prop_name, true); } return menu; diff --git a/Polyhedron/demo/Polyhedron/Scene_polylines_item.h b/Polyhedron/demo/Polyhedron/Scene_polylines_item.h index 7a612ca1d2e..a7ad624c002 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polylines_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polylines_item.h @@ -7,6 +7,7 @@ #include "Scene_item.h" #include +#include #include #include @@ -47,7 +48,28 @@ public: void draw_edges() const; void draw_points() const; - + + void smooth(std::vector& polyline){ + bool is_closed = polyline.front()==polyline.back(); + typedef K::Vector_3 Vector_3; + + std::size_t start = is_closed ? 0:1; + std::size_t end = polyline.size()-1; + + Vector_3 prev = (is_closed ? polyline[end-1] : polyline[0]) - CGAL::ORIGIN; + + for (std::size_t i=start; i!=end; ++i) + { + Vector_3 curr = polyline[i] - CGAL::ORIGIN; + Vector_3 next = polyline[i+1] - CGAL::ORIGIN; + + polyline[i] = CGAL::ORIGIN+(prev+2*curr+next)/4; + prev=curr; + } + + if (is_closed) polyline[end]=polyline[0]; + } + public slots: void change_corner_radii(double); void change_corner_radii(); @@ -55,6 +77,11 @@ public slots: void merge(Scene_polylines_item*); + void smooth(){ + for (Polylines_container::iterator pit=polylines.begin(),pit_end=polylines.end();pit!=pit_end;++pit) + smooth(*pit); + emit itemChanged(); + } public: Polylines_container polylines;