void MainWindow::processInput(CGAL::Object o) { bool was_empty = triang.empty(); Point_2 p; if(CGAL::assign(p, o)) { double dx = triang.domain().xmax() - triang.domain().xmin(); double dy = triang.domain().ymax() - triang.domain().ymin(); p = Point_2(p.x()- std::floor(p.x()/dx), p.y()- std::floor(p.y()/dy)); triang.insert(p); } Q_EMIT( changed()); if (was_empty) on_actionRecenter_triggered(); }
void MainWindow::on_actionGenerate_triggered() { stream_lines = new Stream_lines(*regular_grid, *runge_kutta_integrator, density, ratio, sampling); sli = new CGAL::Qt::StreamLinesGraphicsItem<Stream_lines, K>(stream_lines); rgi = new CGAL::Qt::RegularGridVectorFieldGraphicsItem<Regular_grid, K>(regular_grid); QObject::connect(this, SIGNAL(changed()), sli, SLOT(modelChanged())); rgi->setVerticesPen(QPen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); rgi->setEdgesPen(QPen(Qt::gray, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); sli->setEdgesPen(QPen(Qt::blue, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); scene.addItem(sli); scene.addItem(rgi); on_actionRecenter_triggered(); emit(changed()); }
void MainWindow::on_actionInsertRandomPoints_triggered() { CGAL::Random_points_in_iso_rectangle_2<Point_2> pg((triang.domain().min)(), (triang.domain().max)()); bool ok = false; const int number_of_points = QInputDialog::getInt(this, tr("Number of random points"), tr("Enter number of random points"), 250, 0, (std::numeric_limits<int>::max)(), 1, &ok); if(!ok) { return; } // wait cursor QApplication::setOverrideCursor(Qt::WaitCursor); std::vector<Point_2> points; points.reserve(number_of_points); for(int i = 0; i < number_of_points; ++i){ points.push_back(*pg++); } triang.insert(points.begin(), points.end(), true); // default cursor QApplication::restoreOverrideCursor(); on_actionRecenter_triggered(); Q_EMIT( changed()); }
MainWindow::MainWindow() : DemosMainWindow() { setupUi(this); this->graphicsView->setAcceptDrops(false); // Add a GraphicItem for the Periodic triangulation pt_gi = new CGAL::Qt::PeriodicTriangulationGraphicsItem<Periodic_DT>(&triang); QObject::connect(this, SIGNAL(changed()), pt_gi, SLOT(modelChanged())); pt_gi->setVerticesPen(QPen(Qt::red, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); scene.addItem(pt_gi); // Add a GraphicItem for the Voronoi diagram vgi = new CGAL::Qt::PeriodicTriangulationVoronoiGraphicsItem<Periodic_DT>(&triang); QObject::connect(this, SIGNAL(changed()), vgi, SLOT(modelChanged())); vgi->setEdgesPen(QPen(Qt::blue, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); scene.addItem(vgi); vgi->hide(); // Setup input handlers. They get events before the scene gets them // and the input they generate is passed to the triangulation with // the signal/slot mechanism pt_pi = new CGAL::Qt::TriangulationPointInputAndConflictZone<Periodic_DT>(&scene, &triang, this ); QObject::connect(pt_pi, SIGNAL(generate(CGAL::Object)), this, SLOT(processInput(CGAL::Object))); pt_mp = new CGAL::Qt::TriangulationMovingPoint<Periodic_DT>(&triang, this); // TriangulationMovingPoint<Periodic_DT> emits a modelChanged() signal each // time the moving point moves. // The following connection is for the purpose of emitting changed(). QObject::connect(pt_mp, SIGNAL(modelChanged()), this, SIGNAL(changed())); pt_cz = new CGAL::Qt::TriangulationConflictZone<Periodic_DT>(&scene, &triang, this); QObject::connect(pt_cz, SIGNAL(modelChanged()), this, SIGNAL(changed())); pt_rv = new CGAL::Qt::TriangulationRemoveVertex<Periodic_DT>(&triang, this); QObject::connect(pt_rv, SIGNAL(modelChanged()), this, SIGNAL(changed())); pt_cc = new CGAL::Qt::TriangulationCircumcircle<Periodic_DT>(&scene, &triang, this); pt_cc ->setPen(QPen(::Qt::black, .01)); QObject::connect(pt_cc, SIGNAL(modelChanged()), this, SIGNAL(changed())); // // Manual handling of actions // QObject::connect(this->actionQuit, SIGNAL(triggered()), this, SLOT(close())); // We put mutually exclusive actions in an QActionGroup QActionGroup* ag = new QActionGroup(this); ag->addAction(this->actionInsertPoint); ag->addAction(this->actionMovingPoint); ag->addAction(this->actionCircumcenter); ag->addAction(this->actionShowConflictZone); // Check two actions this->actionInsertPoint->setChecked(true); this->actionShowDelaunay->setChecked(true); // // Setup the scene and the view // scene.setItemIndexMethod(QGraphicsScene::NoIndex); scene.setSceneRect(0, 0, 1, 1); this->graphicsView->setScene(&scene); this->graphicsView->setMouseTracking(true); // Turn the vertical axis upside down this->graphicsView->matrix().scale(1, -1); // The navigation adds zooming and translation functionality to the // QGraphicsView this->addNavigation(this->graphicsView); this->setupStatusBar(); this->setupOptionsMenu(); this->addAboutDemo(":/cgal/help/about_Periodic_2_triangulation_2.html"); this->addAboutCGAL(); this->addRecentFiles(this->menuFile, this->actionQuit); connect(this, SIGNAL(openRecentFile(QString)), this, SLOT(open(QString))); on_actionRecenter_triggered(); }