From b23c64a6791c3f7f8e6be47f0cd7dd4f3a4954b1 Mon Sep 17 00:00:00 2001 From: Iordan Iordanov Date: Thu, 16 Jun 2016 12:21:30 +0200 Subject: [PATCH] First working GUI demo of the periodic hyperbolic Delaunay triangulation. For the time being the working features are initialization with dummy points, point insertion, random point insertion, clear() and circumsenter visualization. --- .../CMakeLists.txt | 15 +- ...perbolic_Delaunay_triangulation_2_demo.cpp | 458 ++++++++++++++++++ .../icons/CGAL.qrc | 10 + .../icons/about_CGAL.html | 8 + .../icons/cgal_logo.xpm | 24 + .../icons/circumcenter.png | Bin 0 -> 3862 bytes .../icons/fileNew.png | Bin 0 -> 768 bytes .../icons/fileOpen.png | Bin 0 -> 1662 bytes .../icons/fileSave.png | Bin 0 -> 1205 bytes .../icons/triangulation.png | Bin 0 -> 7547 bytes .../res.qrc | 6 + .../Hyperbolic_octagon_translation_matrix.h | 23 +- .../CGAL/Hyperbolic_random_points_in_disc_2.h | 2 +- ...ic_4_hyperbolic_Delaunay_triangulation_2.h | 214 +++++++- ...perbolic_Delaunay_triangulation_traits_2.h | 4 +- .../Periodic_4_hyperbolic_triangulation_2.h | 155 +++--- ..._hyperbolic_triangulation_ds_face_base_2.h | 25 +- .../CGAL/Qt/TriangulationCircumcircle.h | 32 +- .../CGAL/Qt/TriangulationConflictZone.h | 2 +- .../TriangulationGraphicsItemWithColorInfo.h | 61 ++- .../CGAL/Qt/TriangulationMovingPoint.h | 8 +- .../TriangulationPointInputAndConflictZone.h | 37 +- .../CGAL/Qt/TriangulationRemoveVertex.h | 4 +- 23 files changed, 928 insertions(+), 160 deletions(-) create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.cpp create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/CGAL.qrc create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/about_CGAL.html create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/cgal_logo.xpm create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/circumcenter.png create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/fileNew.png create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/fileOpen.png create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/fileSave.png create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/triangulation.png create mode 100644 Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/res.qrc diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt index b06e74bdb92..e77f8d280fd 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/CMakeLists.txt @@ -7,14 +7,14 @@ project (Playground) set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. -#set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOMOC ON) cmake_minimum_required(VERSION 2.8.11) if(POLICY CMP0043) cmake_policy(SET CMP0043 OLD) endif() -find_package(CGAL QUIET COMPONENTS Core) +find_package(CGAL QUIET COMPONENTS Core Qt5) include(${CGAL_USE_FILE}) find_package(Qt5 QUIET COMPONENTS Widgets) @@ -22,21 +22,22 @@ find_package(Qt5 QUIET COMPONENTS Widgets) find_package( Boost REQUIRED ) include_directories(${Boost_INCLUDE_DIRS}) -include_directories (BEFORE ../../../Hyperbolic_triangulation_2/include ../../../Hyperbolic_triangulation_2/demo/Hyperbolic_triangulation_2/include ../../include include) +include_directories (BEFORE ../../include include) # ui files, created with Qt Designer -#qt5_wrap_ui( uis Periodic_4_hyperbolic_triangulation_2.ui ) +qt5_wrap_ui( uis Periodic_4_hyperbolic_Delaunay_triangulation_2.ui ) # qrc files (resources files, that contain icons, at least) -#qt5_add_resources ( RESOURCE_FILES resources/Periodic_4_hyperbolic_triangulation_2.qrc ) +qt5_add_resources ( RESOURCE_FILES res.qrc ) # cpp files add_executable ( Playground playground.cpp ) add_executable ( Triangulation triangulation.cpp ) -#qt5_use_modules( Playground Widgets ) +add_executable ( Demo Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.cpp ${RESOURCE_FILES} ) +qt5_use_modules( Demo Widgets ) target_link_libraries( Playground ${CGAL_LIBRARIES} ) target_link_libraries( Triangulation ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ${Boost_LIBRARIES} ) - +target_link_libraries( Demo ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} ${Boost_LIBRARIES} ) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.cpp b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.cpp new file mode 100644 index 00000000000..d2cacbd06c7 --- /dev/null +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.cpp @@ -0,0 +1,458 @@ +#include + +// CGAL headers +#include +#include +#include +#include +#include + +// unique words +#include +// to be deleted (iiordano: why?) +#include +// for viewportsBbox +#include + +// Qt headers +#include +#include +#include +#include +#include +#include + +// for filtering +#include +#include + +// GraphicsView items and event filters (input classes) +#include +#include +#include +#include +#include +#include +#include // Visualise color +//#include // Store color +#include + + +#include +#include + +#define INITIAL_RECURSION_DEPTH 4 + +// dummy points +#include + +// the two base classes +#include "ui_Periodic_4_hyperbolic_Delaunay_triangulation_2.h" + + + +typedef CORE::Expr NT; +typedef CGAL::Cartesian Kernel; +typedef CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_traits_2 Traits; +typedef CGAL::Periodic_4_hyperbolic_Delaunay_triangulation_2 Triangulation; +typedef Hyperbolic_octagon_translation_matrix Octagon_matrix; +typedef Kernel::Point_2 Point; +typedef Triangulation::Vertex_handle Vertex_handle; +typedef Traits::Side_of_fundamental_octagon Side_of_fundamental_octagon; + + +struct PointsComparator { + static double eps; + + bool operator() (const Point& l, const Point& r) const + { + if(l.x() < r.x() - eps) { + return true; + } + if(l.x() < r.x() + eps) { + if(l.y() < r.y() - eps) { + return true; + } + } + return false; + } +}; + + +double PointsComparator::eps = 0.0001; +string glabels[] = { "a", "\\bar{b}", "c", "\\bar{d}", "\\bar{a}", "b", "\\bar{c}", "d" }; + + +void recurr(vector& v, vector g, int depth = 1) { + if (depth > 1) { + + recurr(v, g, depth-1); + + vector tmp; + vector tmpw; + for (int i = 0; i < v.size(); i++) { + tmp.push_back(v[i]); + } + + for (int i = 0; i < tmp.size(); i++) { + for (int j = 0; j < g.size(); j++) { + v.push_back(tmp[i]*g[j]); + } + } + } else if (depth == 1) { + for (int i = 0; i < g.size(); i++) { + v.push_back(g[i]); + } + } +} + + +void my_unique_words(std::vector& p, Point input, int depth) { + std::vector g; + get_generators(g); + std::vector v; + recurr(v, g, depth); + std::set s; + + for (int i = 0; i < v.size(); i++) { + s.insert( v[i] ); + } + + cout << "Translating... " << endl; + for (set::iterator it = s.begin(); it != s.end(); it++) { + Octagon_matrix m = *it; + Point res; + res = m.apply(input); + p.push_back( res ); + } + cout << "Done! Now I need to draw " << p.size() << " points..." << endl; + +} + + + + +class MainWindow : + public CGAL::Qt::DemosMainWindow, + public Ui::Periodic_4_hyperbolic_Delaunay_triangulation_2 +{ + Q_OBJECT + +private: + + + int cidx; + std::vector ccol; + bool dummy_mode; + + Triangulation dt; + QGraphicsEllipseItem * disk; + QGraphicsScene scene; + + CGAL::Qt::TriangulationGraphicsItem * dgi; + + + // for drawing Voronoi diagram of the orbit of the origin + + CGAL::Qt::TriangulationMovingPoint * mp; + CGAL::Qt::TriangulationRemoveVertex * trv; + CGAL::Qt::TriangulationPointInputAndConflictZone * pi; + CGAL::Qt::TriangulationCircumcircle * tcc; +public: + MainWindow(); + +public slots: + + void processInput(CGAL::Object o); + + void on_actionCircumcenter_toggled(bool checked); + + void on_actionShowTriangulation_toggled(bool checked); + + void on_actionInsertPoint_toggled(bool checked); + + void on_actionInsertRandomPoints_triggered(); + + void on_actionLoadPoints_triggered(); + + void on_actionClear_triggered(); + + void on_actionRecenter_triggered(); + + +signals: + void changed(); +}; + + +MainWindow::MainWindow() + : DemosMainWindow(), dt(Traits(1)) +{ + + dt.insert_dummy_points(); + + cidx = 0; + for (int i = 0; i < 14; i++) + ccol.push_back(i); + + setupUi(this); + + this->graphicsView->setAcceptDrops(false); + + // Add Poincaré disk + qreal origin_x = 0, origin_y = 0, radius = 1, diameter = 2*radius; + qreal left_top_corner_x = origin_x - radius; + qreal left_top_corner_y = origin_y - radius; + qreal width = diameter, height = diameter; + + // set background + qreal eps = 0.01; + QGraphicsRectItem* rect = new QGraphicsRectItem(left_top_corner_x - eps, left_top_corner_y - eps, width + 2*eps, height + 2*eps); + rect->setPen(Qt::NoPen); + rect->setBrush(Qt::white); + scene.addItem(rect); + + // set disk + disk = new QGraphicsEllipseItem(left_top_corner_x, left_top_corner_y, width, height); + QPen pen; // creates a default pen + pen.setWidth(0); + //pen.setBrush(Qt::black); + pen.setBrush(Qt::black); + disk->setPen(pen); + + scene.addItem(disk); + + // Add a GraphicItem for the Triangulation triangulation + dgi = new CGAL::Qt::TriangulationGraphicsItem(&dt); + + QObject::connect(this, SIGNAL(changed()), + dgi, SLOT(modelChanged())); + + dgi->setVerticesPen(QPen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + dgi->setEdgesPen(QPen(QColor(200, 200, 0), 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + scene.addItem(dgi); + + // 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 + pi = new CGAL::Qt::TriangulationPointInputAndConflictZone(&scene, &dt, this ); + + QObject::connect(pi, SIGNAL(generate(CGAL::Object)), + this, SLOT(processInput(CGAL::Object))); + + mp = new CGAL::Qt::TriangulationMovingPoint(&dt, this); + // TriangulationMovingPoint emits a modelChanged() signal each + // time the moving point moves. + // The following connection is for the purpose of emitting changed(). + QObject::connect(mp, SIGNAL(modelChanged()), + this, SIGNAL(changed())); + + trv = new CGAL::Qt::TriangulationRemoveVertex(&dt, this); + QObject::connect(trv, SIGNAL(modelChanged()), + this, SIGNAL(changed())); + + tcc = new CGAL::Qt::TriangulationCircumcircle(&scene, &dt, this); + tcc->setPen(QPen(Qt::blue, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + + //cz = new CGAL::Qt::TriangulationConflictZone(&scene, &dt, this); + + // + // 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->actionCircumcenter); + + // Check two actions + this->actionInsertPoint->setChecked(true); + this->actionShowTriangulation->setChecked(true); + + // // + // // Setup the scene and the view + // // + scene.setItemIndexMethod(QGraphicsScene::NoIndex); + scene.setSceneRect(left_top_corner_x, left_top_corner_y, width, height); + this->graphicsView->setScene(&scene); + this->graphicsView->setMouseTracking(true); + this->graphicsView->shear(230, 230); + this->graphicsView->rotate(90); + + // // The navigation adds zooming and translation functionality to the + // // QGraphicsView + this->addNavigation(this->graphicsView); + this->setupStatusBar(); + this->setupOptionsMenu(); + this->addAboutDemo(":/cgal/help/about_Triangulation_triangulation_2.html"); + this->addAboutCGAL(); + + //this->addRecentFiles(this->menuFile, this->actionQuit); + //connect(this, SIGNAL(openRecentFile(QString)), + // this, SLOT(open(QString))); + + +} + + +void +MainWindow::processInput(CGAL::Object o) +{ + + Point p; + if(CGAL::assign(p, o)){ + Vertex_handle v = dt.insert(p); + } + emit(changed()); + assert(dt.is_valid()); + +} + + + + + +/* + * Qt Automatic Connections + * http://doc.trolltech.com/4.4/designer-using-a-component.html#automatic-connections + * + * setupUi(this) generates connections to the slots named + * "on__" + */ +void +MainWindow::on_actionInsertPoint_toggled(bool checked) +{ + if(checked){ + scene.installEventFilter(pi); + scene.installEventFilter(trv); + } else { + scene.removeEventFilter(pi); + scene.removeEventFilter(trv); + } +} + + + +void +MainWindow::on_actionCircumcenter_toggled(bool checked) +{ + if(checked){ + scene.installEventFilter(tcc); + tcc->show(); + } else { + scene.removeEventFilter(tcc); + tcc->hide(); + } +} + + + +void +MainWindow::on_actionShowTriangulation_toggled(bool checked) +{ + dgi->setVisibleEdges(checked); +} + + + +void +MainWindow::on_actionClear_triggered() +{ + dt.clear(); + dt.insert_dummy_points(); + emit(changed()); +} + + +void +MainWindow::on_actionInsertRandomPoints_triggered() +{ + bool ok = false; + const int number_of_points = + QInputDialog::getInt(this, + tr("Number of random points"), + tr("Enter number of random points"), + 100, + 0, + std::numeric_limits::max(), + 1, + &ok); + + if(!ok) { + return; + } + + // wait cursor + QApplication::setOverrideCursor(Qt::WaitCursor); + + vector pts; + pts.reserve(number_of_points); + + typedef CGAL::Creator_uniform_2 Creator; + + CGAL::Random_points_in_disc_2 g( 1.0 ); + CGAL::cpp11::copy_n( g, number_of_points, std::back_inserter(pts)); + + for(int i = 0; i < number_of_points; ++i){ + processInput(make_object(pts[i])); + } + QApplication::restoreOverrideCursor(); + emit(changed()); +} + + +void +MainWindow::on_actionLoadPoints_triggered() +{ + QString fileName = QFileDialog::getOpenFileName(this, + tr("Open Points file"), + "."); + if(! fileName.isEmpty()){ + //open(fileName); + } +} + + + +void +MainWindow::on_actionRecenter_triggered() +{ + this->graphicsView->setSceneRect(dgi->boundingRect()); + this->graphicsView->fitInView(dgi->boundingRect(), Qt::KeepAspectRatio); +} + + +#include "Periodic_4_hyperbolic_Delaunay_triangulation_2_demo.moc" + +int main(int argc, char **argv) +{ + + QApplication app(argc, argv); + + Q_INIT_RESOURCE(res); + + app.setOrganizationDomain("geometryfactory.com"); + app.setOrganizationName("GeometryFactory"); + app.setApplicationName("Periodic_4_hyperbolic_Delaunay_triangulation_2 demo"); + + // Import resources from libCGALQt4. + // See http://doc.trolltech.com/4.4/qdir.html#Q_INIT_RESOURCE + //Q_INIT_RESOURCE(File); + //Q_INIT_RESOURCE(Triangulation_2); + //Q_INIT_RESOURCE(Input); + //Q_INIT_RESOURCE(CGAL); + + MainWindow mainWindow; + mainWindow.show(); + + QStringList args = app.arguments(); + args.removeAt(0); + //Q_FOREACH(QString filename, args) { + //mainWindow.open(filename); + //} + + return app.exec(); +} diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/CGAL.qrc b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/CGAL.qrc new file mode 100644 index 00000000000..ef08023c288 --- /dev/null +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/CGAL.qrc @@ -0,0 +1,10 @@ + + + about_CGAL.html + + + cgal_logo_ipe_2013.png + cgal_logo_ipe_2013.png + cgal_logo.xpm + + diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/about_CGAL.html b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/about_CGAL.html new file mode 100644 index 00000000000..6b2b2a5d943 --- /dev/null +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/about_CGAL.html @@ -0,0 +1,8 @@ + + +

+

Computational Geometry Algorithms Library

+

CGAL provides efficient and reliable geometric algorithms in the form of a C++ library.

+

For more information visit www.cgal.org

+ + diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/cgal_logo.xpm b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/cgal_logo.xpm new file mode 100644 index 00000000000..6a69b3d67e1 --- /dev/null +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/cgal_logo.xpm @@ -0,0 +1,24 @@ +/* XPM */ +const char * demoicon_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 3 1", +" c None", +". c #FFFF00", +"+ c #000000", +/* pixels */ +"................", +"...++++...++++..", +"..+....+.+....+.", +"..+......+......", +"..+......+..+++.", +"..+......+....+.", +"..+....+.+....+.", +"...++++...++++..", +"................", +"...++++...+.....", +"..+....+..+.....", +"..+....+..+.....", +"..++++++..+.....", +"..+....+..+.....", +"..+....+..+++++.", +"................"}; diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/circumcenter.png b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/circumcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..f743b7a64cacc527a5562ce0ae76d641675ad423 GIT binary patch literal 3862 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 o=(WTfhkeR27cmB`+Wkx8a_@65j^u^siVQp>_ zPwn8;)Y0kK7)l|lBE%wFmC-v$eL~)Yfy# z^Ob>gz1owlwa4nuL@ZOXxYpY|_=&3meg}r2l-hGYxpQ6xt+akF&AwE-Rj{%5WonE%=bMnbMjE6fFxi8F4En`*+~J=7Qars`&=Io zhuwOigX}AaoB2WbpNI;Z{V^LaLk(JDtl#%qy z0f>Sm3j{{aCY8&CEXN`MM|ZE8%R+uhohP>-UnM8m)ey5NDv83-9qxc}B#Vq3KoHKA zr9$dh3?K|tQxUGnzF?FXfupNPBJcqpK@|`Kj_Uz9$Li`v=>Q=x&=v?xE!YNlY%Pp2 z`(c97k@x;0y2r zSkx79I6z~aP_V?vz+;97?mOd?a$#bTcUmw3OasdW&9Ju0FEPu=Z0000NkluMLp6h%0z3=<;A2g_#%st8T@8|R6`^WPY zN+~|cy!}H_Tu~a@KD%tm_m%7DBeBj`kG8vQU){vgw8h}2SJgOx_Wy$a@FNi_DPZfe z`nBJwsC#Z*QE@GJoQ`tuDa(UlIM}E5i50 zBA$rOU%pfGhYOm1CieM!Vph$nt*?~TY^loi`LXV`5}%pm#t@`))-rF!=crz=2waH* z;&%?&t(Tk+00|(JQV1c$vDa8QD>{33#j+hQ&7QY9D6ARciDBIrh-i^WiBC;mWoDv} z!6`vsx{B(RFHl;wgmA7OUDr{{iz~czzq@99`0t%p{lXW}qVfl#^_OC$#}{5(QTOzo zk_Fo%L2DS5x`{{AAP_~_I{M52cSceSW=aW^ZDx7>212EvwFb$?inmyRDnA3U(o1R+5=&d7U!}&E2ZTB0{=@8pPcNL+3uBftDi44tm{OIN(koEl8E)va^lqVyXUj5-2)s2 zuHBC#0hkYqo2M57N?UsXwh`2YX_07*qo IM6N<$f-Pt`I{*Lx literal 0 HcmV?d00001 diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/fileSave.png b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/fileSave.png new file mode 100644 index 0000000000000000000000000000000000000000..8feec99bee8685290ec292e7baeb2e23ba4bdf0c GIT binary patch literal 1205 zcmV;m1WNmfP)NMq!WhGU zDb0?ir%%5E<_$1MjY0D7B#lW{;<)?El`Cg|1R~9@%$x6h^uLpO_>ug@xmmgJ*No_P znnEHG0)+hmDMa6YiFRG4o_LlgUp&G194;$ z#|Q7e%Hu~Tky2s+BT^*7)&c<-q*B=0DRAb}Cf_b=^dCQH;0Q1UG+z@p-S0s>z(fLJdaXofa#Y{a{XE!DHR|93_w4?hG<8kq+lom3=aj}y`daH}yY*TMGX*PU}a?k^Z$mMe=dBBKr3MP(B@#**TcTpzBa|A=h93v%QS-kjptJB{4u^z@&y0LCI4T6TSa45CS|$;yRAqEsIM__GKF%A16&yfb3{?Ev3O= zWp`NK(`0awX_vDHsHDgM8ZYP2344@ECC0|a7#$t8fc=zn6g_`~Gzu^#jRElxKudw6 z9$4;tmaREZLZad}%d_8@%6e3-*Khp}bb(|KKnidjfs}wT93TtVTG{6kY+YmJ^6l=8 z>lZ#>U;q0&umyDY?jo%iDv^z46gTJE4_y{w-(;l(uB)>!J7T{u)|M^Y%M$(Q0;0yWQjJ)lC|WuBldAVWm>@ zYqi>@@7LCS|K4h~T3%gTynM%)v;o`!%0SCx>I0b8{Dmvcx$`r{^6IAfuzWTu7V=>n zht*cAvEloba;37qRxV#(t5)yUfG*GhflRd$wsDcfR`M{f{>xbi>|uW%=st z#`gB=U1QP^==3?TwFS`Yb4+F%ysJLI!or#FfIoo|Kmay)=NJKTf0)V094!6;(N7PE TmU#bB00000NkvXXu0mjf&~!wG literal 0 HcmV?d00001 diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/triangulation.png b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/icons/triangulation.png new file mode 100644 index 0000000000000000000000000000000000000000..ce082a6e08fbd3afdf8d463ae8eee02d35ccf99a GIT binary patch literal 7547 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 + + icons/circumcenter.png + icons/triangulation.png + + diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation_matrix.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation_matrix.h index 88ac9b56d8b..0a0ba5d4258 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation_matrix.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation_matrix.h @@ -192,9 +192,9 @@ public: // just to give an order(ing) -template< class GT, template class Hyperbolic_octagon_translation_matrix > -bool operator < (const std::complex< typename Hyperbolic_octagon_translation_matrix:: template Field_number >& lh, - const std::complex< typename Hyperbolic_octagon_translation_matrix:: template Field_number >& rh) +template< class GT > +bool operator<( const std::complex& lh, + const std::complex& rh) { if (real(lh) < real(rh)) { return true; @@ -210,10 +210,11 @@ bool operator < (const std::complex< typename Hyperbolic_octagon_translation_mat } // just to order octagon_matrices -template -bool operator < (const Hyperbolic_octagon_translation_matrix& lh, - const Hyperbolic_octagon_translation_matrix& rh) +template +bool operator<( const Hyperbolic_octagon_translation_matrix& lh, + const Hyperbolic_octagon_translation_matrix& rh) { + if (lh.A < rh.A) { return true; } @@ -227,15 +228,15 @@ bool operator < (const Hyperbolic_octagon_translation_matrix& lh, return false; } -template -bool operator == (const Hyperbolic_octagon_translation_matrix& lh, - const Hyperbolic_octagon_translation_matrix& rh) +template +bool operator == (const Hyperbolic_octagon_translation_matrix& lh, + const Hyperbolic_octagon_translation_matrix& rh) { return (lh.A == rh.A && lh.B == rh.B); } -template -std::ostream& operator<<(std::ostream& os, const Hyperbolic_octagon_translation_matrix& m) +template +std::ostream& operator<<(std::ostream& os, const Hyperbolic_octagon_translation_matrix& m) { os << m.A << " " << m.B; return os; diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_random_points_in_disc_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_random_points_in_disc_2.h index 1f2edaeee18..9b87ad18ce1 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_random_points_in_disc_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_random_points_in_disc_2.h @@ -43,7 +43,7 @@ void Hyperbolic_random_points_in_disc_2(std::vector& outpu rand = CGAL::Random(seed); } /* CGAL::Random_points_in_disc_2 in_Euclidean_disk(rh, rand); */ - CGAL::Random_points_in_disc_2 in_Euclidean_disk(rh, rand); + CGAL::Random_points_in_disc_2 in_Euclidean_disk(rh, rand); std::vector pts; pts.reserve(nb); diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h index 3babaf7f895..1a6f38cbc60 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h @@ -46,6 +46,13 @@ public Periodic_4_hyperbolic_triangulation_2 { typedef Periodic_4_hyperbolic_triangulation_2 Base; public: + +#ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 + using Base::cw; + using Base::ccw; + using Base::geom_traits; +#endif + typedef typename Base::Locate_type Locate_type; typedef typename Base::Geometric_traits Geometric_traits; typedef typename Base::Triangulation_data_structure Triangulation_data_structure; @@ -80,6 +87,7 @@ public: typedef typename Base::Face_circulator Face_circulator; typedef typename Base::Edge_circulator Edge_circulator; typedef typename Base::Vertex_circulator Vertex_circulator; + typedef typename Base::Line_face_circulator Line_face_circulator; typedef Face_iterator All_faces_iterator; typedef Edge_iterator All_edges_iterator; @@ -164,9 +172,200 @@ public: InputIterator last, bool is_large_point_set = true); + bool locally_Delaunay(const Face_handle&, int); + void propagating_flip(Face_handle&, int); + void restore_Delaunay(Vertex_handle); + void flip_single_edge(Face_handle, int); + bool flippable(Face_handle, int); + }; // class Periodic_4_hyperbolic_Delaunay_triangulation_2 + + + +template +bool Periodic_4_hyperbolic_Delaunay_triangulation_2::flippable(Face_handle f, int i) +{ + Face_handle nb = f->neighbor(i); + int j = nb->index(f); + + const Point *p[4]; + + p[0] = &f->vertex(i)->point(); // i + p[1] = &nb->vertex(j)->point(); // opposite + p[2] = &f->vertex(ccw(i))->point(); // ccw + p[3] = &f->vertex(cw(i))->point(); // cw + + if (f->has_zero_offsets() && nb->has_zero_offsets()) { + if (orientation(*p[0], *p[1], *p[2]) == LEFT_TURN) + return false; + if (orientation(*p[0], *p[1], *p[3]) == RIGHT_TURN) + return false; + } else { + Offset off[4]; + off[0] = f->offset(i); + off[1] = f->neighbor_offset(j).append(nb->offset(j)); + off[2] = f->offset(ccw(i)); + off[3] = f->offset(cw(i)); + + if (orientation(*p[0], *p[1], *p[2], off[0], off[1], off[2]) == LEFT_TURN) + return false; + if (orientation(*p[0], *p[1], *p[3], off[0], off[1], off[3]) == RIGHT_TURN) + return false; + } + + return true; +} + + + +template +void Periodic_4_hyperbolic_Delaunay_triangulation_2::flip_single_edge(Face_handle f, int i) +{ + CGAL_triangulation_precondition(f != Face_handle()); + CGAL_triangulation_precondition(i == 0 || i == 1 || i == 2); + CGAL_triangulation_precondition(dimension() == 2); + + CGAL_triangulation_precondition(flippable(f, i)); + + if (f->has_zero_offsets() && f->neighbor(i)->has_zero_offsets()) { + _tds.flip(f, i); + return; + } else { + Face_handle nb = f->neighbor(i); + int nb_idx = nb->index(f); + + Vertex_handle vh[] = { f->vertex(i), + f->vertex(ccw(i)), + nb->vertex(nb_idx), + f->vertex(cw(i)) }; + Offset o[] = { f->offset(i), + f->offset(ccw(i)), + nb->offset(nb_idx), + f->offset(cw(i)) }; + Offset no[] = { f->neighbor_offset(cw(i)), + nb->neighbor_offset(ccw(nb_idx)), + nb->neighbor_offset(cw(nb_idx)), + f->neighbor_offset(ccw(i)) }; + + _tds.flip(f, i); + + nb = f->neighbor(ccw(i)); + nb_idx = nb->index(f); + + f->set_offsets(); + nb->set_offsets(); + + f->set_offset(i, o[0]); + f->set_neighbor_face_offset(i, no[1]); + f->set_offset(ccw(i), o[1]); + f->set_neighbor_face_offset(ccw(i), Offset()); + f->set_offset(cw(i), o[2]); + f->set_neighbor_face_offset(cw(i), no[0]); + + nb->set_offset(nb_idx, o[3]); + nb->set_neighbor_face_offset(nb_idx, Offset()); + nb->set_offset(ccw(nb_idx), o[0]); + nb->set_neighbor_face_offset(ccw(nb_idx), no[2]); + nb->set_offset(cw(nb_idx), o[2]); + nb->set_neighbor_face_offset(cw(nb_idx), no[3]); + } + + +} + + + + +template < class Gt, class Tds > +void +Periodic_4_hyperbolic_Delaunay_triangulation_2:: +restore_Delaunay(Vertex_handle v) +{ + Face_handle f = v->face(); + Face_handle next; + int i; + Face_handle start(f); + do + { + i = f->index(v); + next = f->neighbor(ccw(i)); // turn ccw around v + propagating_flip(f, i); + f = next; + } + while(next != start); +} + + +template < class Gt, class Tds > +void +Periodic_4_hyperbolic_Delaunay_triangulation_2:: +propagating_flip(Face_handle& f, int i) +{ + Face_handle nb = f->neighbor(i); + + if (locally_Delaunay(f, i)) + return; + + this->flip_single_edge(f, i); + propagating_flip(f, i); + i = nb->index(f->vertex(i)); + propagating_flip(nb, i); +} + + + +template < class Gt, class Tds > +bool +Periodic_4_hyperbolic_Delaunay_triangulation_2:: +locally_Delaunay(const Face_handle &f, int nbi) +{ + CGAL_BRANCH_PROFILER("locally_Delaunay(), simplicity check failures", tmp); + + Face_handle nb = f->neighbor(nbi); + + bool simplicity_criterion = f->has_zero_offsets() && nb->has_zero_offsets(); + + const Point *p[4]; + for (int index = 0; index < 3; ++index) + { + p[index] = &nb->vertex(index)->point(); + } + p[3] = &f->vertex(nbi)->point(); + + Oriented_side os; + if (simplicity_criterion) + { + // No periodic offsets + os = side_of_oriented_circle(*p[0], *p[1], *p[2], *p[3]); + } + else + { + CGAL_BRANCH_PROFILER_BRANCH(tmp); + + Offset off[4]; + + for (int index = 0; index < 3; ++index) + { + off[index] = nb->offset(index); + } + off[3] = f->neighbor_offset(nbi); + + os = side_of_oriented_circle( off[0].apply(*p[0]), + off[1].apply(*p[1]), + off[2].apply(*p[2]), + off[3].apply(*p[3]) ); + } + + return (ON_POSITIVE_SIDE != os); +} + + + + + + template < class Gt, class Tds > inline typename Periodic_4_hyperbolic_Delaunay_triangulation_2::Vertex_handle @@ -174,16 +373,23 @@ Periodic_4_hyperbolic_Delaunay_triangulation_2:: insert(const Point &p, Face_handle start) { + typedef typename Gt::Side_of_fundamental_octagon Side_of_fundamental_octagon; Side_of_fundamental_octagon check = Side_of_fundamental_octagon(); CGAL::Bounded_side side = check(p); - + if (side != CGAL::ON_UNBOUNDED_SIDE) { - cout << "Point inserted in face " << start->get_number() << ", vertices: "; + if ( start == Face_handle() ) { + Locate_type lt; + int li; + start = this->euclidean_visibility_locate(p, lt, li); + } + + cout << "Point inserted in face " << start->get_number() << ", vertices: " << endl; for (int i = 0; i < 3; i++) - cout << start->vertex(i)->idx() << " with offset " << start->offset(i) << ", "; + cout << start->vertex(i)->idx() << " with offset " << start->offset(i) << ", " << endl; cout << endl; cout << "Neighbor offsets: " << start->neighbor_offset(0) << ", " << start->neighbor_offset(1) << ", " << start->neighbor_offset(2) << endl; @@ -242,7 +448,7 @@ insert(const Point &p, Face_handle start) cout << "--------- end ----------" << endl << endl; } - + restore_Delaunay(new_vertex); return new_vertex; } else { diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h index b7cdad77adf..bcab4c5d2d5 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_traits_2.h @@ -214,7 +214,7 @@ public: Construct_segment_2 construct_segment_2_object() const { - return Construct_segment_2(_domain); + return Construct_segment_2(&_domain); } Construct_midpoint_2 @@ -269,7 +269,7 @@ public: Construct_triangle_2 construct_triangle_2_object() const { - return Construct_triangle_2(); + return Construct_triangle_2(&_domain); } Construct_direction_2 diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_2.h index 64ce33c0db2..5e13ff93a49 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_2.h @@ -34,34 +34,26 @@ #include #include #include - +#include #include #include #include -#include - -//#include - #include #include #include #include #include - #include - #include - #include #include - #include - #include - #include + + namespace CGAL { #ifndef CGAL_P4T2_STRUCTURAL_FILTERING_MAX_VISITED_CELLS @@ -159,15 +151,22 @@ template < class GT, Periodic_4_hyperbolic_triangulation_ds_face_base_2 > > -class Periodic_4_hyperbolic_triangulation_2 : public Triangulation_cw_ccw_2 { +class Periodic_4_hyperbolic_triangulation_2 : public Triangulation_2 { // friend std::istream& operator>> <> // (std::istream& is, Periodic_4_hyperbolic_triangulation_2 &tr); typedef Periodic_4_hyperbolic_triangulation_2 Self; - typedef Triangulation_cw_ccw_2 Base; + typedef Triangulation_2 Base; public: + +#ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 + using Base::cw; + using Base::ccw; + using Base::geom_traits; +#endif + typedef GT Geometric_traits; typedef TDS Triangulation_data_structure; typedef unsigned short int Int; @@ -204,6 +203,8 @@ public: //typedef typename TDS::Face_base Face_base; + typedef typename Base::Line_face_circulator Line_face_circulator; + typedef Face_iterator All_faces_iterator; typedef Edge_iterator All_edges_iterator; typedef Vertex_iterator All_vertices_iterator; @@ -348,87 +349,69 @@ public: bool is_infinite(Vertex_handle v) const { - return is_infinite(v); + return false; } bool is_infinite(Face_handle f) const { - return has_infinite_vertex(f) || is_finite_invisible(f); + return false; } bool is_infinite(Face_handle f, int i) const { - return has_infinite_vertex(f, i) || is_finite_invisible(f, i); + return false; } bool is_infinite(const Edge& e) const { - return is_infinite(e.first, e.second); + return false; } bool is_infinite(const Edge_circulator& ec) const { - return is_infinite(*ec); + return false; } bool is_infinite(const All_edges_iterator& ei) const { - return is_infinite(*ei); + return false; } private: bool has_infinite_vertex(Face_handle f) const { - return is_infinite(f); + return false; } bool has_infinite_vertex(Face_handle f, int i) const { - return is_infinite(f, i); + return false; } bool has_infinite_vertex(const Edge& e) const { - return is_infinite(e); + return false; } int get_finite_invisible_edge(Face_handle f) const - { - assert(is_finite_invisible(f)); - - return f->info().get_invisible_edge(); + { + return false; } bool is_finite_invisible(Face_handle f) const { - return f->info().is_finite_invisible(); + return false; } bool is_finite_invisible(Face_handle f, int i) const - { - if(this->dimension() <= 1) { - return false; - } - - if(is_finite_invisible(f) && get_finite_invisible_edge(f) == i) { - return true; - } - - // another incident face and corresponding index - Face_handle f2 = f->neighbor(i); - int i2 = f2->index(f); - - if(is_finite_invisible(f2) && get_finite_invisible_edge(f2) == i2) { - return true; - } - + { return false; } bool is_finite_invisible(const Edge& e) const { - return is_finite_invisible(e.first, e.second); + return false; } @@ -553,37 +536,37 @@ public: Periodic_triangle construct_periodic_3_triangle(const Point &p1, const Point &p2, const Point &p3) const { - return make_array( std::make_pair(p1,Offset()), - std::make_pair(p2,Offset()), - std::make_pair(p3,Offset()) ); + return make_array( std::make_pair(p1,Offset()), + std::make_pair(p2,Offset()), + std::make_pair(p3,Offset()) ); } Periodic_triangle construct_periodic_3_triangle(const Point &p1, const Point &p2, const Point &p3, const Offset &o1, const Offset &o2, const Offset &o3) const { - return make_array( std::make_pair(p1,o1), - std::make_pair(p2,o2), - std::make_pair(p3,o3) ); + return make_array( std::make_pair(p1,o1), + std::make_pair(p2,o2), + std::make_pair(p3,o3) ); } Periodic_segment construct_periodic_3_segment(const Point &p1, const Point &p2) const { return make_array( std::make_pair(p1,Offset()), - std::make_pair(p2,Offset()) ); + std::make_pair(p2,Offset()) ); } Periodic_segment construct_periodic_3_segment( const Point &p1, const Point &p2, const Offset &o1, const Offset &o2) const { return make_array( std::make_pair(p1,o1), - std::make_pair(p2,o2) ); + std::make_pair(p2,o2) ); } Triangle construct_triangle(const Point &p1, const Point &p2, const Point &p3) const { - return geom_traits().construct_triangle_3_object()(p1,p2,p3); + return geom_traits().construct_triangle_2_object()(p1,p2,p3); } Triangle construct_triangle(const Point &p1, const Point &p2, const Point &p3, const Offset &o1, const Offset &o2, const Offset &o3) const { - return geom_traits().construct_triangle_3_object()(p1,p2,p3,o1,o2,o3); + return geom_traits().construct_triangle_2_object()(p1,p2,p3,o1,o2,o3); } Triangle construct_triangle(const Periodic_triangle& tri) { @@ -592,12 +575,12 @@ public: } Segment construct_segment(const Point &p1, const Point &p2) const { - return geom_traits().construct_segment_3_object()(p1, p2); + return geom_traits().construct_segment_2_object()(p1, p2); } Segment construct_segment( const Point &p1, const Point &p2, const Offset &o1, const Offset &o2) const { - return geom_traits().construct_segment_3_object()(p1,p2,o1,o2); + return geom_traits().construct_segment_2_object()(p1,p2,o1,o2); } Segment construct_segment(const Periodic_segment& seg) const { @@ -606,7 +589,7 @@ public: } Point construct_point(const Point& p, const Offset &o) const { - return geom_traits().construct_point_3_object()(p,o); + return geom_traits().construct_point_2_object()(p,o); } Point construct_point(const Periodic_point& pp) const { @@ -619,7 +602,7 @@ public: if (it == virtual_vertices.end()) { // if v is not contained in virtual_vertices, then it is in the // original domain. - return std::make_pair(v->point(), Offset(0,0,0)); + return std::make_pair(v->point(), Offset()); } else { // otherwise it has to be looked up as well as its offset. return std::make_pair(it->second.first->point(), it->second.second); @@ -662,14 +645,32 @@ public: pp.second); } + + Segment segment(const Face_handle & fh, int idx) const { + return construct_segment( fh->vertex(idx)->point(), fh->vertex(ccw(idx))->point(), + fh->offset(idx), fh->offset(ccw(idx)) ); + } + + Segment segment(const pair & edge) { + return segment(edge.first, ccw(edge.second)); + } + + Segment segment(const Periodic_segment & ps) const { return construct_segment( ps[0].first, ps[1].first, - ps[0].second, ps[1].second ); + ps[0].second, ps[1].second ); } + + Triangle triangle(const Face_handle & fh) const { + return construct_triangle( fh->vertex(0)->point(), fh->vertex(1)->point(), fh->vertex(2)->point(), + fh->offset(0), fh->offset(1), fh->offset(2) ); + } + + Triangle triangle(const Periodic_triangle & pt) const { return construct_triangle( pt[0].first, pt[1].first, pt[2].first, - pt[0].second,pt[1].second,pt[2].second ); + pt[0].second,pt[1].second,pt[2].second ); } @@ -849,7 +850,7 @@ public: Face_handle locate( const Point & p, Locate_type & lt, int & li, int & lj, Face_handle start = Face_handle()) const { - return periodic_locate(p, Offset(), lt, li, lj, start); + return euclidean_visibility_locate(p, lt, li, start); //periodic_locate(p, Offset(), lt, li, lj, start); } @@ -881,6 +882,11 @@ public: Face_handle euclidean_visibility_locate(const Point& p, Locate_type& lt, int& li, Face_handle f = Face_handle()) const; + Face_handle locate(const Point& p, Locate_type& lt, int& li, Face_handle f = Face_handle()) const { + return euclidean_visibility_locate(p, lt, li, f); + } + + protected: // COMMON INSERTION for DELAUNAY and REGULAR TRIANGULATION template < class Conflict_tester, class Point_hider > @@ -1073,6 +1079,18 @@ public: return _tds.adjacent_vertices(v, vertices); } + + template + OutputIterator incident_vertices(Vertex_handle v) const { + return _tds.adjacent_vertices(v); + } + + + Vertex_circulator incident_vertices(Vertex_handle v) const { + return _tds.adjacent_vertices(v); + } + + size_type degree(Vertex_handle v) const { return _tds.degree(v); } @@ -1462,7 +1480,7 @@ is_valid(bool verbose, int level) const { if (orientation( *p[0], *p[1], *p[2], off[0], off[1], off[2] ) != POSITIVE) { if (verbose) { - cit->restore_orientation(); + cit->reorient(); for (int i=0; i<3; i++) { p[i] = &cit->vertex(i)->point(); off[i] = cit->offset(i); @@ -1551,6 +1569,14 @@ typename TDS::Face_handle Periodic_4_hyperbolic_triangulation_2:: euclidean_visibility_locate(const Point& p, Locate_type& lt, int& li, Face_handle f) const { + typedef typename GT::Side_of_fundamental_octagon Side_of_fundamental_octagon; + + Side_of_fundamental_octagon check = Side_of_fundamental_octagon(); + CGAL::Bounded_side side = check(p); + if (side != ON_BOUNDED_SIDE) { + return Face_handle(); + } + // Random generator (used to introduce a small perturbation to the choice of the starting vertex each time) boost::rand48 rng; boost::uniform_smallint<> three(0, 2); @@ -1571,8 +1597,9 @@ euclidean_visibility_locate(const Point& p, Locate_type& lt, int& li, Face_handl while (true) { Orientation o = orientation(f->vertex(curr)->point(), f->vertex(succ)->point(), p, f->offset(curr), f->offset(succ), Offset()); - + if (o == NEGATIVE) { + pair< typename std::set::iterator, bool> r = visited_faces.insert(f->neighbor(cw(curr))); if (r.second) { f = f->neighbor(cw(curr)); diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h index 85143d4e6d4..98dfaab7b65 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h @@ -166,6 +166,15 @@ public: } + bool has_zero_offsets() { + bool b = true; + for (int i = 0; i < 3 && b; i++) { + b = (b && o[i].is_identity()); + } + return b; + } + + // SETTING void set_number(int n) { @@ -228,7 +237,7 @@ public: V[0] = V[1] = V[2] = Vertex_handle(); } - void set_vertex(int k, Vertex_handle& vh) { + void set_vertex(int k, const Vertex_handle& vh) { V[k] = vh; } @@ -254,7 +263,7 @@ public: N[2] = n2; } - void set_neighbor(int k, Face_handle& nfh) { + void set_neighbor(int k, const Face_handle& nfh) { N[k] = nfh; } @@ -281,13 +290,15 @@ public: } - void restore_orientation() { + void reorient() { // N(eighbors), V(ertices), o(ffsets), no (neighbor offsets) - swap(N[1], N[2]); - swap(V[1], V[2]); - swap(o[1], o[2]); - swap(no[1], no[2]); + int idx0 = 0, idx1 = 1; // the indices to swap + + swap( N[idx0], N[idx1]); + swap( V[idx0], V[idx1]); + swap( o[idx0], o[idx1]); + swap(no[idx0], no[idx1]); } diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationCircumcircle.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationCircumcircle.h index 59589cf1815..ba42e8223b2 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationCircumcircle.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationCircumcircle.h @@ -46,7 +46,7 @@ TriangulationCircumcircle::TriangulationCircumcircle(QGraphicsScene* s, QObject* parent) : GraphicsViewInput(parent), dt(dt_), scene_(s) { - hint = dt->infinite_vertex(); + hint = typename T::Vertex_handle(); circle = new QGraphicsEllipseItem(); circle->hide(); scene_->addItem(circle); @@ -92,15 +92,27 @@ TriangulationCircumcircle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) return; } 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(); + + if (hint == typename T::Vertex_handle()) + fh = dt->locate(p); + else + fh = dt->locate(p, hint->face()); + if (fh != typename T::Face_handle()) { + hint = fh->vertex(0); + if(!dt->is_infinite(fh)){ + + typename T::Point p0, p1, p2; + p0 = fh->offset(0).apply(fh->vertex(0)->point()); + p1 = fh->offset(1).apply(fh->vertex(1)->point()); + p2 = fh->offset(2).apply(fh->vertex(2)->point()); + + typename T::Geom_traits::Circle_2 c(p0, p1, p2); + 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(); + } } else { circle->hide(); } diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationConflictZone.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationConflictZone.h index bd1286a4edf..536796c0487 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationConflictZone.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationConflictZone.h @@ -63,7 +63,7 @@ TriangulationConflictZone::localize_and_insert_point(QPointF qt_point) } qfaces.clear(); hint = dt->locate(p, hint); - dt->find_conflicts(p, faces, hint); + //dt->find_conflicts(p, faces, hint); for(typename std::list::iterator it = faces.begin(); it != faces.end(); ++it){ diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationGraphicsItemWithColorInfo.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationGraphicsItemWithColorInfo.h index cd516aa7744..014fae5f050 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationGraphicsItemWithColorInfo.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationGraphicsItemWithColorInfo.h @@ -147,7 +147,7 @@ TriangulationGraphicsItem::operator()(typename T::Face_handle fh) for (int i=0; i<3; i++) { if (fh < fh->neighbor(i) || t->is_infinite(fh->neighbor(i))){ m_painter->setPen(this->edgesPen()); - painterostream << t->segment(fh,i); + painterostream << t->segment(fh, i); } } } @@ -207,7 +207,7 @@ TriangulationGraphicsItem::paintVertices(QPainter *painter) it != t->finite_vertices_end(); it++){ - + /* switch (it->info().getColor()) { case 0: painter->setPen(QPen(::Qt::red, 3., ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); @@ -251,7 +251,7 @@ TriangulationGraphicsItem::paintVertices(QPainter *painter) default: painter->setPen(QPen(::Qt::gray, 3., ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); break; - } + } */ // @@ -335,18 +335,17 @@ TriangulationGraphicsItem::paint(QPainter *painter, painter->setPen(this->edgesPen()); // painter->drawRect(boundingRect()); if ( t->dimension()<2 || option->exposedRect.contains(boundingRect()) ) { - std::cout << "Drawing all!" << std::endl; drawAll(painter); } else { - std::cout << "Else-ing!" << std::endl; m_painter = painter; painterostream = PainterOstream(painter); + /* CGAL::apply_to_range (*t, typename T::Point(option->exposedRect.left(), option->exposedRect.bottom()), typename T::Point(option->exposedRect.right(), option->exposedRect.top()), - *this); + *this); */ } } @@ -357,33 +356,31 @@ void TriangulationGraphicsItem::updateBoundingBox() { prepareGeometryChange(); - if(t->number_of_vertices() == 0){ - bb = Bbox_2(0,0,0,0); - bb_initialized = false; - return; - } else if(! bb_initialized){ - bb = t->finite_vertices_begin()->point().bbox(); - bb_initialized = true; - } + // if(t->number_of_vertices() == 0){ + // bb = Bbox_2(0,0,0,0); + // bb_initialized = false; + // return; + // } else if(! bb_initialized){ + // bb = t->finite_vertices_begin()->point().bbox(); + // bb_initialized = true; + // } - if(t->dimension() <2){ - for(typename T::Finite_vertices_iterator it = t->finite_vertices_begin(); - it != t->finite_vertices_end(); - ++it){ - bb = bb + it->point().bbox(); - } - } else { - typename T::Vertex_handle inf = t->infinite_vertex(); - typename T::Vertex_circulator vc = t->incident_vertices(inf), done(vc); - do { - bb = bb + vc->point().bbox(); - ++vc; - } while(vc != done); - } - bounding_rect = QRectF(bb.xmin(), - bb.ymin(), - bb.xmax()-bb.xmin(), - bb.ymax()-bb.ymin()); + // if(t->dimension() <2){ + // for(typename T::Finite_vertices_iterator it = t->finite_vertices_begin(); + // it != t->finite_vertices_end(); + // ++it){ + // bb = bb + it->point().bbox(); + // } + // } else { + // typename T::Vertex_handle inf = t->infinite_vertex(); + // typedef typename T::Vertex_circulator Circ; + // Circ vc = t->incident_vertices(inf), done(vc); + // do { + // bb = bb + vc->point().bbox(); + // ++vc; + // } while(vc != done); + // } + bounding_rect = QRectF(-1., -1., 2., 2.); } diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationMovingPoint.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationMovingPoint.h index e1ec1c21f06..1d68a574741 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationMovingPoint.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationMovingPoint.h @@ -81,6 +81,8 @@ TriangulationMovingPoint::mousePressEvent(QGraphicsSceneMouseEvent *event) template void TriangulationMovingPoint::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{} +/* { if(! movePointToInsert) return; @@ -95,11 +97,13 @@ TriangulationMovingPoint::mouseMoveEvent(QGraphicsSceneMouseEvent *event) vh = next_hint; localize_and_insert_point(event->scenePos()); } - +*/ template void TriangulationMovingPoint::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{} +/* { if(! movePointToInsert || event->button() != ::Qt::LeftButton) { @@ -115,7 +119,7 @@ TriangulationMovingPoint::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) movePointToInsert = false; } - + */ template diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationPointInputAndConflictZone.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationPointInputAndConflictZone.h index c1f64b90e16..26f38f20f44 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationPointInputAndConflictZone.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationPointInputAndConflictZone.h @@ -50,34 +50,35 @@ TriangulationPointInputAndConflictZone::TriangulationPointInputAndConflictZon +// TODO: Do this! + template void TriangulationPointInputAndConflictZone::mousePressEvent(QGraphicsSceneMouseEvent *event) { p = convert(event->scenePos()); - if(dt->dimension() < 2 || - event->modifiers() != 0 || - event->button() != ::Qt::LeftButton) { - return; - } + // if(dt->dimension() < 2 || + // event->modifiers() != 0 || + // event->button() != ::Qt::LeftButton) { + // return; + // } - dt->get_conflicts(p, std::back_inserter(faces)); - for(typename std::list::iterator it = faces.begin(); - it != faces.end(); - ++it){ - if(! dt->is_infinite(*it)){ - QGraphicsPolygonItem *item = new QGraphicsPolygonItem(convert(dt->triangle(*it))); - QColor color(::Qt::blue); - color.setAlpha(150); - item->setBrush(color); - scene_->addItem(item); - qfaces.push_back(item); - } - } + // dt->get_conflicts(p, std::back_inserter(faces)); + // for(typename std::list::iterator it = faces.begin(); it != faces.end(); it++) { + // if( !dt->is_infinite(*it) ){ + // QGraphicsPolygonItem *item = new QGraphicsPolygonItem(convert(dt->triangle(*it))); + // QColor color(::Qt::blue); + // color.setAlpha(150); + // item->setBrush(color); + // scene_->addItem(item); + // qfaces.push_back(item); + // } + // } } + template void TriangulationPointInputAndConflictZone::mouseReleaseEvent(QGraphicsSceneMouseEvent * /*event*/) diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationRemoveVertex.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationRemoveVertex.h index b67f013af06..cb56e5a6229 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationRemoveVertex.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Qt/TriangulationRemoveVertex.h @@ -44,6 +44,8 @@ TriangulationRemoveVertex::TriangulationRemoveVertex(T * dt_, template void TriangulationRemoveVertex::mousePressEvent(QGraphicsSceneMouseEvent *event) +{} +/* { if((event->modifiers() & ::Qt::ShiftModifier) && (! (event->modifiers() & ::Qt::ControlModifier))){ @@ -57,7 +59,7 @@ TriangulationRemoveVertex::mousePressEvent(QGraphicsSceneMouseEvent *event) emit (modelChanged()); } } - +*/ template