Added visualization of conflict zone

This commit is contained in:
Andreas Fabri 2008-09-26 16:08:57 +00:00
parent b6aa6d8644
commit a54674e4e3
3 changed files with 178 additions and 36 deletions

View File

@ -16,6 +16,7 @@
// GraphicsView items and event filters (input classes)
#include "TriangulationCircumcircle.h"
#include "TriangulationMovingPoint.h"
#include "TriangulationConflictZone.h"
#include "TriangulationRemoveVertex.h"
#include <CGAL/Qt/GraphicsViewPolylineInput.h>
#include <CGAL/Qt/TriangulationGraphicsItem.h>
@ -45,6 +46,7 @@ private:
CGAL::Qt::VoronoiGraphicsItem<Delaunay> * vgi;
CGAL::Qt::TriangulationMovingPoint<Delaunay> * mp;
CGAL::Qt::TriangulationConflictZone<Delaunay> * cz;
CGAL::Qt::TriangulationRemoveVertex<Delaunay> * trv;
CGAL::Qt::GraphicsViewPolylineInput<K> * pi;
CGAL::Qt::TriangulationCircumcircle<Delaunay> *tcc;
@ -57,6 +59,8 @@ public slots:
void on_actionMovingPoint_toggled(bool checked);
void on_actionShowConflictZone_toggled(bool checked);
void on_actionCircumcenter_toggled(bool checked);
void on_actionShowDelaunay_toggled(bool checked);
@ -127,7 +131,8 @@ MainWindow::MainWindow()
tcc = new CGAL::Qt::TriangulationCircumcircle<Delaunay>(&scene, &dt, this);
tcc->setPen(QPen(Qt::red, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
cz = new CGAL::Qt::TriangulationConflictZone<Delaunay>(&scene, &dt, this);
//
// Manual handling of actions
@ -139,6 +144,8 @@ MainWindow::MainWindow()
QActionGroup* ag = new QActionGroup(this);
ag->addAction(this->actionInsertPoint);
ag->addAction(this->actionMovingPoint);
ag->addAction(this->actionShowCircumcenter);
ag->addAction(this->actionShowConflictZone);
// Check two actions
this->actionInsertPoint->setChecked(true);
@ -211,6 +218,17 @@ MainWindow::on_actionMovingPoint_toggled(bool checked)
}
void
MainWindow::on_actionShowConflictZone_toggled(bool checked)
{
if(checked){
scene.installEventFilter(cz);
} else {
scene.removeEventFilter(cz);
}
}
void
MainWindow::on_actionCircumcenter_toggled(bool checked)
{

View File

@ -18,14 +18,6 @@
<normaloff>:/cgal/logos/cgal_icon</normaloff>:/cgal/logos/cgal_icon</iconset>
</property>
<widget class="QWidget" name="centralwidget" >
<property name="geometry" >
<rect>
<x>0</x>
<y>66</y>
<width>400</width>
<height>209</height>
</rect>
</property>
<layout class="QGridLayout" >
<item row="0" column="0" >
<widget class="QGraphicsView" name="graphicsView" >
@ -45,25 +37,8 @@
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar" >
<property name="geometry" >
<rect>
<x>0</x>
<y>275</y>
<width>400</width>
<height>25</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar" />
<widget class="QToolBar" name="fileToolBar" >
<property name="geometry" >
<rect>
<x>0</x>
<y>29</y>
<width>116</width>
<height>37</height>
</rect>
</property>
<property name="windowTitle" >
<string>File Tools</string>
</property>
@ -78,14 +53,6 @@
<addaction name="actionSavePoints" />
</widget>
<widget class="QToolBar" name="toolBar" >
<property name="geometry" >
<rect>
<x>116</x>
<y>29</y>
<width>284</width>
<height>37</height>
</rect>
</property>
<property name="windowTitle" >
<string>Visualization Tools</string>
</property>
@ -108,7 +75,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>29</height>
<height>19</height>
</rect>
</property>
<widget class="QMenu" name="menuFile" >
@ -136,6 +103,7 @@
<addaction name="actionInsertPoint" />
<addaction name="actionShowDelaunay" />
<addaction name="actionShowVoronoi" />
<addaction name="actionShowConflictZone" />
<addaction name="separator" />
<addaction name="actionRecenter" />
</widget>
@ -307,6 +275,14 @@
<string>Ctrl+R</string>
</property>
</action>
<action name="actionShowConflictZone" >
<property name="checkable" >
<bool>true</bool>
</property>
<property name="text" >
<string>Show Conflict Zone</string>
</property>
</action>
</widget>
<resources>
<include location="Delaunay_triangulation_2.qrc" />

View File

@ -0,0 +1,148 @@
#ifndef CGAL_QT_TRIANGULATION_CONFLICT_ZONE
#define CGAL_QT_TRIANGULATION_CONFLICT_ZONE
#include <CGAL/Qt/GraphicsViewInput.h>
#include <CGAL/Qt/Converter.h>
#include <QGraphicsSceneMouseEvent>
#include <QEvent>
#include <list>
namespace CGAL {
namespace Qt {
template <typename DT>
class TriangulationConflictZone : public GraphicsViewInput
{
public:
typedef typename DT::Geom_traits K;
typedef typename DT::Face_handle Face_handle;
typedef typename DT::Point Point;
TriangulationConflictZone(QGraphicsScene* s, DT * dt_, QObject* parent);
protected:
void localize_and_insert_point(QPointF qt_point);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
bool eventFilter(QObject *obj, QEvent *event);
std::list<Face_handle> faces;
std::list<QGraphicsPolygonItem*> qfaces;
DT * dt;
Converter<K> convert;
QGraphicsScene *scene_;
bool animate;
Face_handle hint;
};
template <typename T>
TriangulationConflictZone<T>::TriangulationConflictZone(QGraphicsScene* s,
T * dt_,
QObject* parent)
: GraphicsViewInput(parent), dt(dt_), scene_(s), animate(false)
{}
template <typename T>
void
TriangulationConflictZone<T>::localize_and_insert_point(QPointF qt_point)
{
Point p(convert(qt_point));
faces.clear();
for(std::list<QGraphicsPolygonItem*>::iterator it = qfaces.begin();
it != qfaces.end();
++it){
delete *it;
}
qfaces.clear();
hint = dt->locate(p, hint);
dt->find_conflicts(p, faces, hint);
for(std::list<Face_handle>::iterator it = faces.begin();
it != faces.end();
++it){
if(! dt->is_infinite(*it)){
QGraphicsPolygonItem *item = new QGraphicsPolygonItem(convert(dt->triangle(*it)));
item->setBrush(::Qt::cyan);
scene_->addItem(item);
qfaces.push_back(item);
}
}
}
template <typename T>
void
TriangulationConflictZone<T>::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if(dt->number_of_vertices() == 0 ||
event->modifiers() != 0 ||
event->button() != ::Qt::LeftButton) {
return;
}
hint = dt->locate(convert(event->scenePos()));
localize_and_insert_point(event->scenePos());
animate = true;
}
template <typename T>
void
TriangulationConflictZone<T>::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(animate){
localize_and_insert_point(event->scenePos());
}
}
template <typename T>
void
TriangulationConflictZone<T>::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
faces.clear();
for(std::list<QGraphicsPolygonItem*>::iterator it = qfaces.begin();
it != qfaces.end();
++it){
delete *it;
}
qfaces.clear();
animate = false;
}
template <typename T>
bool
TriangulationConflictZone<T>::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::GraphicsSceneMousePress) {
QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
mousePressEvent(mouseEvent);
return true;
} else if (event->type() == QEvent::GraphicsSceneMouseMove) {
QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
mouseMoveEvent(mouseEvent);
return false; // do not eat move event!
} else if (event->type() == QEvent::GraphicsSceneMouseRelease) {
QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
mouseReleaseEvent(mouseEvent);
return true;
} else{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
} // namespace Qt
} // namespace CGAL
#endif // CGAL_QT_TRIANGULATION_CONFLICT_ZONE