#ifndef CGAL_QT_TRIANGULATION_CIRCUMCIRCLE_H #define CGAL_QT_TRIANGULATION_CIRCUMCIRCLE_H #include #include #include #include #include #include #include namespace CGAL { namespace Qt { template class TriangulationCircumcircle : public GraphicsViewInput { public: TriangulationCircumcircle(QGraphicsScene* s, DT * dt_, QObject* parent); ~TriangulationCircumcircle(); void setPen(const QPen& pen); void show(); void hide(); protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); bool eventFilter(QObject *obj, QEvent *event); private: DT * dt; typedef typename DT::Vertex_handle Vertex_handle; typename DT::Vertex_handle hint; typename DT::Face_handle fh; QGraphicsScene *scene_; QGraphicsEllipseItem* circle; }; template TriangulationCircumcircle::TriangulationCircumcircle(QGraphicsScene* s, T * dt_, QObject* parent) : GraphicsViewInput(parent), dt(dt_), scene_(s) { hint = dt->infinite_vertex(); circle = new QGraphicsEllipseItem(); circle->hide(); scene_->addItem(circle); } template TriangulationCircumcircle::~TriangulationCircumcircle() { } template void TriangulationCircumcircle::setPen(const QPen& pen) { circle->setPen(pen); } template void TriangulationCircumcircle::show() { circle->show(); } template void TriangulationCircumcircle::hide() { circle->hide(); } template void TriangulationCircumcircle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(dt->dimension() != 2){ circle->hide(); hint = Vertex_handle(); return; } if (hint == Vertex_handle()){ hint = dt->infinite_vertex(); } typename T::Point p = typename T::Point(event->scenePos().x(), event->scenePos().y()); fh = dt->locate(p, hint->face()); hint = fh->vertex(0); if(!dt->is_infinite(fh)){ typename T::Geom_traits::Circle_2 c(fh->vertex(0)->point(), fh->vertex(1)->point(), fh->vertex(2)->point()); CGAL::Bbox_2 bb = c.bbox(); circle->setRect(bb.xmin(), bb.ymin(), bb.xmax()-bb.xmin(), bb.ymax()-bb.ymin()); circle->show(); } else { circle->hide(); } } template bool TriangulationCircumcircle::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::GraphicsSceneMouseMove) { QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); mouseMoveEvent(mouseEvent); return false; // don't consume the event } else{ // standard event processing return QObject::eventFilter(obj, event); } } } // namespace Qt } // namespace CGAL #endif // CGAL_QT_TRIANGULATION_CIRCUMCIRCLE_H