add Pierre's polyline smoother in item context menu

This commit is contained in:
Sébastien Loriot 2012-09-12 07:34:15 +00:00
parent faa00e3d9e
commit a18b9ee368
2 changed files with 33 additions and 1 deletions

View File

@ -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;

View File

@ -7,6 +7,7 @@
#include "Scene_item.h"
#include <QString>
#include <QMenu>
#include <list>
#include <vector>
@ -47,7 +48,28 @@ public:
void draw_edges() const;
void draw_points() const;
void smooth(std::vector<Point_3>& 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;