From 72405a48b851de3285efd1f30f89442a1b915540 Mon Sep 17 00:00:00 2001 From: "loic.dubois" Date: Thu, 7 Mar 2024 08:16:05 +0100 Subject: [PATCH 01/97] initialisation --- Hyperbolic_surface_triangulation_2/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Hyperbolic_surface_triangulation_2/README.md diff --git a/Hyperbolic_surface_triangulation_2/README.md b/Hyperbolic_surface_triangulation_2/README.md new file mode 100644 index 000000000000..e69de29bb2d1 From 449cfa47a8be8e43faac84c9d73eda1a9564e7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Thu, 7 Mar 2024 08:30:27 +0100 Subject: [PATCH 02/97] Ajout du code --- .../CMakeLists.txt | 54 ++ .../demo.cpp | 50 ++ .../drawing_window_description.ui | 44 ++ .../window.cpp | 236 ++++++ .../window.h | 87 +++ .../CMakeLists.txt | 35 + .../data/domain | 25 + .../data/input triangulation | 63 ++ .../data/output triangulation | 63 ++ .../example.cpp | 80 +++ .../include/CGAL/Complex_without_sqrt.h | 193 +++++ .../CGAL/Hyperbolic_fundamental_domain_2.h | 212 ++++++ .../Hyperbolic_fundamental_domain_factory_2.h | 264 +++++++ .../include/CGAL/Hyperbolic_isometry_2.h | 185 +++++ .../CGAL/Hyperbolic_surface_triangulation_2.h | 673 ++++++++++++++++++ .../CGAL/Hyperbolic_surfaces_traits_2.h | 64 ++ .../copyright | 3 + .../dependencies | 1 + .../description.txt | 5 + .../license.txt | 1 + .../maintainer | 3 + .../CMakeLists.txt | 18 + .../hs_test_complex.cpp | 104 +++ .../hs_test_domain.cpp | 87 +++ .../hs_test_factory.cpp | 57 ++ .../hs_test_isometry.cpp | 95 +++ .../hs_test_triangulation.cpp | 95 +++ 27 files changed, 2797 insertions(+) create mode 100644 Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt create mode 100644 Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp create mode 100644 Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui create mode 100644 Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp create mode 100644 Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h create mode 100644 Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h create mode 100644 Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/copyright create mode 100644 Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies create mode 100644 Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/description.txt create mode 100644 Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/license.txt create mode 100644 Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/maintainer create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt new file mode 100644 index 000000000000..65eaad14d2c6 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt @@ -0,0 +1,54 @@ +cmake_minimum_required(VERSION 3.1...3.15) + +project( demo ) + +# Find includes in corresponding build directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +include_directories(${CMAKE_BINARY_DIR}) + +# Instruct CMake to run moc automatically when needed. +set(CMAKE_AUTOMOC ON) + + +# CGAL and its components +find_package(CGAL REQUIRED COMPONENTS Core Qt5) +include(${CGAL_USE_FILE}) +find_package(Qt5 QUIET COMPONENTS Widgets) + +if ( NOT CGAL_FOUND ) + + message(STATUS "This project requires the CGAL library, and will not be compiled.") + return() + +endif() + +if ( NOT CGAL_Qt5_FOUND ) + + message(STATUS "This project requires the Qt5 library, and will not be compiled.") + return() + +endif() + +# Boost and its components +find_package( Boost REQUIRED ) + +if ( NOT Boost_FOUND ) + + message(STATUS "This project requires the Boost library, and will not be compiled.") + + return() + +endif() + +# ui files, created with Qt Designer +qt5_wrap_ui(UIS drawing_window_description.ui) + +add_executable( demo demo.cpp window.cpp ${UIS}) + +add_to_cached_list( CGAL_EXECUTABLE_TARGETS demo ) + +target_link_libraries(demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets ) + +set(CMAKE_BUILD_TYPE "Release") + +target_include_directories(demo PRIVATE ../../include/) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp new file mode 100644 index 000000000000..12e81ffad8b8 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp @@ -0,0 +1,50 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include "window.h" + +#include + +#include +#include +#include +#include +#include + +typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; +typedef CGAL::Hyperbolic_fundamental_domain_factory_2 Factory; +typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int main(int argc, char** argv){ + // 1. Generate the triangulation + Factory factory = Factory(time(NULL)); + Domain domain = factory.generate_domain_g2(); + Triangulation triangulation = Triangulation(domain); + triangulation.make_delaunay(); + + // 2. Draw the triangulation + QApplication app(argc, argv); + app.setApplicationName("Hyperbolic surfaces triangulation 2 Demo"); + + DemoWindow window; + window.item().draw_triangulation(triangulation); + window.show(); + + QStringList args = app.arguments(); + args.removeAt(0); + return app.exec(); +} diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui new file mode 100644 index 000000000000..cba64b8f3009 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui @@ -0,0 +1,44 @@ + + + MainWindow + + + + 0 + 0 + 800 + 720 + + + + + 0 + 0 + + + + Hyperbolic flips demo window + + + + + + 10 + 10 + 771 + 671 + + + + + 0 + 0 + + + + + + + + + diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp new file mode 100644 index 000000000000..848933ebfc49 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp @@ -0,0 +1,236 @@ +#include "window.h" + +DemoWindowItem::DemoWindowItem() : CGAL::Qt::GraphicsItem(){ + // Clear + _edges.clear(); + + // Prepare the pens + _poincare_disk_pen.setStyle(Qt::SolidLine); + _poincare_disk_pen.setWidth(8); + _poincare_disk_pen.setBrush(Qt::black); + + _edges_pen.setStyle(Qt::SolidLine); + _edges_pen.setWidth(6); + _edges_pen.setBrush(Qt::blue); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DemoWindowItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ + // 1. Draw the poincaré disk + QRectF circle_rect = QRectF(-_poincare_disk_radius_in_pixels-3, -_poincare_disk_radius_in_pixels-3, 2*_poincare_disk_radius_in_pixels+6, 2*_poincare_disk_radius_in_pixels+6); + painter->setPen(_poincare_disk_pen); + painter->setBrush(QBrush()); + painter->drawEllipse(circle_rect); + + // 2. Draw the edges + painter->setBrush(QBrush()); + painter->setPen(_edges_pen); + for (int i=0; i<_edges.size(); i++){ + draw_edge(painter, _edges[i].first, _edges[i].second); + } +} + +QRectF DemoWindowItem::boundingRect() const{ + return QRectF(-_poincare_disk_radius_in_pixels-3, -_poincare_disk_radius_in_pixels-3, _poincare_disk_radius_in_pixels+6, _poincare_disk_radius_in_pixels+6); +} + +void DemoWindowItem::modelChanged(){} // Only used by Qt : we don't need to fill it + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DemoWindowItem::draw_triangulation(Triangulation& triangulation){ + typedef std::vector> RealizationVector; + RealizationVector realized_triangles; + realized_triangles = triangulation.lift(); + + Complex point_1, point_2, point_3; + for (typename RealizationVector::iterator it = realized_triangles.begin(); it != realized_triangles.end(); ++it){ + point_1 = std::get<1>(*it).get_z(); + point_2 = std::get<2>(*it).get_z(); + point_3 = std::get<3>(*it).get_z(); + + _edges.push_back(std::make_pair(point_1, point_2)); + _edges.push_back(std::make_pair(point_2, point_3)); + _edges.push_back(std::make_pair(point_3, point_1)); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DemoWindowItem::draw_point(QPainter* painter, Complex position){ + // First convert the complex number of coordinates in doubles, well-scaled + double point_x = _poincare_disk_radius_in_pixels * CGAL::to_double(position.real()); + double point_y = _poincare_disk_radius_in_pixels * CGAL::to_double(position.imag()); + + // Then draw a small circle + QRectF circle_rect = QRectF(point_x-1, point_y-1, 3, 3); + painter->drawEllipse(circle_rect); + +} + +void DemoWindowItem::draw_edge(QPainter* painter, Complex source, Complex target){ + // First convert the points coordinates to doubles + + double src_x = CGAL::to_double(source.real()); + double src_y = CGAL::to_double(source.imag()); + + double tar_x = CGAL::to_double(target.real()); + double tar_y = CGAL::to_double(target.imag()); + + // 0. If src and tar are too colinear or too close from each other then draw a line + double determinant = src_x*tar_y - src_y*tar_x; // determinant of the matrix whose columns are the vectors src and tar : indicates colinearity + double distance_squared = (src_x-tar_x)*(src_x-tar_x) + (src_y-tar_y)*(src_y-tar_y); + if ((std::abs(determinant) < computation_treshold_squared) || (distance_squared < computation_treshold_squared)){ + // src and tar are too colinear or too close from each other + draw_line(painter, src_x, src_y, tar_x, tar_y); + return; + } + + // 1. Compute the center of the circle supporting the geodesic between src and tar + + // 1.a Inverse src and tar with respect to the unit circle and find the euclidean midpoints of the segments between respectively + // src and it's inversion, and tar and it's inversion + + double src_norm_2 = src_x*src_x + src_y*src_y; // Can't be too close to zero because determinant was not + double tar_norm_2 = tar_x*tar_x + tar_y*tar_y; // Can't be too close to zero because determinant was not + + double src_inv_x = src_x / src_norm_2; + double src_inv_y = src_y / src_norm_2; + double tar_inv_x = tar_x / tar_norm_2; + double tar_inv_y = tar_y / tar_norm_2; + + // coordinates of the euclidean midpoints of the segments [src, src_inv] and [tar, tar_inv] + double src_mid_x = (src_x + src_inv_x) / 2; + double src_mid_y = (src_y + src_inv_y) / 2; + double tar_mid_x = (tar_x + tar_inv_x) / 2; + double tar_mid_y = (tar_y + tar_inv_y) / 2; + + // 1.b Solve a system to find the intersection (center_x, center_y) of the bisectors of the two segments [src, src_inv] and [tar, tar_inv] : + // (center_x \\ center y) = (a & b \\ c & d)^{-1} \times (u_x \\ u_y) + + + // 1.b.i define the system + + double a = src_x; + double b = src_y; + double c = tar_x; + double d = tar_y; + + double u_x = a*src_mid_x + b*src_mid_y; + double u_y = c*tar_mid_x + d*tar_mid_y; + + // 1.b.ii solve the system (just a matrix inversion) + double det = a*d-b*c; // Can't be too close to zero... + double center_x = (d*u_x - b*u_y) / det; + double center_y = (-c*u_x + a*u_y) / det; + + // 2. draw the arc supported by the circle whose center is (center_x, center_y) and whose extremities are src and tar + draw_arc(painter, src_x, src_y, tar_x, tar_y, center_x, center_y); +} + + +void DemoWindowItem::draw_line(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y){ + + // Convert to doubles and scale by the radius of the poincaré disk + double src_x = _poincare_disk_radius_in_pixels * point_1_x; + double src_y = _poincare_disk_radius_in_pixels * point_1_y; + double tar_x = _poincare_disk_radius_in_pixels * point_2_x; + double tar_y = _poincare_disk_radius_in_pixels * point_2_y; + + // Actual drawing + QLineF line (src_x, src_y, tar_x, tar_y); + painter->drawLine(line); +} + + +void DemoWindowItem::draw_arc(QPainter* painter, double point_1_x, double point_1_y, + double point_2_x, double point_2_y, double center_x, double center_y){ + // Draws the arc supported by the circle whose center is (center_x, center_y) and whose extremities are src and tar + + // 1. Scale by the radius of the poincaré disk + + double src_x = _poincare_disk_radius_in_pixels * point_1_x; + double src_y = _poincare_disk_radius_in_pixels * point_1_y; + + double tar_x = _poincare_disk_radius_in_pixels * point_2_x; + double tar_y = _poincare_disk_radius_in_pixels * point_2_y; + + double xc = _poincare_disk_radius_in_pixels * center_x; + double yc = _poincare_disk_radius_in_pixels * center_y; + + // 2. Define the radius of the circle and the box [xm, xM] \times [ym, yM] bounding the circle + + double circle_radius = sqrt((point_1_x-center_x)*(point_1_x-center_x) + (point_1_y-center_y)*(point_1_y-center_y)); + + double xm = _poincare_disk_radius_in_pixels * (center_x - circle_radius); + double xM = _poincare_disk_radius_in_pixels * (center_x + circle_radius); + double ym = _poincare_disk_radius_in_pixels * (center_y - circle_radius); + double yM = _poincare_disk_radius_in_pixels * (center_y + circle_radius); + + // If the source and the target are too close from each other (less than 10 pixels) or if the circle is very big then just draw a line + double dist_sq = (src_x-tar_x)*(src_x-tar_x) + (src_y - tar_y)*(src_y-tar_y); + double rad_sq = (xM-xc)*(xM-xc) + (yM-yc)*(yM-yc); + if ( (dist_sq < 100) || (rad_sq > 1000 * dist_sq) ){ + QLineF line (src_x, src_y, tar_x, tar_y); + painter->drawLine(line); + return; + } + + // 3. Compute angles (needed because we will draw using QPainter::drawArc) + + // src_angle is the argument, in degrees, of point_1 - center + // tar_angle is the argument, in degrees, of point_2 - center + double src_angle = deg_angle(src_x - xc, src_y - yc); + double tar_angle = deg_angle(tar_x - xc, tar_y - yc); + src_angle = 360 - src_angle; // Because of y-axis inversion + tar_angle = 360 - tar_angle; // Because of y-axis-inversion + + // Compute the sweep angle (see QPainter::drawArc) + double sweep_angle = tar_angle - src_angle; + while (sweep_angle > 180) + sweep_angle -= 360; + while (sweep_angle < -180) + sweep_angle += 360; + + // 4. Actual Drawing + + QRectF bbox_rect (xm, ym, xM-xm, yM-ym); + painter->drawArc(bbox_rect, src_angle*16, sweep_angle*16); +} + +double DemoWindowItem::deg_angle(double x, double y){ + // To avoid problems when further division by x (ok since x^2 + y^2 not too small) : + if (x*x < computation_treshold_squared){ + if (y>0) return 90; + return -90; + } + + double angle = 180. * std::atan(y / x) / M_PI; + if (x < 0){ + return angle + 180.; + } + return angle; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DemoWindow::DemoWindow() : DemosMainWindow(){ + setupUi(this); // Method automatically generated by the ui file and here inherited from Ui::MainWindow. Builds the window and the contents for us... + this->graphicsView->setScene(&_scene); // ... in particular graphicsView is already constructed : we just put our scene in it and then do things within the scene + _scene.setItemIndexMethod(QGraphicsScene::NoIndex); + _scene.setSceneRect(-600, -600, 1200, 1200); + _item = new DemoWindowItem(); + _scene.addItem(_item); + this->graphicsView->scale(0.5, -0.5); // Y-axis inversion + + setWindowTitle("Hyperbolic surfaces triangulation 2 Demo"); +} + +DemoWindowItem& DemoWindow::item(){ + return *_item; +} + +void DemoWindow::keyPressEvent(QKeyEvent* event) {} diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h new file mode 100644 index 000000000000..ae4d5bf9f68d --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h @@ -0,0 +1,87 @@ +#ifndef CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2_DEMO_WINDOW +#define CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2_DEMO_WINDOW + +// Qt headers +#include +#include +#include + +// UI generated header +#include "ui_drawing_window_description.h" + +// CGAL headers +#include +#include +#include +#include + +typedef CGAL::Complex_without_sqrt Complex; +typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; + +class DemoWindowItem : + public CGAL::Qt::GraphicsItem +{ + Q_OBJECT // Qt macro for Qt objects + // (Q_OBJECT does not support templates) +private: + typedef CGAL::Bbox_2 Bbox_2; // "Bounding box" : just a box type used for drawing + + // Edges to draw + std::vector> _edges; + + // Pens for drawing + QPen _poincare_disk_pen; + QPen _edges_pen; + + // radius of the poincaré disk + const int _poincare_disk_radius_in_pixels = 600; + // Approximation treshold : used to decide when to simplify a computation (ex : draw a line instead of an arc if an hyperbolic segment is very small) + const double computation_treshold = 0.001; + const double computation_treshold_squared = computation_treshold*computation_treshold; + +public: + // Initializer + DemoWindowItem(); + + // Qt methods + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + QRectF boundingRect() const; + void modelChanged(); + + // Drawing method + void draw_triangulation(Triangulation& triangulation); + +private: + // Sub-methods for drawing edges and vertices + void draw_point(QPainter* painter, Complex position); + + void draw_edge(QPainter* painter, Complex source, Complex target); + void draw_line(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y); + void draw_arc(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y, double center_x, double center_y); + + double deg_angle(double x, double y); +}; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class DemoWindow : + public CGAL::Qt::DemosMainWindow, public Ui::MainWindow +{ + Q_OBJECT // Qt macro for Qt objects + // (Q_OBJECT does not support templates) +private: + QGraphicsScene _scene; + DemoWindowItem* _item; + +public: + DemoWindow(); + DemoWindowItem& item(); + + // Events handling + void keyPressEvent(QKeyEvent* event); +}; + +#endif // CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2_DEMO_WINDOW diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt new file mode 100644 index 000000000000..c586b284b32d --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.1...3.15) + +project( example ) + +# CGAL and its components +find_package( CGAL QUIET COMPONENTS ) + +if ( NOT CGAL_FOUND ) + + message(STATUS "This project requires the CGAL library, and will not be compiled.") + return() + +endif() + +# Boost and its components +find_package( Boost REQUIRED ) + +if ( NOT Boost_FOUND ) + + message(STATUS "This project requires the Boost library, and will not be compiled.") + + return() + +endif() + +add_executable( example example.cpp ) + +add_to_cached_list( CGAL_EXECUTABLE_TARGETS example ) + +target_link_libraries(example PRIVATE CGAL::CGAL ) + +set(CMAKE_BUILD_TYPE "Release") + +######################################################################### +target_include_directories(example PRIVATE ../../include/) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain new file mode 100644 index 000000000000..5939e6f119b7 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain @@ -0,0 +1,25 @@ +8 +4 +5 +6 +7 +0 +1 +2 +3 +1721/2000 +0/1 +8297/10000 +997/2500 +973/2500 +3009/5000 +-584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 +67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 +-1721/2000 +0/1 +-8297/10000 +-997/2500 +-973/2500 +-3009/5000 +584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 +-67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation new file mode 100644 index 000000000000..c08e1da027d8 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation @@ -0,0 +1,63 @@ +18 +0 +2 +1 +3 +5 +4 +6 +8 +7 +9 +11 +10 +12 +14 +13 +15 +17 +16 +0 +10 +896701229169842316950778203921975299064799643047659888106604438865344122820470157109887326082655761782553837544845179039175965417376791705867959/836273609320463514257483502681591523195236133061833744679179961712375794839959310433487318612410083059534534374688536207317345206401599134643119 +-19418507259061085619641689630640435984058171714545812936668146813850872294503145021257674940489083696672741491020528007004076175353707739983400/278757869773487838085827834227197174398412044353944581559726653904125264946653103477829106204136694353178178124896178735772448402133866378214373 +1 +13 +612526212307657122897283474650197304139092804905297877204014744573070303286884936896852229873588177834368/268103628966051285784934529104328848940358137385395645516169556929497519298241774099617399655238699425405 +-126866944662215918736790372507835381715141117045424130852646659152111867828591326651863500422593516163456/53620725793210257156986905820865769788071627477079129103233911385899503859648354819923479931047739885081 +2 +3 +292757743353761913700416163798561097670587748179632894407/200223882381056640535012846606905483500479752699253729232 +63235513168014260631979850586520955690547033479588418425/200223882381056640535012846606905483500479752699253729232 +4 +16 +39017739378376859671635519553251855672697407454962670971580661651756594046799896250917858374792225039222500/36194525468858915867966240853968723024591738680447791797837199355557292028886418490926343082528821336758937 +-10110010347593994717655310866751050414616898955759844971696270543225880906701059679652405693790111742302000/36194525468858915867966240853968723024591738680447791797837199355557292028886418490926343082528821336758937 +5 +6 +16386954112362118849893737673691839899857761289274691974066102993356785784090578947618621134033023/8029762654144910858311165247455758589048952750629461836912666173164806273658037920591484075858100 +-1226107841240673207943534675582483618175989649224411866651697927336902093838254338356724368297242/2007440663536227714577791311863939647262238187657365459228166543291201568414509480147871018964525 +7 +17 +1125712354658797994013499184396044742419066717007699560150752472903083789058454300593244875307393115155864036187286402/50267607787145624009355102870848298960698836467148462446350984661015489935778799597715078173979128717356145492937775 +-499668034370185732825650181787245575339304954348449681187747887409263529311593980676881472269733377028169064175326864/16755869262381874669785034290282766320232945489049487482116994887005163311926266532571692724659709572452048497645925 +8 +9 +3855380604793743114664598142710571658961987628425914636083790543987304596963260842364391848666429764/2960876086935830849632285481339452152137057777179564950200402443984968517922476602645053219024569985 +94740963166973714836593750733609123151127530206849785596930490104564314904153840793451777019095344/592175217387166169926457096267890430427411555435912990040080488796993703584495320529010643804913997 +11 +12 +129345186192739994985821269587675886373548476906530358999591627249871675767789694680365/71898272113645362898658521736319041021246451843682241314224502488958533735315294448269 +-495084608465374272144682061192614451658443208919129768772642926658378406836183660000/1943196543612036835098878965846460568141795995775195711195256824025906317170683633737 +14 +15 +40234647714189718951770957123453287121367648424671210059/16943252742601085273354734346088013718957234842831647184 +19565855810717555713157695504221568019635710973479859125/16943252742601085273354734346088013718957234842831647184 +yes +0 +584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 +-67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 +1721/2000 +0/1 +8297/10000 +997/2500 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation new file mode 100644 index 000000000000..5203fbf7241c --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation @@ -0,0 +1,63 @@ +18 +0 +9 +17 +1 +3 +4 +2 +6 +14 +5 +7 +10 +8 +15 +12 +11 +16 +13 +0 +10 +18195567661043388321076855556959719917759050071767933983285571057371364797794557152364809859901685376580552389521843458846162587/6757245472363007627761723083729069711091670525041068540805447968677630688464262220985281019261151894167988503313979393964593476 +-38727048897481644431758256667652356750029406167380835680726805394366801250505492150949541023823813855133417142071486928863540/80443398480511995568591941472965115608234172917155577866731523436638460576955502630777154991204189216285577420404516594816589 +1 +13 +83135210412050844990876670942720624/51331607131902553763356685654104999 +-651914263495057825211060831590000/2231809005734893641885073289308913 +2 +3 +1576963458116301/905198335895005 +-75848680193040/181039667179001 +4 +16 +12060661519716818963506111814322175/6270159993959813076667344519490408 +-67996204770519583494008546414763075/100322559903357009226677512311846528 +5 +6 +204361294251804088802703246436030609036619274974162022413815249074266835786419365561463487427307371/128514590765766229462566024141695823942788821679987346566296639772568791951007891175511329624459570 +-4955283320261524656837486455181693879971941047972874080245773430406035789653478448202213151176233/64257295382883114731283012070847911971394410839993673283148319886284395975503945587755664812229785 +7 +17 +973755260680312569549737378678480690224980985377643476129981597379982368624676413574881931631974048615809/525620953341058206421216005856234769587811902284040712290314729060371717086009007717151540173584583930517 +-10755871234491049293468181500862777506729565167309567788123812052253582963686678377811772717578967323840/175206984447019402140405335285411589862603967428013570763438243020123905695336335905717180057861527976839 +8 +9 +204361294251804088802703246436030609036619274974162022413815249074266835786419365561463487427307371/128514590765766229462566024141695823942788821679987346566296639772568791951007891175511329624459570 +-4955283320261524656837486455181693879971941047972874080245773430406035789653478448202213151176233/64257295382883114731283012070847911971394410839993673283148319886284395975503945587755664812229785 +11 +12 +1576963458116301/905198335895005 +-75848680193040/181039667179001 +14 +15 +504671729350640/126441191321787 +-522038573787080/379323573965361 +yes +0 +584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 +-67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 +1721/2000 +0/1 +23513497064637073157996450283975485664984012564403292419722236899967937716450097073282/43801488807673672885622465838606712062781193139687231043122765571946602855619999100125 +-27351402317671279567466786112238290146624729895330335308684166610381159917117851336431/35041191046138938308497972670885369650224954511749784834498212457557282284495999280100 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp new file mode 100644 index 000000000000..5482cb262b43 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -0,0 +1,80 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include +#include + +#include + +using namespace CGAL; + +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_surface_triangulation_2 Triangulation; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; + +int main(){ + Factory factory = Factory(time(NULL)); + Domain domain0, domain; + Triangulation triangulation; + std::string filename = "./data/domain"; + + // Generate the domain + std::cout << "generating the domain " << std::endl; + domain0 = factory.generate_domain_g2(); + + // Save the domain + std::cout << "saving the domain " << std::endl; + std::ofstream output_file (filename.c_str()); + output_file << domain0; + output_file.close(); + + // Load the domain + std::cout << "loading the domain" << std::endl; + std::ifstream input_file (filename.c_str()); + input_file >> domain; + input_file.close(); + + // Triangulate the domain + std::cout << "triangulating the domain " << std::endl; + triangulation = Triangulation(domain); + + // Save the resulting triangulation + std::cout << "saving the input triangulation " << std::endl; + output_file = std::ofstream ("./data/input triangulation"); + output_file << triangulation; + output_file.close(); + + // Delaunay flip the triangulation + std::cout << "Delaunay flipping the triangulation " << std::endl; + triangulation.make_delaunay(); + + // Save the resulting triangulation + std::cout << "saving the output triangulation " << std::endl; + output_file = std::ofstream ("./data/output triangulation"); + output_file << triangulation; + output_file.close(); + + // Load the resulting triangulation + std::cout << "loading the resulting triangulation" << std::endl; + Triangulation triangulation2; + input_file = std::ifstream ("./data/output triangulation"); + input_file >> triangulation2; + input_file.close(); + + std::cout << triangulation2 << std::endl; + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h new file mode 100644 index 000000000000..06ace2fb0d9e --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -0,0 +1,193 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallée (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Complex_without_sqrt + +#ifndef CGAL_COMPLEX_WITHOUT_SQRT +#define CGAL_COMPLEX_WITHOUT_SQRT + +#include +#include + +namespace CGAL { + +/* +Templated by a field FT. Represents a complex number over FT. +*/ +template +class Complex_without_sqrt { +private: + typedef Complex_without_sqrt _Self; + FT _real, _imag; + +public: + typedef FT Ft; + + Complex_without_sqrt(); + Complex_without_sqrt(const FT& real); + Complex_without_sqrt(const FT& real, const FT& imag); + + void set_real(const FT& real); + void set_imag(const FT& imag); + + FT real() const; + FT imag() const; + + FT squared_modulus() const; + _Self conjugate() const; + _Self operator+(const _Self& other) const; + _Self operator-(const _Self& other) const; + _Self operator-() const; + _Self operator*(const _Self& other) const; + _Self operator/(const _Self& other) const; +}; + +template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); +template bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + +templatestd::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); +templatevoid operator>>(std::istream& s, Complex_without_sqrt& z); + +// Returns the cross ratio (d-b)*(c-a) / ((d-a)*(c-b)) +template Complex_without_sqrt cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt d); +// Returns d such that (d-b)*(c-a) / ((d-a)*(c-b)) = cratio +template Complex_without_sqrt fourth_point_from_cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt cratio); + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +Complex_without_sqrt::Complex_without_sqrt(){ + _real = FT(0); + _imag = FT(0); +} + +template +Complex_without_sqrt::Complex_without_sqrt(const FT& real){ + _real = real; + _imag = FT(0); +} + +template +Complex_without_sqrt::Complex_without_sqrt(const FT& real, const FT& imag){ + _real = real; + _imag = imag; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Complex_without_sqrt::set_real(const FT& real){ + _real = real; +} + +template +void Complex_without_sqrt::set_imag(const FT& imag){ + _imag = imag; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +FT Complex_without_sqrt::real() const{ + return _real; +} + +template +FT Complex_without_sqrt::imag() const{ + return _imag; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +FT Complex_without_sqrt::squared_modulus() const{ + return _real*_real + _imag*_imag; +} + +template +Complex_without_sqrt Complex_without_sqrt::conjugate() const{ + return Complex_without_sqrt(_real, -_imag); +} + +template +Complex_without_sqrt Complex_without_sqrt::operator+(const Complex_without_sqrt& other) const{ + return Complex_without_sqrt(_real+other.real(), _imag+other.imag()); +} + +template +Complex_without_sqrt Complex_without_sqrt::operator-(const Complex_without_sqrt& other) const{ + return Complex_without_sqrt(_real-other.real(), _imag-other.imag()); +} + +template +Complex_without_sqrt Complex_without_sqrt::operator-() const{ + return Complex_without_sqrt(-_real, -_imag); +} + +template +Complex_without_sqrt Complex_without_sqrt::operator*(const Complex_without_sqrt& other) const{ + return Complex_without_sqrt(_real*other.real()-_imag*other.imag(), _real*other.imag()+_imag*other.real()); +} + +template +Complex_without_sqrt Complex_without_sqrt::operator/(const Complex_without_sqrt& other) const{ + FT m2 = other.squared_modulus(); + return Complex_without_sqrt(_real/m2, _imag/m2)*other.conjugate(); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ + return (z1.real()==z2.real() && z1.imag()==z2.imag()); +} + +template +bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ + return !operator==(z1, z2); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z){ + s << z.real() << std::endl << z.imag() << std::endl; + return s; +} + +template +void operator>>(std::istream& s, Complex_without_sqrt& z){ + std::string line; + std::getline(s, line); + z.set_real(FT(line)); + std::getline(s, line); + z.set_imag(FT(line)); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +Complex_without_sqrt cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt d){ + return (d-b)*(c-a) / ((d-a)*(c-b)); +} + +template +Complex_without_sqrt fourth_point_from_cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt cratio){ + return ( cratio*a*(c-b) + b*(a-c) ) / ( cratio*(c-b) + (a-c) ); +} + +} // namespace CGAL + +#endif // CGAL_COMPLEX_WITHOUT_SQRT diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h new file mode 100644 index 000000000000..cf69c7434b69 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -0,0 +1,212 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Hyperbolic_fundamental_domain_2 + +#ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 +#define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 + +#include "Complex_without_sqrt.h" +#include "Hyperbolic_isometry_2.h" + +#include +#include + +namespace CGAL { + +/* +Represents a convex geodesic hyperbolic domain D of a closed orientable hyperbolic surface. +The domain D is given as a convex geodesic hyperbolic polygon P given by the list of its vertices in the hyperbolic plane, +together with a pairing of the sides of P, such that every two paired sides have the same length, and such that +identifying every two paired sides in a way that respects the orientation of P would result in a closed +orientable hyperbolic surface. +*/ +template +class Hyperbolic_fundamental_domain_2 { +private: + typedef typename GeometricTraits_2::Point_2 _Point; + typedef Hyperbolic_isometry_2 _Isometry; + + std::vector<_Point> _vertices; + std::vector _pairings; + +public: + typedef GeometricTraits_2 Geometric_traits_2; + + Hyperbolic_fundamental_domain_2(); + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + + void set(const std::vector& vertices, const std::vector& pairings); + + int size() const; // Returns the number of vertices (equivalently, the number of sides) + typename GeometricTraits_2::Point_2 vertex(int index) const; // Returns the index-th vertex + int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side + Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + + void from_stream(std::istream& s); + void to_stream(std::ostream& s) const; + + bool is_valid() const; +}; + +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); +template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} + +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector<_Point>& vertices, const std::vector& pairings){ + set(vertices, pairings); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Hyperbolic_fundamental_domain_2::set(const std::vector<_Point>& vertices, const std::vector& pairings){ + _vertices = vertices; + _pairings = pairings; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +int Hyperbolic_fundamental_domain_2::size() const{ + return _vertices.size(); +} + +template +typename GeometricTraits_2::Point_2 Hyperbolic_fundamental_domain_2::vertex(int index) const{ + return _vertices[index]; +} + +template +int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ + return _pairings[index]; +} + +template +Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ + int n = size(); + int paired_index = paired_side(index); + + _Point p1,p2,q1,q2; + q1 = vertex(index); + q2 = vertex((index+1)%n); + p2 = vertex(paired_index); + p1 = vertex((paired_index+1)%n); + + _Isometry isom = segments_pairing(p1,p2,q1,q2); + return isom; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ + int n = size(); + + s << std::to_string(n) << std::endl; + + for (int k=0; k +void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ + _vertices.clear(); + _pairings.clear(); + + std::string line; + std::getline(s, line); + int size = std::stoi(line); + for (int k=0; k> p; + _vertices.push_back(p); + } +} + +//////////////////////////////////////////////////////////////////////////////// + +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ + domain.to_stream(s); + return s; +} + +template +void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ + domain.from_stream(s); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool Hyperbolic_fundamental_domain_2::is_valid()const{ + // Get the number of vertices + int n = _vertices.size(); + + // Check that the number of vertices is even + if (n%2){ + return false; + } + + // Check that there are as many side pairings as vertices + if (_pairings.size() != n){ + return false; + } + + // Check that the _pairings vector encodes a perfect matching of the set {0,1,\dots,n-1} + bool already_paired[n]; + for (int k=0; k=n)){ + return false; + } + if (already_paired[paired_side]){ + return false; + } + already_paired[paired_side] = true; + } + + // Check that the vertices all lie within the open unit disk + for (int k=0; k= typename GeometricTraits_2::FT(1)){ + return false; + } + } + + return true; +} + +} // namespace CGAL + +#endif // CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h new file mode 100644 index 000000000000..2ab7dc85ffec --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -0,0 +1,264 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Hyperbolic_fundamental_domain_factory_2 + +#ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 +#define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 + +#include "Complex_without_sqrt.h" +#include "Hyperbolic_isometry_2.h" +#include "Hyperbolic_fundamental_domain_2.h" + +#include + +#include + +namespace CGAL { + +/* +Factory class, whose only purpose is to construct random domains of genus 2 closed orientable hyperbolic surfaces, via its method generate_domain_g2. +*/ +template +class Hyperbolic_fundamental_domain_factory_2{ +private: + typedef typename GeometricTraits_2::FT _FT; + typedef Complex_without_sqrt<_FT> _Cmplx; + typedef typename GeometricTraits_2::Point_2 _Point; + + Random _random; + +public: + typedef GeometricTraits_2 Geometric_traits_2; + + Hyperbolic_fundamental_domain_factory_2(unsigned int seed); + Hyperbolic_fundamental_domain_2 generate_domain_g2(); + +private: + float random_positive_float(); // returns number in [0,1] + float random_float(); // returns number in [-1,1] + Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0 + + _FT exact_number_from_float(float x); + _Cmplx exact_complex_from_float_complex(const Complex_without_sqrt& z); + + bool try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3); + bool try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3); + + bool sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3); + + const int _DENOMINATOR_FOR_GENERATION = 10000; +}; + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ + _random = Random(seed); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ + Hyperbolic_fundamental_domain_2 domain; + + bool is_domain_generated = false; + _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; + + while (!is_domain_generated){ + // 1. Generate inexact z0,z1,z2,z3 + Complex_without_sqrt z0, z1, z2, z3; + z1 = random_complex_float(); + z2 = random_complex_float(); + z3 = random_complex_float(); + while (! try_to_compute_inexact_z0_from_z1_z2_z3(z0,z1,z2,z3)){ + z1 = random_complex_float(); + z2 = random_complex_float(); + z3 = random_complex_float(); + } + + // 2. Compute exact z0,z1,z2,z3 nearby + exact_z0 = exact_complex_from_float_complex(z0); + exact_z1 = exact_complex_from_float_complex(z1); + exact_z2 = exact_complex_from_float_complex(z2); + exact_z3 = exact_complex_from_float_complex(z3); + + // 3. Modify z3 to fix the area... + is_domain_generated = try_to_compute_exact_z3_from_z0_z1_z2(exact_z0, exact_z1, exact_z2, exact_z3); + if (is_domain_generated){ + // ... and perform a sanity check + is_domain_generated = sanity_check(exact_z0, exact_z1, exact_z2, exact_z3); + } + } + + _Cmplx exact_zero(_FT(0), _FT(0)); + std::vector<_Point> vertices; + vertices.push_back(exact_z0); + vertices.push_back(exact_z1); + vertices.push_back(exact_z2); + vertices.push_back(exact_z3); + vertices.push_back(exact_zero-exact_z0); + vertices.push_back(exact_zero-exact_z1); + vertices.push_back(exact_zero-exact_z2); + vertices.push_back(exact_zero-exact_z3); + + std::vector pairings; + for (int k=0; k<8; k++){ + pairings.push_back((k+4)%8); + } + + domain.set(vertices, pairings); + return domain; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +float Hyperbolic_fundamental_domain_factory_2::random_positive_float(){ + return _random.uniform_01(); +} + +template +float Hyperbolic_fundamental_domain_factory_2::random_float(){ + return _random.uniform_01() * 2 - 1; +} + +template +Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ + Complex_without_sqrt result (random_float(), random_positive_float()); + while (result.squared_modulus() >= 1){ + result.set_real(random_float()); + result.set_imag(random_positive_float()); + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename GeometricTraits_2::FT Hyperbolic_fundamental_domain_factory_2::exact_number_from_float(float x){ + if (x< 0){ + return _FT(0)-exact_number_from_float(-x); + } + return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION, _DENOMINATOR_FOR_GENERATION); +} + +template +Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ + return _Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag())); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ + if ( ((z2/z1).imag()<=0) || ((z3/z2).imag()<=0) ){ + return false; + } + + Complex_without_sqrt one (1,0); + Complex_without_sqrt u = (one - z1*z2.conjugate()) * (one - z2*z3.conjugate()); + float a = -(u*z1.conjugate()*z3).imag(); + float b = (u*(z3-z1.conjugate())).imag(); + float c = u.imag(); + + const float COMPUTATION_TRESHOLD = 0.00001; + if (a+b+c> 0 - COMPUTATION_TRESHOLD){ + return false; + } + + z0.set_real( 2*c/(std::sqrt(b*b-4*a*c)-b) ); + z0.set_imag(0); + return true; +} + +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ + _FT zero_number (0); + _FT one_number (1); + if ( (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ + return false; + } + + if ( (z0.squared_modulus()>=one_number) || (z1.squared_modulus()>=one_number) || (z2.squared_modulus()>=one_number) || (z3.squared_modulus()>=one_number) ){ + return false; + } + + if ( ((z1/z0).imag()<=zero_number) || ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ + return false; + } + + _Cmplx one_cmplx (_FT(1), _FT(0)); + _Cmplx two_cmplx(_FT(2), _FT(0)); + + _Cmplx f_of_z0 = two_cmplx * z0 / (z0*z0 + one_cmplx); + _Cmplx f_of_z1 = (z0 + z1) / (z0*z1 + one_cmplx); + _Cmplx f_of_z2 = (z0 + z2) / (z0*z2 + one_cmplx); + _Cmplx f_of_z3 = (z0 + z3) / (z0*z3 + one_cmplx); + + _Cmplx intermediate = (one_cmplx - f_of_z0*f_of_z1.conjugate()) * (one_cmplx - f_of_z1*f_of_z2.conjugate()); + _FT P_of_zero = intermediate.imag(); + _FT P_of_one = (intermediate * (one_cmplx-f_of_z2*f_of_z3.conjugate())).imag(); + + if (P_of_one == P_of_zero){ + return false; + } + + _FT lbda = P_of_zero / (P_of_zero - P_of_one); + _Cmplx V (lbda*(f_of_z3.real()), lbda*(f_of_z3.imag())); + + if ( (V.imag()<=zero_number) || (V.squared_modulus()>=one_number) || ((V/f_of_z2).imag()<=zero_number) ){ + return false; + } + + z3 = (V - z0) / (one_cmplx - z0*V); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ + _FT zero_number(0); + _FT one_number(1); + + // 1. Check the positions + if ( (z0.imag()!=zero_number) || (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ + return false; + } + + if ( (z0.squared_modulus()>=one_number) || (z1.squared_modulus()>=one_number) || (z2.squared_modulus()>=one_number) || (z3.squared_modulus()>=one_number) ){ + return false; + } + + if ( ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ + return false; + } + + // 2. Check the area + _Cmplx one_cmplx (one_number, zero_number); + _Cmplx Z = (one_cmplx-z0*z1.conjugate()) * (one_cmplx-z1*z2.conjugate()) *(one_cmplx-z2*z3.conjugate()) *(one_cmplx+z3*z0.conjugate()); + if (Z.imag()!=zero_number){ + return false; + } + + return true; +} + +} // namespace CGAL + +#endif // CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h new file mode 100644 index 000000000000..973882b50d0f --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -0,0 +1,185 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Hyperbolic_isometry_2 + +#ifndef CGAL_HYPERBOLIC_ISOMETRY_2 +#define CGAL_HYPERBOLIC_ISOMETRY_2 + +#include "Complex_without_sqrt.h" + +namespace CGAL { + +/* +Represents a hyperbolic isometry in the Poincare disk model the hyperbolic plane. The isometry f is stored as list (c0, c1, c2, c3) of 4 complex numbers, +so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. +*/ +template +class Hyperbolic_isometry_2{ +private: + typedef Hyperbolic_isometry_2 _Self; + typedef typename GeometricTraits_2::FT _FT; + typedef Complex_without_sqrt<_FT> _Cmplx; + typedef typename GeometricTraits_2::Point_2 _Point; + + _Cmplx _coefficients[4]; + +public: + typedef GeometricTraits_2 Geometric_traits_2; + + Hyperbolic_isometry_2(); + + void set_to_identity(); + + // Can be used to set the coefficients manually. Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + void set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3); + void set_coefficient(int index, const _Cmplx& coefficient); + + // Returns the index-th coefficient + _Cmplx get_coefficient(int index) const; + + // Evaluates the isometry at point + _Point evaluate(const _Point& point) const; + + // Returns the composition of self and other + _Self compose(const _Self& other) const; +}; + +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); + +// When inverse=false, returns the hyperbolic translation that maps -p to zero, and zero to p. Otherwise, returns the hyperbolic translation that maps p to zero, and zero to -p. +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename GeometricTraits_2::Point_2& p, bool inverse=false); + +// When inverse=false, returns the hyperbolic rotation around zero that maps p to q. Otherwise, returns the hyperbolic rotation around zero that maps q to p. +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename GeometricTraits_2::Point_2& p, const typename GeometricTraits_2::Point_2& q, bool inverse=false); + +// Returns the hyperbolic isometry that maps p1 to q1 and p2 to q2 +template +Hyperbolic_isometry_2 segments_pairing(const typename GeometricTraits_2::Point_2& p1, const typename GeometricTraits_2::Point_2& p2, const typename GeometricTraits_2::Point_2& q1, const typename GeometricTraits_2::Point_2& q2); + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ + set_to_identity(); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Hyperbolic_isometry_2::set_to_identity(){ + set_coefficients(_Cmplx(_FT(1)), + _Cmplx(_FT(0)), + _Cmplx(_FT(0)), + _Cmplx(_FT(1))); +} + +template +void Hyperbolic_isometry_2::set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3){ + set_coefficient(0, c0); + set_coefficient(1, c1); + set_coefficient(2, c2); + set_coefficient(3, c3); +} + +template +void Hyperbolic_isometry_2::set_coefficient(int index, const _Cmplx& coefficient){ + _coefficients[index] = coefficient; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +Complex_without_sqrt Hyperbolic_isometry_2::get_coefficient(int index) const{ + return _coefficients[index]; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename GeometricTraits_2::Point_2 Hyperbolic_isometry_2::evaluate(const _Point& point) const{ + _Cmplx z = point.get_z(); + _Cmplx numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; + _Cmplx denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; + + return _Point(numerator_of_the_result / denominator_of_the_result); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ + _Self result; + for (int i=0; i<2; i++){ + for (int j=0; j<2; j++){ + result.set_coefficient(2*i+j, + get_coefficient(2*i) * other.get_coefficient(j) + get_coefficient(2*i+1) * other.get_coefficient(2+j)); + } + } + return result; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry){ + for (int k=0; k<4; k++){ + s << isometry.get_coefficient(k); + } + return s; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename GeometricTraits_2::Point_2& p, bool inverse){ + Complex_without_sqrt one (typename GeometricTraits_2::FT(1)); + Complex_without_sqrt z; + if (inverse){ + z = p.get_z(); + } else { + z = - p.get_z(); + } + Hyperbolic_isometry_2 result; + result.set_coefficients(one, z, z.conjugate(), one); + return result; +} + +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename GeometricTraits_2::Point_2& p, const typename GeometricTraits_2::Point_2& q, bool inverse){ + Complex_without_sqrt zero (typename GeometricTraits_2::FT(0)); + Hyperbolic_isometry_2 result; + if (inverse){ + result.set_coefficients(p.get_z(), zero, zero, q.get_z()); + } else { + result.set_coefficients(q.get_z(), zero, zero, p.get_z()); + } + return result; +} + +template +Hyperbolic_isometry_2 segments_pairing(const typename GeometricTraits_2::Point_2& p1, const typename GeometricTraits_2::Point_2& p2, const typename GeometricTraits_2::Point_2& q1, const typename GeometricTraits_2::Point_2& q2){ + Hyperbolic_isometry_2 A,B,Binv,C; + A = hyperbolic_translation(p1); + B = hyperbolic_translation(q1); + Binv = hyperbolic_translation(q1,true); + C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); + return (Binv.compose(C)).compose(A); +} + +} // namespace CGAL + +#endif // CGAL_HYPERBOLIC_ISOMETRY_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h new file mode 100644 index 000000000000..1126b4aebd16 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -0,0 +1,673 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Hyperbolic_surface_triangulation_2 + +#ifndef CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 +#define CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 + +#include "Complex_without_sqrt.h" +#include "Hyperbolic_isometry_2.h" +#include "Hyperbolic_fundamental_domain_2.h" + +#include +#include + +#include +#include +#include + +namespace CGAL { + +/* +Represents a geodesic triangulation of a closed orientable hyperbolic surface. +The triangulation is stored as combinatorial map decorated with one cross-ratio per edge. +It is also possible to specify an anchor for the triangulation. An anchor consists in 1) a dart of the combinatorial map, belonging by definition to a vertex V and a triangle T, together with +2) three points A,B,C in the hyperbolic plane. The points A,B,C are the three vertices in counter-clockwise order of a triangle. This triangle is a lift +of T, and A is a lift of V. +*/ +template +class Hyperbolic_surface_triangulation_2{ +public: + typedef GeometricTraits_2 Geometric_traits_2; + + struct Combinatorial_map_with_cross_ratios_item{ + template + struct Dart_wrapper{ + typedef Cell_attribute> Edge_attrib; + typedef std::tuple Attributes; + }; + }; + typedef Combinatorial_map<2,Combinatorial_map_with_cross_ratios_item> Combinatorial_map_with_cross_ratios; + + struct Anchor{ + typename Combinatorial_map_with_cross_ratios::Dart_handle dart; + typename GeometricTraits_2::Point_2 vertices[3]; + }; + +private: + typedef typename Combinatorial_map_with_cross_ratios::Dart_handle _Dart_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_range _Dart_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> _Vertex_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> _Edge_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> _Face_range; + + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle _Dart_const_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range _Dart_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> _Edge_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> _Face_const_range; + + typedef typename GeometricTraits_2::FT _Number; + typedef Complex_without_sqrt<_Number> _Complex_number; + typedef typename GeometricTraits_2::Point_2 _Point; + typedef Hyperbolic_isometry_2 _Isometry; + typedef Hyperbolic_fundamental_domain_2 _Domain; + + Combinatorial_map_with_cross_ratios _combinatorial_map; + bool _has_anchor = false; + Anchor _anchor; + +public: + Hyperbolic_surface_triangulation_2() {}; + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); + Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + + //Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2&& other); + Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); + + Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); + bool has_anchor() const; + Anchor& get_anchor_ref(); + + void to_stream(std::ostream& s) const; + void from_stream(std::istream& s); + + bool is_delaunay_flippable(_Dart_handle dart) const; // Should be const + void flip(_Dart_handle dart); + // Flips Delaunay flippable edges as long as possible + int make_delaunay(); + // Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. This method is to be used only if the triangulation has an anchor. + std::vector> lift(bool center=true) const; + + bool is_valid() const; + +private: + _Dart_handle ccw(_Dart_handle dart); + _Dart_handle cw(_Dart_handle dart); + _Dart_handle opposite(_Dart_handle dart); + _Dart_const_handle const_ccw(_Dart_const_handle dart) const; + _Dart_const_handle const_cw(_Dart_const_handle dart) const; + _Dart_const_handle const_opposite(_Dart_const_handle dart) const; + + _Complex_number get_cross_ratio(_Dart_const_handle dart) const; + + _Dart_handle pick_edge_to_flip(); + + void copy_from(const Combinatorial_map_with_cross_ratios& cmap); + void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); +}; + +template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); +template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const _Domain& domain){ + // (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices) + _combinatorial_map.clear(); + int size = domain.size(); + + // Make the triangles + _Dart_handle dart_of_triangle[size-2]; + for (int k=0; k(dart_1, dart_2); + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0.get_z(),p1.get_z(),p2.get_z(),p3.get_z()))); + } + + // Sew the boundary edges and set their cross ratios + for (int k1=0; k1(dart_1, dart_2)){ + _combinatorial_map.template sew<2>(dart_1, dart_2); + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0.get_z(),p1.get_z(),p2.get_z(),p3.get_z()))); + } + } + + // Set the anchor + _anchor.dart = dart_of_triangle[0]; + _anchor.vertices[0] = domain.vertex(size-1); + _anchor.vertices[1] = domain.vertex(0); + _anchor.vertices[2] = domain.vertex(1); + _has_anchor = true; +} + +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ + copy_from(cmap); +} + +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ + copy_from(cmap, anchor); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ +Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ + if (other.has_anchor()){ + copy_from(other.get_combinatorial_map_ref(), other.get_anchor_ref()); + } + else { + copy_from(other.get_combinatorial_map_ref()); + } + return *this; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ + return _combinatorial_map; +} + +template +bool Hyperbolic_surface_triangulation_2::has_anchor() const { + return _has_anchor; +} + +template +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ + return _anchor; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(_Dart_handle dart) const{ + return ( get_cross_ratio(dart).imag()>_Number(0) ); +} + +template +void Hyperbolic_surface_triangulation_2::flip(_Dart_handle dart){ + + // First gather all the information needed + + _Dart_handle a = opposite(dart); // Get a fresh handle + _Dart_handle b = ccw(a); + _Dart_handle c = cw(a); + + _Dart_handle d = opposite(a); + _Dart_handle e = ccw(d); + _Dart_handle f = cw(d); + + _Complex_number cross_ratio_AB = get_cross_ratio(e); + _Complex_number cross_ratio_BC = get_cross_ratio(f); + _Complex_number cross_ratio_CD = get_cross_ratio(b); + _Complex_number cross_ratio_DA = get_cross_ratio(c); + _Complex_number cross_ratio_AC = get_cross_ratio(a); + + // Modify the anchor + + if (_anchor.dart == a){ + _anchor.dart = e; + _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), cross_ratio_AC)); + } else if (_anchor.dart == b){ + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), cross_ratio_AC)); + } else if (_anchor.dart == c){ + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), cross_ratio_AC)); + } else if (_anchor.dart == d){ + _anchor.dart = b; + _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), cross_ratio_AC)); + } else if (_anchor.dart == e){ + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), cross_ratio_AC)); + } else if (_anchor.dart == f){ + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), cross_ratio_AC)); + } + + // Compute the new cross ratios + + _Complex_number one (_Number(1), _Number(0)); + _Complex_number cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one) ; + _Complex_number cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC) ; + _Complex_number cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD) ; + _Complex_number cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC) ; + _Complex_number cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD) ; + + // Make the topological flip + + _combinatorial_map.template unlink_beta<1>(a); + _combinatorial_map.template unlink_beta<1>(b); + _combinatorial_map.template unlink_beta<1>(c); + + _combinatorial_map.template unlink_beta<1>(d); + _combinatorial_map.template unlink_beta<1>(e); + _combinatorial_map.template unlink_beta<1>(f); + + + _combinatorial_map.template link_beta<1>(b, a); + _combinatorial_map.template link_beta<1>(a, f); + _combinatorial_map.template link_beta<1>(f, b); + + _combinatorial_map.template link_beta<1>(e, d); + _combinatorial_map.template link_beta<1>(d, c); + _combinatorial_map.template link_beta<1>(c, e); + + // And give the new cross ratios to the edges + + _combinatorial_map.template info<1>(a) = cross_ratio_BD; + _combinatorial_map.template info<1>(e) = cross_ratio_AB_2; + _combinatorial_map.template info<1>(f) = cross_ratio_BC_2; + _combinatorial_map.template info<1>(b) = cross_ratio_CD_2; + _combinatorial_map.template info<1>(c) = cross_ratio_DA_2; + + // Take care of the particular cases where we need to "flip again" + + if (opposite(e) == b){ + _combinatorial_map.template info<1>(e) = one - (one - cross_ratio_AB_2) * (cross_ratio_AC) ; + } + + if (opposite(f) == c){ + _combinatorial_map.template info<1>(f) = one - (one - cross_ratio_BC_2) / (cross_ratio_BD) ; + } +} + +template +int Hyperbolic_surface_triangulation_2::make_delaunay(){ + int number_of_flips_done = 0; + + _Dart_handle edge_to_flip = pick_edge_to_flip(); + while (edge_to_flip != nullptr){ + flip(edge_to_flip); + edge_to_flip = pick_edge_to_flip(); + number_of_flips_done++; + } + + return number_of_flips_done; +} + + +template +std::vector::Combinatorial_map_with_cross_ratios::Dart_const_handle,typename GeometricTraits_2::Point_2,typename GeometricTraits_2::Point_2,typename GeometricTraits_2::Point_2>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ + std::vector> realizations; + + size_t visited_darts_mark = _combinatorial_map.get_new_mark(); + _combinatorial_map.unmark_all(visited_darts_mark); + + struct Compare { + bool operator()(std::pair<_Dart_const_handle,double> const & x, std::pair<_Dart_const_handle,double> const & y) { + return x.second > y.second; + } + }; + std::priority_queue, std::vector>, Compare> queue; + + std::map<_Dart_const_handle, _Complex_number> positions; + + _Dart_const_range darts = _combinatorial_map.darts(); + + _combinatorial_map.mark(_anchor.dart, visited_darts_mark); + _combinatorial_map.mark(const_ccw(_anchor.dart), visited_darts_mark); + _combinatorial_map.mark(const_cw(_anchor.dart), visited_darts_mark); + + if (center){ + _Isometry center_the_drawing = hyperbolic_translation(_anchor.vertices[0]); + positions[_anchor.dart] = center_the_drawing.evaluate(_anchor.vertices[0]).get_z(); + positions[const_ccw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[1]).get_z(); + positions[const_cw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[2]).get_z(); + } else { + positions[_anchor.dart] = _anchor.vertices[0].get_z(); + positions[const_ccw(_anchor.dart)] = _anchor.vertices[1].get_z(); + positions[const_cw(_anchor.dart)] = _anchor.vertices[2].get_z(); + } + + std::tuple<_Dart_const_handle,_Point,_Point,_Point> value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); + realizations.push_back(value); + + double weight_of_anchor_dart = CGAL::to_double(_anchor.vertices[0].get_z().squared_modulus()) + CGAL::to_double(_anchor.vertices[1].get_z().squared_modulus()); + double weight_of_ccw_anchor_dart = CGAL::to_double(_anchor.vertices[1].get_z().squared_modulus() )+ CGAL::to_double(_anchor.vertices[2].get_z().squared_modulus()); + double weight_of_cw_anchor_dart = CGAL::to_double(_anchor.vertices[2].get_z().squared_modulus()) + CGAL::to_double(_anchor.vertices[0].get_z().squared_modulus()); + + queue.push(std::make_pair(_anchor.dart, weight_of_anchor_dart)); + queue.push(std::make_pair(const_ccw(_anchor.dart), weight_of_ccw_anchor_dart)); + queue.push(std::make_pair(const_cw(_anchor.dart), weight_of_cw_anchor_dart)); + + + + while( ! queue.empty() ){ + _Dart_const_handle invader = queue.top().first; + queue.pop(); + + _Dart_const_handle invaded = const_opposite(invader); + + if (!_combinatorial_map.is_marked(invaded, visited_darts_mark)){ + _combinatorial_map.mark(invaded, visited_darts_mark); + _combinatorial_map.mark(const_ccw(invaded), visited_darts_mark); + _combinatorial_map.mark(const_cw(invaded), visited_darts_mark); + + _Complex_number a = positions[const_ccw(invader)]; + _Complex_number b = positions[const_cw(invader)]; + _Complex_number c = positions[invader]; + _Complex_number cross_ratio = get_cross_ratio(invader); + + positions[invaded] = a; + positions[const_ccw(invaded)] = c; + _Complex_number d = fourth_point_from_cross_ratio(a, b, c, cross_ratio); + positions[const_cw(invaded)] = d; + + double invaded_distance_to_zero = CGAL::to_double(a.squared_modulus()); + double invaded_ccw_distance_to_zero = CGAL::to_double(c.squared_modulus()); + double invaded_cw_distance_to_zero = CGAL::to_double(positions[const_cw(invaded)].squared_modulus()); + + double invaded_ccw_weight = invaded_ccw_distance_to_zero + invaded_cw_distance_to_zero; + double invaded_cw_weight = invaded_cw_distance_to_zero + invaded_distance_to_zero; + + queue.push( std::make_pair(const_ccw(invaded), invaded_ccw_weight) ); + queue.push( std::make_pair(const_cw(invaded), invaded_cw_weight) ); + + value = std::make_tuple(invaded, _Point(a), _Point(c), _Point(d)); + realizations.push_back(value); + } + } + + _combinatorial_map.free_mark(visited_darts_mark); + + return realizations; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +bool Hyperbolic_surface_triangulation_2::is_valid() const{ + // 1. Check the combinatorial map + + // Check that the combinatorial map is valid + if ( !_combinatorial_map.is_valid() ){ + return false; + } + + // Check that the combinatorial map has no 1,2-boundary + for (int k=1; k<3; k++){ + if ( !_combinatorial_map.is_without_boundary(k) ){ + return false; + } + } + + // 2. Check the anchor, if any + + if (_has_anchor){ + // Check that the dart handle of the anchor points to a dart of the combinatorial map + if ( !_combinatorial_map.is_dart_used(_anchor.dart) ){ + return false; + } + + // Check that the three vertices of the anchor lie within the open unit disk + for (int k=0; k<3; k++){ + if (_anchor.vertices[k].get_z().squared_modulus() >= _Number(1)){ + return false; + } + } + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ + // Give indices to the darts + std::map<_Dart_const_handle, int> darts_indices; + int current_dart_index = 0; + for (typename _Dart_const_range::const_iterator it=_combinatorial_map.darts().begin(); it!=_combinatorial_map.darts().end(); ++it){ + darts_indices[it] = current_dart_index; + current_dart_index++; + } + + // Store the number of darts + s << current_dart_index << std::endl; + + // Store the triangles + for (typename _Face_const_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<2>().begin(); it != _combinatorial_map.template one_dart_per_cell<2>().end(); ++it){ + s << darts_indices[it] << std::endl; + s << darts_indices[const_cw(it)] << std::endl; + s << darts_indices[const_ccw(it)] << std::endl; + } + + // Store the edges + for (typename _Edge_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<1>().begin(); it != _combinatorial_map.template one_dart_per_cell<1>().end(); ++it){ + s << darts_indices[it] << std::endl; + s << darts_indices[const_opposite(it)] << std::endl; + s << get_cross_ratio(it); + } + + // Store the anchor, if any + if (!_has_anchor){ + s << "no" << std::endl; + } + s << "yes" << std::endl; + s << darts_indices[_anchor.dart] << std::endl; + s << _anchor.vertices[0] << _anchor.vertices[1] << _anchor.vertices[2]; +} + +template +void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ + _combinatorial_map.clear(); + + std::string line; + getline(s, line); + int nb_darts = std::stoi(line); + + std::vector<_Dart_handle> darts_by_id (nb_darts); + int index1, index2, index3; + for (int k=0; k(dart_1, dart_2); + s >> cross_ratio; + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio)); + } + + getline(s, line); + if (line.c_str() == "no"){ + _has_anchor = false; + return; + } + _has_anchor = true; + getline(s, line); + _anchor.dart = darts_by_id[std::stoi(line)]; + s >> _anchor.vertices[0]; + s >> _anchor.vertices[1]; + s >> _anchor.vertices[2]; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ + triangulation.to_stream(s); + return s; +} + +template +void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ + triangulation.from_stream(s); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::ccw(_Dart_handle dart){ + return _combinatorial_map.beta(dart, 1); +} + +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::cw(_Dart_handle dart){ + return _combinatorial_map.beta(dart, 0); +} + +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::opposite(_Dart_handle dart){ + return _combinatorial_map.opposite(dart); +} + +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(_Dart_const_handle dart) const{ + return _combinatorial_map.beta(dart, 1); +} + +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(_Dart_const_handle dart) const{ + return _combinatorial_map.beta(dart, 0); +} + +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(_Dart_const_handle dart) const{ + return _combinatorial_map.opposite(dart); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename Hyperbolic_surface_triangulation_2::_Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(_Dart_const_handle dart) const{ + return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ + for (typename _Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ + if ( is_delaunay_flippable(it) ){ + return it; + } + } + return nullptr; +} + +//////////////////////////////////////////////////////////////////////////////// + +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ + _combinatorial_map.copy_from_const(cmap); + _has_anchor = false; +} + +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ + // Because of the anchor, we must operate the copy ourself + _combinatorial_map.clear(); + + // Copy the triangles and fill the darts conversion table + std::map<_Dart_const_handle, _Dart_handle> darts_table; + for (typename _Face_const_range::const_iterator it=cmap.template one_dart_per_cell<2>().begin(); it!=cmap.template one_dart_per_cell<2>().end(); ++it){ + _Dart_handle new_dart = _combinatorial_map.make_combinatorial_polygon(3); + darts_table[it] = new_dart; + darts_table[cmap.beta(it,0)] = _combinatorial_map.beta(new_dart,0); + darts_table[cmap.beta(it,1)] = _combinatorial_map.beta(new_dart,1); + } + + // Sew the edges and set their cross-ratios + for (typename _Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it){ + _Dart_handle dart_1 = darts_table[it]; + _Dart_handle dart_2 = darts_table[cmap.opposite(it)]; + _Complex_number cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); + + _combinatorial_map.template sew<2>(dart_1, dart_2); + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cratio)); + } + + cmap.opposite(anchor.dart); + + // Set the anchor + _anchor.dart = darts_table[anchor.dart]; + for (int k=0; k<3; k++){ + _anchor.vertices[k] = anchor.vertices[k]; + } + _has_anchor = true; +} + +} // namespace CGAL + +#endif // CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h new file mode 100644 index 000000000000..60c4548d036d --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h @@ -0,0 +1,64 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +// This file contains the declaration and the implementation of the class Hyperbolic_surfaces_traits_2 + +#ifndef CGAL_HYPERBOLIC_SURFACES_TRAITS_2 +#define CGAL_HYPERBOLIC_SURFACES_TRAITS_2 + +#include "Complex_without_sqrt.h" +#include + +namespace CGAL { + +template +class Hyperbolic_point_2 { +private: + ComplexType _z; + +public: + typedef ComplexType Complex; + + Hyperbolic_point_2() { _z = Complex(); } + Hyperbolic_point_2(const Complex& z) { _z = z; } + + Complex get_z() const { return _z; } + void set_z(const Complex& z) { _z = z; } +}; + +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_point_2& point) { + s << point.get_z(); + return s; +} + +template +void operator>>(std::istream& s, Hyperbolic_point_2& point) { + ComplexType z; + s >> z; + point.set_z(z); +} + +/* +Traits class offered by CGAL. +*/ +template +class Hyperbolic_surfaces_traits_2 { +public: + typedef FieldType FT; + typedef Complex_without_sqrt Complex; + typedef Hyperbolic_point_2 Point_2; +}; + +} // namespace CGAL + +#endif // CGAL_HYPERBOLIC_SURFACES_TRAITS_2 diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/copyright b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/copyright new file mode 100644 index 000000000000..f6c522d5bf53 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/copyright @@ -0,0 +1,3 @@ +INRIA Nancy -- France +Université de Lorraine -- France +Université Gustave Eiffel Marne-la-Vallee -- France diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies new file mode 100644 index 000000000000..9d8c303c7eb9 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -0,0 +1 @@ +Combinatorial_map diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/description.txt b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/description.txt new file mode 100644 index 000000000000..a4ee45a0d2a6 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/description.txt @@ -0,0 +1,5 @@ +Package Hyperbolic_surface_triangulation_2 : provides +triangulations of closed oriented hyperbolic surfaces, +Delaunay flip algorithm on those triangulations, +construction of the triangulations from convex geodesic fundamental domains, +construction of such domains for genus 2 surfaces diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/license.txt b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/license.txt new file mode 100644 index 000000000000..8bb8efcb72b0 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/license.txt @@ -0,0 +1 @@ +GPL (v3 or later) diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/maintainer b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/maintainer new file mode 100644 index 000000000000..6f51f82623f5 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/maintainer @@ -0,0 +1,3 @@ +Vincent Despré +Loïc Dubois +Monique Teillaud diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt new file mode 100644 index 000000000000..f66d05b57bb4 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -0,0 +1,18 @@ +# Created by the script cgal_create_cmake_script +# This is the CMake script for compiling a CGAL application. + +cmake_minimum_required(VERSION 3.1...3.23) +project(Hyperbolic_surfaces_Tests) + +find_package(CGAL REQUIRED) + +set(CMAKE_BUILD_TYPE "Debug") + +# create a target per cppfile +file( + GLOB cppfiles + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +foreach(cppfile ${cppfiles}) + create_single_source_cgal_program("${cppfile}") +endforeach() diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp new file mode 100644 index 000000000000..d4dc8492bda2 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -0,0 +1,104 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include +#include +#include + +using namespace CGAL; + +typedef Complex_without_sqrt Complex_gmpq; +typedef Complex_without_sqrt Complex_integer; +typedef Complex_without_sqrt> Complex_interval; + + +int main() { + // Complex_gmpq tests : + Complex_gmpq zero_gmpq = Complex_gmpq (); + assert( zero_gmpq == Complex_gmpq(Gmpq(0), Gmpq(0)) ); + + Complex_gmpq one_gmpq (Gmpq(1)); + assert( one_gmpq == Complex_gmpq(Gmpq(1), Gmpq(0)) ); + + Complex_gmpq z1_gmpq (Gmpq(1,2), Gmpq(-3)); + z1_gmpq = -z1_gmpq; + + Complex_gmpq z2_gmpq; + z2_gmpq.set_real(Gmpq(-5,7)); + z2_gmpq.set_imag(Gmpq(11,13)); + z2_gmpq = z2_gmpq.conjugate() + z1_gmpq - one_gmpq; + + assert( - z1_gmpq * z1_gmpq / z2_gmpq == -Complex_gmpq(Gmpq(855491,632146), Gmpq(844298,316073)) ); + + assert( z1_gmpq.real() == Gmpq(-1,2) ); + assert( z1_gmpq.imag() == Gmpq(3) ); + assert( z1_gmpq.squared_modulus() == Gmpq(37,4) ); + assert( z1_gmpq != z2_gmpq); + assert( z2_gmpq == z2_gmpq ); + assert( z2_gmpq == Complex_gmpq(Gmpq(-31,14), Gmpq(28,13)) ); + + std::cout << "printing a complex for test purposes : " << std::endl << z2_gmpq << std::endl; + + Complex_gmpq cr_gmpq = cross_ratio(z1_gmpq, -z2_gmpq, z1_gmpq.conjugate(), z2_gmpq); + assert( fourth_point_from_cross_ratio(z1_gmpq,-z2_gmpq,z1_gmpq.conjugate(),cr_gmpq) == z2_gmpq); + + Complex_gmpq z3_gmpq; + std::stringstream buffer; + buffer << z2_gmpq; + buffer >> z3_gmpq; + assert( z3_gmpq == z2_gmpq ); + + // Complex_integer tests : + Complex_integer zero_integer = Complex_integer (); + assert( zero_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); + + Complex_integer one_integer (Exact_integer(1)); + assert( one_integer == Complex_integer(Exact_integer(1), Exact_integer(0)) ); + + Complex_integer z1_integer (Exact_integer(17), Exact_integer(-13)); + z1_integer = -z1_integer; + + Complex_integer z2_integer; + z2_integer.set_real(Exact_integer(-7)); + z2_integer.set_imag(Exact_integer(43)); + z2_integer = z2_integer.conjugate() + z1_integer - one_integer; + + assert( z1_integer * z1_integer / z2_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); + + assert( z1_integer.real() == Exact_integer(-17) ); + assert( z1_integer.imag() == Exact_integer(13) ); + assert( z1_integer.squared_modulus() == 458 ); + assert( z1_integer != z2_integer); + assert( z2_integer == z2_integer ); + assert( z2_integer == Complex_integer(Exact_integer(-25),Exact_integer(-30)) ); + + std::cout << "printing a complex for test purposes : " << std::endl << z2_integer << std::endl; + + Complex_integer cr_integer = cross_ratio(z1_integer, -z2_integer, z1_integer.conjugate(), z2_integer); + Complex_integer not_z2_integer = fourth_point_from_cross_ratio(z1_integer,-z2_integer,z1_integer.conjugate(),cr_integer); + assert( not_z2_integer != z2_integer); + assert( not_z2_integer == Complex_integer(Exact_integer(0),Exact_integer(26)) ); + + Complex_integer z3_integer; + buffer << z2_integer; + buffer >> z3_integer; + assert( z3_integer == z2_integer ); + + // Complex_interval test : + Complex_interval z_interval (Interval_nt<>(1, 2), Interval_nt<>(1, 2)); + assert( (z_interval * z_interval / Complex_interval(Interval_nt<>(5, 6))).squared_modulus() < Interval_nt<>(10,20) ); + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp new file mode 100644 index 000000000000..051bd16693e7 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -0,0 +1,87 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include + +#include + +using namespace CGAL; + +typedef Gmpq FT; + +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; + +typedef typename Traits::Point_2 Point; +typedef Complex_without_sqrt Complex; + + +int main() { + std::vector vertices; + Complex z0 = Complex (FT(809,10000),FT(0)); + Complex z1 = Complex (FT(7359,10000),FT(1877,10000)); + Complex z2 = Complex (FT(-999,2500),FT(881,1000)); + Complex z3 = Complex (FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")); + vertices.push_back( Point(z0) ); + vertices.push_back( Point(z1) ); + vertices.push_back( Point(z2) ); + vertices.push_back( Point(z3) ); + vertices.push_back( Point(-z0) ); + vertices.push_back( Point(-z1) ); + vertices.push_back( Point(-z2) ); + vertices.push_back( Point(-z3) ); + + std::vector pairings; + for (int k=0; k<8; k++){ + pairings.push_back((k+4)%8); + } + + Domain domain = Domain(vertices, pairings); + assert( domain.size()==8 ); + for (int k=0; k<8; k++){ + assert( domain.vertex(k).get_z()==vertices[k].get_z()); + assert( domain.paired_side(k)==(k+4)%8 ); + + assert( domain.side_pairing(k).evaluate(domain.vertex((k+4)%8)).get_z()==domain.vertex((k+1)%8).get_z() ); + assert( domain.side_pairing(k).evaluate(domain.vertex((k+5)%8)).get_z()==domain.vertex(k).get_z() ); + } + + assert( domain.is_valid() ); + + Domain domain_prime; + domain_prime.set(vertices, pairings); + assert( domain_prime.size()==8 ); + for (int k=0; k<8; k++){ + assert( domain_prime.vertex(k).get_z()==vertices[k].get_z()); + assert( domain_prime.paired_side(k)==(k+4)%8 ); + + assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+4)%8)).get_z()==domain_prime.vertex((k+1)%8).get_z() ); + assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+5)%8)).get_z()==domain_prime.vertex(k).get_z() ); + } + + Domain domain_ter = Domain(); + std::stringstream buffer; + buffer << domain; + buffer >> domain_ter; + assert( domain_ter.size()==8 ); + for (int k=0; k<8; k++){ + assert( domain_ter.vertex(k).get_z()==vertices[k].get_z()); + assert( domain_ter.paired_side(k)==(k+4)%8 ); + } + + std::cout << "printing a domain for test purposes : " << std::endl << domain << std::endl; + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp new file mode 100644 index 000000000000..0936b0455c5c --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -0,0 +1,57 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include + +#include + +using namespace CGAL; + +typedef Gmpq FT; + +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; + +typedef typename Traits::Point_2 Point; +typedef Complex_without_sqrt Complex; + + +int main() { + Factory factory (3459); + Domain domain = factory.generate_domain_g2(); + + std::vector vertices; + Complex z0 = Complex (FT("4881/5000"),FT("0")); + Complex z1 = Complex (FT("9211/10000"),FT("2733/10000")); + Complex z2 = Complex (FT("1709/5000"),FT("7253/10000")); + Complex z3 = Complex (FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + vertices.push_back( Point(z0) ); + vertices.push_back( Point(z1) ); + vertices.push_back( Point(z2) ); + vertices.push_back( Point(z3) ); + vertices.push_back( Point(-z0) ); + vertices.push_back( Point(-z1) ); + vertices.push_back( Point(-z2) ); + vertices.push_back( Point(-z3) ); + + assert( domain.size()==8 ); + for (int k=0; k<8; k++){ + assert( domain.vertex(k).get_z()==vertices[k].get_z()); + assert( domain.paired_side(k)==(k+4)%8 ); + } + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp new file mode 100644 index 000000000000..7115b0214666 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -0,0 +1,95 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later EOR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include + +#include + +using namespace CGAL; + +typedef Gmpq FT; + +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_isometry_2 Isometry; + +typedef typename Traits::Point_2 Point; +typedef Complex_without_sqrt Complex; + + +int main() { + Isometry identity_1 = Isometry (); + assert( identity_1.get_coefficient(0)==Complex(FT(1)) ); + assert( identity_1.get_coefficient(1)==Complex(FT(0)) ); + assert( identity_1.get_coefficient(2)==Complex(FT(0)) ); + assert( identity_1.get_coefficient(3)==Complex(FT(1)) ); + + Isometry identity_2; + identity_2.set_to_identity(); + assert( identity_2.get_coefficient(0)==Complex(FT(1)) ); + assert( identity_2.get_coefficient(1)==Complex(FT(0)) ); + assert( identity_2.get_coefficient(2)==Complex(FT(0)) ); + assert( identity_2.get_coefficient(3)==Complex(FT(1)) ); + + Isometry f; + f.set_coefficient(0, Complex(FT(-12,17), FT(1,3))); + f.set_coefficient(1, Complex(FT(56,7), FT(21,5))); + f.set_coefficient(2, Complex(FT(56,7), FT(-21,5))); + f.set_coefficient(3, Complex(FT(-12,17), FT(-1,3))); + assert( f.get_coefficient(0)==Complex(FT(-12,17), FT(1,3)) ); + assert( f.get_coefficient(1)==Complex(FT(56,7), FT(21,5)) ); + assert( f.get_coefficient(2)==Complex(FT(56,7), FT(-21,5)) ); + assert( f.get_coefficient(3)==Complex(FT(-12,17), FT(-1,3)) ); + + Isometry g; + g.set_coefficients(Complex(FT(-12,17), FT(1,3)), Complex(FT(56,7), FT(21,5)), Complex(FT(56,7), FT(-21,5)), Complex(FT(-12,17), FT(-1,3))); + assert( g.get_coefficient(0)==Complex(FT(-12,17), FT(1,3)) ); + assert( g.get_coefficient(1)==Complex(FT(56,7), FT(21,5)) ); + assert( g.get_coefficient(2)==Complex(FT(56,7), FT(-21,5)) ); + assert( g.get_coefficient(3)==Complex(FT(-12,17), FT(-1,3)) ); + + Isometry h = f.compose(g); + assert( h.get_coefficient(0) == Complex(FT(5333816,65025),FT(-8,17)) ); + assert( h.get_coefficient(1) == Complex(FT(-192,17),FT(-504,85)) ); + assert( h.get_coefficient(2) == Complex(FT(-192,17),FT(504,85)) ); + assert( h.get_coefficient(3) == Complex(FT(5333816,65025),FT(8,17)) ); + + Point point (Complex(FT(3,11),FT(-1,73))); + Point image_point = h.evaluate(point); + assert( image_point.get_z()==Complex(FT(9146011623056232,66567955527962869), FT(-12617302915955411,133135911055925738)) ); + + std::cout << "printing an isometry for test purposes : " << std::endl << h; + + Isometry tau_1 = hyperbolic_translation(point); + Isometry tau_1_prime = hyperbolic_translation(Point(-point.get_z()), true); + Isometry tau_1_inv = hyperbolic_translation(point, true); + assert( tau_1.evaluate(image_point).get_z() == tau_1_prime.evaluate(image_point).get_z() ); + assert( tau_1.compose(tau_1_inv).evaluate(image_point).get_z() == image_point.get_z() ); + + Point p (Complex(FT(2,15),FT(0))); + Point q (Complex(FT(0),FT(17,93))); + Isometry rotation = hyperbolic_rotation(p, q); + Isometry rotation_prime = hyperbolic_rotation(q, p, true); + Isometry rotation_inv = hyperbolic_rotation(p, q, true); + assert( rotation.evaluate(image_point).get_z() == rotation_prime.evaluate(image_point).get_z() ); + assert( rotation.compose(rotation_inv).evaluate(image_point).get_z() == image_point.get_z() ); + + Point p_imag = rotation.evaluate(p); + Point q_imag = rotation.evaluate(q); + Isometry pairing = segments_pairing(p, q, p_imag, q_imag); + assert( pairing.evaluate(p).get_z() == p_imag.get_z() ); + assert( pairing.evaluate(q).get_z() == q_imag.get_z() ); + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp new file mode 100644 index 000000000000..90f73da4b4a1 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -0,0 +1,95 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include + +#include +#include + +#include + +using namespace CGAL; + +typedef Gmpq FT; + +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_surface_triangulation_2 Triangulation; + +typedef typename Traits::Point_2 Point; +typedef Complex_without_sqrt Complex; + +Domain build_domain(){ + // + std::vector vertices; + Complex z0 = Complex (FT(809,10000),FT(0)); + Complex z1 = Complex (FT(7359,10000),FT(1877,10000)); + Complex z2 = Complex (FT(-999,2500),FT(881,1000)); + Complex z3 = Complex (FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")); + vertices.push_back( Point(z0) ); + vertices.push_back( Point(z1) ); + vertices.push_back( Point(z2) ); + vertices.push_back( Point(z3) ); + vertices.push_back( Point(-z0) ); + vertices.push_back( Point(-z1) ); + vertices.push_back( Point(-z2) ); + vertices.push_back( Point(-z3) ); + + std::vector pairings; + for (int k=0; k<8; k++){ + pairings.push_back((k+4)%8); + } + + return Domain(vertices, pairings); +} + +int main() { + Domain domain = build_domain(); + Triangulation triangulation0 = Triangulation(domain); + + assert( triangulation0.is_valid() ); + + Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + assert( ! triangulation1.has_anchor() ); + + Triangulation triangulation (triangulation0); + assert( triangulation.has_anchor() ); + + std::stringstream buffer; + buffer << triangulation; + buffer >> triangulation; + + std::vector> input_not_centered; + std::vector> input_centered; + + input_not_centered = triangulation.lift(false); + input_centered = triangulation.lift(); + + triangulation.make_delaunay(); + + std::vector> output_not_centered; + std::vector> output_centered; + + output_not_centered = triangulation.lift(false); + output_centered = triangulation.lift(); + + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); + Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + assert( cmap.is_dart_used(anchor.dart) ); + + std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; + + return 0; +} From a3b1e0ff951663673d858abe6bfda9d4a3636988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Thu, 7 Mar 2024 08:31:29 +0100 Subject: [PATCH 03/97] remplissage du README --- Hyperbolic_surface_triangulation_2/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Hyperbolic_surface_triangulation_2/README.md b/Hyperbolic_surface_triangulation_2/README.md index e69de29bb2d1..f6a6ea1c4b62 100644 --- a/Hyperbolic_surface_triangulation_2/README.md +++ b/Hyperbolic_surface_triangulation_2/README.md @@ -0,0 +1,3 @@ +This folder contains the package Hyperbolic_surface_triangulation_2. +It is curently being implemented by Vincent Despré, Loïc Dubois, and Monique Teillaud, +on the branch Hyperbolic_surface_triangulation_2-dubois of the cgal-public-dev git repository From 4ee74eeca5f53c54b09fff46a19fc1c0e15a611c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Thu, 7 Mar 2024 09:06:08 +0100 Subject: [PATCH 04/97] bug fix --- .../data/domain | 28 ++++----- .../data/input triangulation | 46 +++++++------- .../data/output triangulation | 62 +++++++++---------- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- .../CMakeLists.txt | 8 ++- 5 files changed, 74 insertions(+), 72 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain index 5939e6f119b7..70b516242171 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain @@ -7,19 +7,19 @@ 1 2 3 -1721/2000 +2027/2500 0/1 -8297/10000 -997/2500 -973/2500 -3009/5000 --584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 -67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 --1721/2000 +5623/10000 +1381/2000 +-7303/10000 +5877/10000 +-17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 +2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 +-2027/2500 0/1 --8297/10000 --997/2500 --973/2500 --3009/5000 -584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 --67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 +-5623/10000 +-1381/2000 +7303/10000 +-5877/10000 +17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 +-2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation index c08e1da027d8..fdc326d32951 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation @@ -19,45 +19,45 @@ 16 0 10 -896701229169842316950778203921975299064799643047659888106604438865344122820470157109887326082655761782553837544845179039175965417376791705867959/836273609320463514257483502681591523195236133061833744679179961712375794839959310433487318612410083059534534374688536207317345206401599134643119 --19418507259061085619641689630640435984058171714545812936668146813850872294503145021257674940489083696672741491020528007004076175353707739983400/278757869773487838085827834227197174398412044353944581559726653904125264946653103477829106204136694353178178124896178735772448402133866378214373 +28420988661206193112410471406865653480821499188579357717668080451690842920968426758583135907659768774713720119912790791185070874098233686780195429319/26348950819294182187872263009403486634713324397019366561449905525328808691896270721267483873389832034727231370191299431167160919958140993316502917445 +-2404538879933267642777630304299735569322254565903814856745649416566573975590902341070517578292329144271947225670478693091680622836138103004881505144/8782983606431394062624087669801162211571108132339788853816635175109602897298756907089161291129944011575743790063766477055720306652713664438834305815 1 13 -612526212307657122897283474650197304139092804905297877204014744573070303286884936896852229873588177834368/268103628966051285784934529104328848940358137385395645516169556929497519298241774099617399655238699425405 --126866944662215918736790372507835381715141117045424130852646659152111867828591326651863500422593516163456/53620725793210257156986905820865769788071627477079129103233911385899503859648354819923479931047739885081 +13885685022887221708962509493130786556744849938228788796014658838668929213631737532747954153742288585351/4003045376498378261282826146069655984499184237081749368578114611644322319279155688162925723568565254232 +-1550836259621317325619722252725149302030717066483658139293387980262704037166594069611892285446473660646/500380672062297282660353268258706998062398029635218671072264326455540289909894461020365715446070656779 2 3 -292757743353761913700416163798561097670587748179632894407/200223882381056640535012846606905483500479752699253729232 -63235513168014260631979850586520955690547033479588418425/200223882381056640535012846606905483500479752699253729232 +20671890046913083125443843482835819197559610291419589791/15246357242531219968159426993923084249395307032856382375 +1906881296592916150113875965683579128555275655166384288/15246357242531219968159426993923084249395307032856382375 4 16 -39017739378376859671635519553251855672697407454962670971580661651756594046799896250917858374792225039222500/36194525468858915867966240853968723024591738680447791797837199355557292028886418490926343082528821336758937 --10110010347593994717655310866751050414616898955759844971696270543225880906701059679652405693790111742302000/36194525468858915867966240853968723024591738680447791797837199355557292028886418490926343082528821336758937 +248565352715153569680655794516070716410284888675207762463544817228186230149466784500368954370594078928760928/173760445921916332296717903702635733588834713453645104526118404558462610364662162245348245076054525670139685 +-6637860397068536307648829539253011931075586120384132701140107460858099310509760889628577898555129917082224/173760445921916332296717903702635733588834713453645104526118404558462610364662162245348245076054525670139685 5 6 -16386954112362118849893737673691839899857761289274691974066102993356785784090578947618621134033023/8029762654144910858311165247455758589048952750629461836912666173164806273658037920591484075858100 --1226107841240673207943534675582483618175989649224411866651697927336902093838254338356724368297242/2007440663536227714577791311863939647262238187657365459228166543291201568414509480147871018964525 +26581016296394455628836280697573509238188288202986961097331691311570983547957512661340579233943473229/24135695309954776544435784551907901455787932364000117836381688773921574800864284554895411643173702408 +87256257496473971112884245019865617883405072393372885180583928426293560818305008522260782798909767/6033923827488694136108946137976975363946983091000029459095422193480393700216071138723852910793425602 7 17 -1125712354658797994013499184396044742419066717007699560150752472903083789058454300593244875307393115155864036187286402/50267607787145624009355102870848298960698836467148462446350984661015489935778799597715078173979128717356145492937775 --499668034370185732825650181787245575339304954348449681187747887409263529311593980676881472269733377028169064175326864/16755869262381874669785034290282766320232945489049487482116994887005163311926266532571692724659709572452048497645925 +509943056213462511763569133958167755258336989562384895609489315559217300881670514971669540308896946883999102950611312837/377913958066399532184913711878571326588366211075072835640619862683470447854115574045781001519058565019720657932161132650 +-140294952657349587329020680407186584367712182346429581785352735342928699370080510781667022273194026661451326450330306848/188956979033199766092456855939285663294183105537536417820309931341735223927057787022890500759529282509860328966080566325 8 9 -3855380604793743114664598142710571658961987628425914636083790543987304596963260842364391848666429764/2960876086935830849632285481339452152137057777179564950200402443984968517922476602645053219024569985 -94740963166973714836593750733609123151127530206849785596930490104564314904153840793451777019095344/592175217387166169926457096267890430427411555435912990040080488796993703584495320529010643804913997 +1059592271049337519260424925956401042510141082546478728946816733839283682556476552837375405842308587/360647593298271372500711004758741424957897315109638521771495166624054342892333877357175401300395522 +62816583782837245122557832993399711140805067126840394101843933989616619042874133866797304301640910/180323796649135686250355502379370712478948657554819260885747583312027171446166938678587700650197761 11 12 -129345186192739994985821269587675886373548476906530358999591627249871675767789694680365/71898272113645362898658521736319041021246451843682241314224502488958533735315294448269 --495084608465374272144682061192614451658443208919129768772642926658378406836183660000/1943196543612036835098878965846460568141795995775195711195256824025906317170683633737 +3845076076615863722030736813226948070219009788514940925863084143579270593986411591914/1179403121669406826165697824095415219819299168880309933916647213934246736645596186883 +-976396915396769110421348824590540585453303655972333805651420529241568116456011912008/1179403121669406826165697824095415219819299168880309933916647213934246736645596186883 14 15 -40234647714189718951770957123453287121367648424671210059/16943252742601085273354734346088013718957234842831647184 -19565855810717555713157695504221568019635710973479859125/16943252742601085273354734346088013718957234842831647184 +1550446710576274056064509594325815470640369515041010847777/105876827551624232983731436886040926145614019552430479025 +-56864113906106103904288465411064332821624901647345185664/105876827551624232983731436886040926145614019552430479025 yes 0 -584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 --67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 -1721/2000 +17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 +-2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 +2027/2500 0/1 -8297/10000 -997/2500 +5623/10000 +1381/2000 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation index 5203fbf7241c..1547455f8e95 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation @@ -1,63 +1,63 @@ 18 0 -9 17 +16 1 -3 +5 4 2 +13 +11 +3 +10 +7 6 +9 14 -5 -7 -10 8 15 12 -11 -16 -13 0 10 -18195567661043388321076855556959719917759050071767933983285571057371364797794557152364809859901685376580552389521843458846162587/6757245472363007627761723083729069711091670525041068540805447968677630688464262220985281019261151894167988503313979393964593476 --38727048897481644431758256667652356750029406167380835680726805394366801250505492150949541023823813855133417142071486928863540/80443398480511995568591941472965115608234172917155577866731523436638460576955502630777154991204189216285577420404516594816589 +832944873550935028540979334654149259660823883894492485701069200142117539337542310789133791013490739754000/275874942707865024086292143471076506264161593549608641277690599605026620932826030999791763089772372375773 +-23737333289981402773576986226544989370660234572614244022031950374571531170015809202736573884798834835320/8359846748723182548069458893062924432247321016654807311445169685000806694934122151508841305750677950781 1 13 -83135210412050844990876670942720624/51331607131902553763356685654104999 --651914263495057825211060831590000/2231809005734893641885073289308913 +11596725097274648158101750208259805274985600479839716165708670441400583305622693255/8905093373015059946637180960935737323087695838469670146996810066775767927012119664 +-796627300098838787379374972037414350144306256933948808852257217694518754078820705/3895978350694088726653766670409385078850866929330480689311104404214398468067802353 2 3 -1576963458116301/905198335895005 --75848680193040/181039667179001 +1170718673783098457504962540509963940173862171699525163000757/445805974341412533407390534346477221936417272886088631726825 +-223444574457306820743419964010705032943337101005899229944698/1872385092233932640311040244255204332132952546121572253252665 4 16 -12060661519716818963506111814322175/6270159993959813076667344519490408 --67996204770519583494008546414763075/100322559903357009226677512311846528 +1170718673783098457504962540509963940173862171699525163000757/445805974341412533407390534346477221936417272886088631726825 +-223444574457306820743419964010705032943337101005899229944698/1872385092233932640311040244255204332132952546121572253252665 5 6 -204361294251804088802703246436030609036619274974162022413815249074266835786419365561463487427307371/128514590765766229462566024141695823942788821679987346566296639772568791951007891175511329624459570 --4955283320261524656837486455181693879971941047972874080245773430406035789653478448202213151176233/64257295382883114731283012070847911971394410839993673283148319886284395975503945587755664812229785 +3178572099275931831371139366967716/1574894514393982813905236944249121 +-24733327192913025548867709893910/1574894514393982813905236944249121 7 17 -973755260680312569549737378678480690224980985377643476129981597379982368624676413574881931631974048615809/525620953341058206421216005856234769587811902284040712290314729060371717086009007717151540173584583930517 --10755871234491049293468181500862777506729565167309567788123812052253582963686678377811772717578967323840/175206984447019402140405335285411589862603967428013570763438243020123905695336335905717180057861527976839 +818778929949596729543895917707767786817761361728408009167246191425918090828160098057269976253/698941498909555872980911482391360967694843235471080268258701443545315974487400441161685387377 +-197076295692074664093052455831274432019224078037726328505297462827689241869435837683661902032/698941498909555872980911482391360967694843235471080268258701443545315974487400441161685387377 8 9 -204361294251804088802703246436030609036619274974162022413815249074266835786419365561463487427307371/128514590765766229462566024141695823942788821679987346566296639772568791951007891175511329624459570 --4955283320261524656837486455181693879971941047972874080245773430406035789653478448202213151176233/64257295382883114731283012070847911971394410839993673283148319886284395975503945587755664812229785 +3033780121996338077176376016679693247151819392847305500560092243031349741/1619942182212637093453207878840761263411255631618443554804646205342503081 +-324642612442875660390065886122587475676401528271149128428894139743532128/1619942182212637093453207878840761263411255631618443554804646205342503081 11 12 -1576963458116301/905198335895005 --75848680193040/181039667179001 +3178572099275931831371139366967716/1574894514393982813905236944249121 +-24733327192913025548867709893910/1574894514393982813905236944249121 14 15 -504671729350640/126441191321787 --522038573787080/379323573965361 +479138244477771883909362688118193406651001823369309297735487603979587/245467844779315108261479919873213696110554275428795440769104768818092 +-3275908497158874787649292877974073724256841089456879658430656728127/20455653731609592355123326656101141342546189619066286730758730734841 yes 0 -584490079395802323669717644228096220387206504/745654440789744515084220927252329535057645125 --67066463242621371932023467870959384145497553/119304710526359122413475348360372725609223220 -1721/2000 +17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 +-2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 +2027/2500 0/1 -23513497064637073157996450283975485664984012564403292419722236899967937716450097073282/43801488807673672885622465838606712062781193139687231043122765571946602855619999100125 --27351402317671279567466786112238290146624729895330335308684166610381159917117851336431/35041191046138938308497972670885369650224954511749784834498212457557282284495999280100 +7303/10000 +-5877/10000 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 1126b4aebd16..d4e05689d65e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -630,7 +630,7 @@ typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyp template void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ - _combinatorial_map.copy_from_const(cmap); + _combinatorial_map.copy(cmap); _has_anchor = false; } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt index f66d05b57bb4..9211bce482d4 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -2,11 +2,13 @@ # This is the CMake script for compiling a CGAL application. cmake_minimum_required(VERSION 3.1...3.23) -project(Hyperbolic_surfaces_Tests) +project(Hyperbolic_surface_triangulation_2_Tests) find_package(CGAL REQUIRED) -set(CMAKE_BUILD_TYPE "Debug") +set(CMAKE_BUILD_TYPE "Release") + +include_directories(../../include/) # create a target per cppfile file( @@ -14,5 +16,5 @@ file( RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) foreach(cppfile ${cppfiles}) - create_single_source_cgal_program("${cppfile}") + create_single_source_cgal_program("${cppfile}" ../../include/) endforeach() From 3aab28f31bc38254cf36b9efc1c5db45fac18003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Wed, 20 Mar 2024 15:02:20 +0100 Subject: [PATCH 05/97] changed cmap copy into copy from const --- .../data/domain | 28 ++++---- .../data/input triangulation | 46 ++++++------- .../data/output triangulation | 64 +++++++++---------- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- 4 files changed, 70 insertions(+), 70 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain index 70b516242171..15576642ef7b 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain @@ -7,19 +7,19 @@ 1 2 3 -2027/2500 +3807/5000 0/1 -5623/10000 -1381/2000 --7303/10000 -5877/10000 --17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 -2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 --2027/2500 +7849/10000 +1933/5000 +2279/10000 +2141/2500 +-421009105840980225074917780627142441938601151619/670507610148857944771058951102082692403640006250 +220968777263043523764720183771489462205696797516/335253805074428972385529475551041346201820003125 +-3807/5000 0/1 --5623/10000 --1381/2000 -7303/10000 --5877/10000 -17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 --2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 +-7849/10000 +-1933/5000 +-2279/10000 +-2141/2500 +421009105840980225074917780627142441938601151619/670507610148857944771058951102082692403640006250 +-220968777263043523764720183771489462205696797516/335253805074428972385529475551041346201820003125 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation index fdc326d32951..e27c30d9fed9 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation @@ -19,45 +19,45 @@ 16 0 10 -28420988661206193112410471406865653480821499188579357717668080451690842920968426758583135907659768774713720119912790791185070874098233686780195429319/26348950819294182187872263009403486634713324397019366561449905525328808691896270721267483873389832034727231370191299431167160919958140993316502917445 --2404538879933267642777630304299735569322254565903814856745649416566573975590902341070517578292329144271947225670478693091680622836138103004881505144/8782983606431394062624087669801162211571108132339788853816635175109602897298756907089161291129944011575743790063766477055720306652713664438834305815 +3207582665060445312510190389734740510435913506243722623056709524794695670308507678498258126185141487404272126023156423977068921018151957678647736166502696497/3052120718576917586074145737726398217268350062484915437623331785948783179016358340611563372454939139756302631736385402344904718110708760107985931785344112595 +-352109829611789350279703762946441907449042512834932190964431154741226214342554086002291398551972591391212504101140976157844081983587818901876601535970551416/3052120718576917586074145737726398217268350062484915437623331785948783179016358340611563372454939139756302631736385402344904718110708760107985931785344112595 1 13 -13885685022887221708962509493130786556744849938228788796014658838668929213631737532747954153742288585351/4003045376498378261282826146069655984499184237081749368578114611644322319279155688162925723568565254232 --1550836259621317325619722252725149302030717066483658139293387980262704037166594069611892285446473660646/500380672062297282660353268258706998062398029635218671072264326455540289909894461020365715446070656779 +218202410842807367583532385374755196504163078063375166632047750539529792181828106834881967618747619616592990896/220750496553914186513836557566933042174871452475312142830320675103282342469229007575837213751391812665603567101 +-6403625810833993971298431692710779969668232676117076112841497956775680447723944233184854005908086939598833540608/2428255462093056051652202133236263463923585977228433571133527426136105767161519083334209351265309939321639238111 2 3 -20671890046913083125443843482835819197559610291419589791/15246357242531219968159426993923084249395307032856382375 -1906881296592916150113875965683579128555275655166384288/15246357242531219968159426993923084249395307032856382375 +3397462559704117184770228267748233615801122845901132900659533/1976890539892753179635939957089741239253603849617404341563905 +726849358652602235325322199161472487733786244630863161155284/1976890539892753179635939957089741239253603849617404341563905 4 16 -248565352715153569680655794516070716410284888675207762463544817228186230149466784500368954370594078928760928/173760445921916332296717903702635733588834713453645104526118404558462610364662162245348245076054525670139685 --6637860397068536307648829539253011931075586120384132701140107460858099310509760889628577898555129917082224/173760445921916332296717903702635733588834713453645104526118404558462610364662162245348245076054525670139685 +3403089434470159237087237572199942568205944370851336558670996184753401539380735329491959421725104670018109128256768/1858528552656267406719388482483691389849632688217230503905419893668395980530224909676364960805160892702853049351267 +-994224440192780129108961358001425211978165993695844176683711534953456214334310124694710238429138564867832563492608/1858528552656267406719388482483691389849632688217230503905419893668395980530224909676364960805160892702853049351267 5 6 -26581016296394455628836280697573509238188288202986961097331691311570983547957512661340579233943473229/24135695309954776544435784551907901455787932364000117836381688773921574800864284554895411643173702408 -87256257496473971112884245019865617883405072393372885180583928426293560818305008522260782798909767/6033923827488694136108946137976975363946983091000029459095422193480393700216071138723852910793425602 +269013748290009777006626540323741268057413570899410654913126381051685202674279933773768621669593088838909/158250801088082443231201310874570630943223781005516158689977272530660644031720656740870308252636164697920 +1891507581322558219959204950332961149340223685140375668763642832996205007822208901687558768278585750413/158250801088082443231201310874570630943223781005516158689977272530660644031720656740870308252636164697920 7 17 -509943056213462511763569133958167755258336989562384895609489315559217300881670514971669540308896946883999102950611312837/377913958066399532184913711878571326588366211075072835640619862683470447854115574045781001519058565019720657932161132650 --140294952657349587329020680407186584367712182346429581785352735342928699370080510781667022273194026661451326450330306848/188956979033199766092456855939285663294183105537536417820309931341735223927057787022890500759529282509860328966080566325 +1524498689627317473833826829110292623257735907317038529710482031516070336850944742011122084349187150145649744296523280301242971/416212573306781523302849706092983680289114054922009210997783909591975406931270841877448305721818387761398586296979267759951120 +-192689808832419328262855327140596432621259619621887445376044453794350108693622058901938649775313421006138421039074666944444153/178376817131477795701221302611278720123906023538003947570478818396560888684830360804620702452207880469170822698705400468550480 8 9 -1059592271049337519260424925956401042510141082546478728946816733839283682556476552837375405842308587/360647593298271372500711004758741424957897315109638521771495166624054342892333877357175401300395522 -62816583782837245122557832993399711140805067126840394101843933989616619042874133866797304301640910/180323796649135686250355502379370712478948657554819260885747583312027171446166938678587700650197761 +2297531237456338229028005652740946734280716157101370770858064126313210362448654076889824450770031958387768/1311923808208285362790810800580309203461512067575939509466996388138761936556446408781016290794821027217601 +277662264609679245296797993972626769302725206491383391150665438977648435622595492286019832440738223069824/1311923808208285362790810800580309203461512067575939509466996388138761936556446408781016290794821027217601 11 12 -3845076076615863722030736813226948070219009788514940925863084143579270593986411591914/1179403121669406826165697824095415219819299168880309933916647213934246736645596186883 --976396915396769110421348824590540585453303655972333805651420529241568116456011912008/1179403121669406826165697824095415219819299168880309933916647213934246736645596186883 +960981723242585711093582378543027243936880298318353772163096062543698224304150016557568205/583679410284039540434899006147597109061929497486224320444975033500227287045663301207384373 +-196409883774141921242683565588292718734038244820708744002765140111307095843056817896149344/583679410284039540434899006147597109061929497486224320444975033500227287045663301207384373 14 15 -1550446710576274056064509594325815470640369515041010847777/105876827551624232983731436886040926145614019552430479025 --56864113906106103904288465411064332821624901647345185664/105876827551624232983731436886040926145614019552430479025 +2595722846239275916830505038463986760468747495359052749735181/620652504078061894400706001248112802728390024592398285762081 +528118155105769608495373485427428366523212994863478110518836/620652504078061894400706001248112802728390024592398285762081 yes 0 -17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 --2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 -2027/2500 +421009105840980225074917780627142441938601151619/670507610148857944771058951102082692403640006250 +-220968777263043523764720183771489462205696797516/335253805074428972385529475551041346201820003125 +3807/5000 0/1 -5623/10000 -1381/2000 +7849/10000 +1933/5000 diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation index 1547455f8e95..37cc350a2bbc 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation @@ -1,63 +1,63 @@ 18 0 17 -16 +11 1 -5 +3 4 2 -13 -11 -3 +9 +6 +5 10 7 -6 -9 -14 8 -15 12 +14 +13 +15 +16 0 10 -832944873550935028540979334654149259660823883894492485701069200142117539337542310789133791013490739754000/275874942707865024086292143471076506264161593549608641277690599605026620932826030999791763089772372375773 --23737333289981402773576986226544989370660234572614244022031950374571531170015809202736573884798834835320/8359846748723182548069458893062924432247321016654807311445169685000806694934122151508841305750677950781 +403993526315468421908956644020743976398594283544626101663054768303358270249952967889182814222831867353402665483307/233807217710808216207733311895074434349878551207944192400785420673529597924918280067549243573668594671829227499163 +-125689632499790309923175679908641269069501765811514953063079358814337930510951232994222465026085493530549174660608/233807217710808216207733311895074434349878551207944192400785420673529597924918280067549243573668594671829227499163 1 13 -11596725097274648158101750208259805274985600479839716165708670441400583305622693255/8905093373015059946637180960935737323087695838469670146996810066775767927012119664 --796627300098838787379374972037414350144306256933948808852257217694518754078820705/3895978350694088726653766670409385078850866929330480689311104404214398468067802353 +195186836549450288005159466337098975879/151002515608028876915228703833254682759 +-134068666763866654888594189167118466848/151002515608028876915228703833254682759 2 3 -1170718673783098457504962540509963940173862171699525163000757/445805974341412533407390534346477221936417272886088631726825 --223444574457306820743419964010705032943337101005899229944698/1872385092233932640311040244255204332132952546121572253252665 +584574079943/404273735856 +-13270123883/134757911952 4 16 -1170718673783098457504962540509963940173862171699525163000757/445805974341412533407390534346477221936417272886088631726825 --223444574457306820743419964010705032943337101005899229944698/1872385092233932640311040244255204332132952546121572253252665 +233553013506846215831542331407944952024/28077242684729123829764488002663052387 +-33254487819423035488347968990214971960/28077242684729123829764488002663052387 5 6 -3178572099275931831371139366967716/1574894514393982813905236944249121 --24733327192913025548867709893910/1574894514393982813905236944249121 +1580742533768689352440825404294853781144850863/535085612973258334611462952258129830286446269 +-12495889799713365563473610224076787646667376/48644146633932575873769359296193620935131479 7 17 -818778929949596729543895917707767786817761361728408009167246191425918090828160098057269976253/698941498909555872980911482391360967694843235471080268258701443545315974487400441161685387377 --197076295692074664093052455831274432019224078037726328505297462827689241869435837683661902032/698941498909555872980911482391360967694843235471080268258701443545315974487400441161685387377 +3554756375145765681516003210860998871330670769252056601159881983894675301394317852873372927481607/2673209992197346476795248251855734477709300364138164423508002476467944563294185484701436339608400 +-3597898604451205542885772008128749303494510178308741847348696193348223372233021767126161635178/129947707954037675955324567798542648221979878812271881698305675939413971826800683284097599842075 8 9 -3033780121996338077176376016679693247151819392847305500560092243031349741/1619942182212637093453207878840761263411255631618443554804646205342503081 --324642612442875660390065886122587475676401528271149128428894139743532128/1619942182212637093453207878840761263411255631618443554804646205342503081 +45898687601056008/29314077991467025 +-5363332869906144/29314077991467025 11 12 -3178572099275931831371139366967716/1574894514393982813905236944249121 --24733327192913025548867709893910/1574894514393982813905236944249121 +1580742533768689352440825404294853781144850863/535085612973258334611462952258129830286446269 +-12495889799713365563473610224076787646667376/48644146633932575873769359296193620935131479 14 15 -479138244477771883909362688118193406651001823369309297735487603979587/245467844779315108261479919873213696110554275428795440769104768818092 --3275908497158874787649292877974073724256841089456879658430656728127/20455653731609592355123326656101141342546189619066286730758730734841 +584574079943/404273735856 +-13270123883/134757911952 yes 0 -17115441829711780465325350451996724907824032369/20684407840770903883425520575323656973792882500 --2029908322060791377757482375372663619231590424/5171101960192725970856380143830914243448220625 -2027/2500 +421009105840980225074917780627142441938601151619/670507610148857944771058951102082692403640006250 +-220968777263043523764720183771489462205696797516/335253805074428972385529475551041346201820003125 +3807/5000 0/1 -7303/10000 --5877/10000 +-2279/10000 +-2141/2500 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index d4e05689d65e..1126b4aebd16 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -630,7 +630,7 @@ typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyp template void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ - _combinatorial_map.copy(cmap); + _combinatorial_map.copy_from_const(cmap); _has_anchor = false; } From c1eb7f056553f86ca1b4e96a368a322f2ea660e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 22 Mar 2024 17:16:56 +0100 Subject: [PATCH 06/97] version 0 de la doc --- .../CGAL/Complex_without_sqrt.h | 104 ++ .../CGAL/Hyperbolic_fundamental_domain_2.h | 95 ++ .../Hyperbolic_fundamental_domain_factory_2.h | 39 + .../CGAL/Hyperbolic_isometry_2.h | 76 + .../CGAL/Hyperbolic_surface_triangulation_2.h | 153 ++ .../CGAL/Hyperbolic_surfaces_traits_2.h | 74 + .../Concepts/HyperbolicSurfacesTraits_2.h | 0 .../Doxyfile.in | 7 + .../PackageDescription.txt | 60 + .../dependencies | 4 + .../examples.txt | 3 + .../fig/cover.svg | 1329 +++++++++++++++++ .../CGAL/Hyperbolic_surfaces_traits_2.h | 2 +- 13 files changed, 1945 insertions(+), 1 deletion(-) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h new file mode 100644 index 000000000000..2767665f893c --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h @@ -0,0 +1,104 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +Templated by a field type FT. Represents a complex number over FT. + +\tparam FT is the field type and must be a model of `Field`. +*/ +template +class Complex_without_sqrt { +private: + typedef Complex_without_sqrt _Self; + +public: + /// \name Types + /// @{ + typedef FT Ft; + /// @} + + /// \name Creation + /// @{ + /*! + Default constructor. Sets the complex number to 0 + 0 * i. + */ + Complex_without_sqrt(); + + /*! + Constructor from the real part. Sets the complex number to 'real' + 0 * i. + */ + Complex_without_sqrt(const FT& real); + + /*! + Constructor from the real and imaginary parts. Sets the complex number to 'real' + 'imaginary' * i. + */ + Complex_without_sqrt(const FT& real, const FT& imag); + /// @} + + /// \name Get and set + /// @{ + /*! + Sets the real part to 'real' + */ + void set_real(const FT& real); + + /*! + Sets the imaginary part to 'imag' + */ + void set_imag(const FT& imag); + + /*! + Returns the real part + */ + FT real() const; + + /*! + Returns the imaginary part + */ + FT imag() const; + /// @} + + /// \name Operations + /// @{ + /*! + Returns the square of the modulus + */ + FT squared_modulus() const; + + /*! + Returns the conjugate + */ + _Self conjugate() const; + + /*! + Returns the sum of itself and other + */ + _Self operator+(const _Self& other) const; + + /*! + Returns the difference of itself and other + */ + _Self operator-(const _Self& other) const; + + /*! + Returns the opposite of itself + */ + _Self operator-() const; + + /*! + Returns the multiplication of itself and other + */ + _Self operator*(const _Self& other) const; + + /*! + Returns the division of itself by other + */ + _Self operator/(const _Self& other) const; + /// @} +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h new file mode 100644 index 000000000000..1b60e620dbeb --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -0,0 +1,95 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +Represents a convex geodesic fundamental domain of a closed orientable hyperbolic surface. +The domain is given as a polygon P given by the list of its vertices in the Poincaré disk model, +together with a pairing of the sides of P. +The n-th side of P is the side between the n-th and the (n+1)-th vertex, where indices are modulo the number of vertices of P. +The sides pairing are represented by a list of integers, such that if the n-th integer of the list is m, then the n-th side is paired to the m-th side + +\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +*/ +template +class Hyperbolic_fundamental_domain_2 { +private: + typedef typename GeometricTraits_2::Point_2 _Point; + typedef Hyperbolic_isometry_2 _Isometry; + + std::vector<_Point> _vertices; + std::vector _pairings; + +public: + /// \name Types + /// @{ + typedef GeometricTraits_2 Geometric_traits_2; + /// @} + + /// \name Creation + /// @{ + /*! + Default constructor + */ + Hyperbolic_fundamental_domain_2(); + + /*! + Constructor from the list of vertices and the sides pairing. + */ + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + /// @} + + /// \name Get and set + /// @{ + /*! + Sets the vertices and the sides pairings of the domain. + */ + void set(const std::vector& vertices, const std::vector& pairings); + + /*! + Returns the number of vertices (equivalently, the number of sides) of the domain. + */ + int size() const; + + /*! + Returns the index-th vertex + */ + typename GeometricTraits_2::Point_2 vertex(int index) const; + + /*! + Returns the index of the side paired to side A, where A is the index-th side + */ + int paired_side(int index) const; + + /*! + // Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + */ + Hyperbolic_isometry_2 side_pairing(int index) const; + /// @} + + /// \name Stream input output + /// @{ + /*! + Reads the domain from a stream + */ + void from_stream(std::istream& s); + + /*! + Writes the domain in a stream + */ + void to_stream(std::ostream& s) const; + /// @} + + /// \name Validity + /// @{ + /*! + Partial validity test + */ + bool is_valid() const; + /// @} +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h new file mode 100644 index 000000000000..a42559e0fd31 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -0,0 +1,39 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +Factory class, whose only purpose is to randomly generate some convex domains of closed orientable hyperbolic surfaces of genus two. + +\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +*/ +template +class Hyperbolic_fundamental_domain_factory_2{ +public: + /// \name Types + /// @{ + typedef GeometricTraits_2 Geometric_traits_2; + /// @} + + /// \name Creation + /// @{ + /*! + Default constructor. The seed is used for random generation + */ + Hyperbolic_fundamental_domain_factory_2(unsigned int seed); + /// @} + + /// \name Generation of a domain + /// @{ + /*! + Randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. + */ + Hyperbolic_fundamental_domain_2 generate_domain_g2(); + /// @} + +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h new file mode 100644 index 000000000000..fc0c8aca73e4 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -0,0 +1,76 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +Represents an isometry in the Poincare disk model. +The isometry f is stored as list (c0, c1, c2, c3) of four complex numbers, +so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. + +\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +*/ +template +class Hyperbolic_isometry_2{ + private: + typedef Hyperbolic_isometry_2 _Self; + typedef Complex_without_sqrt<_FT> _Cmplx; + typedef typename GeometricTraits_2::Point_2 _Point; + + public: + /// \name Types + /// @{ + typedef GeometricTraits_2 Geometric_traits_2; + /// @} + + /// \name Creation + /// @{ + /*! + Default constructor + */ + Hyperbolic_isometry_2(); + /// @} + + /// \name Get and set + /// @{ + /*! + Set the isometry to the identity + */ + void set_to_identity(); + + /*! + Can be used to set the coefficients of the isometry manually. + Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + */ + void set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3); + + /*! + Can be used to set one coefficient of the isometry smanually. + Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + */ + void set_coefficient(int index, const _Cmplx& coefficient); + + /*! + Returns the index-th coefficient + */ + _Cmplx get_coefficient(int index) const; + /// @} + + /// \name Operations + /// @{ + /*! + Evaluates the isometry at point + */ + _Point evaluate(const _Point& point) const; + + /*! + Returns the composition of itself and other + */ + _Self compose(const _Self& other) const; + /// @} + +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h new file mode 100644 index 000000000000..ec56c6226890 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -0,0 +1,153 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +The class `Hyperbolic_surface_triangulation_2` is the main class of the Hyperbolic Surface Triangulation package. +It represents a triangulation of a closed orientable hyperbolic surface. +It offers factilities such as the generation of the triangulation from a convex fundamental domain, +the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model. + +\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +*/ +template +class Hyperbolic_surface_triangulation_2{ +public: + /// \name Types + /// @{ + typedef GeometricTraits_2 Geometric_traits_2; + + struct Combinatorial_map_with_cross_ratios_item{ + template + struct Dart_wrapper{ + typedef Cell_attribute> Edge_attrib; + typedef std::tuple Attributes; + }; + }; + typedef Combinatorial_map<2,Combinatorial_map_with_cross_ratios_item> Combinatorial_map_with_cross_ratios; + + struct Anchor{ + typename Combinatorial_map_with_cross_ratios::Dart_handle dart; + typename GeometricTraits_2::Point_2 vertices[3]; + }; + /// @} + +private: + typedef typename Combinatorial_map_with_cross_ratios::Dart_handle _Dart_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_range _Dart_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> _Vertex_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> _Edge_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> _Face_range; + + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle _Dart_const_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range _Dart_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> _Edge_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> _Face_const_range; + + typedef typename GeometricTraits_2::FT _Number; + typedef Complex_without_sqrt<_Number> _Complex_number; + typedef typename GeometricTraits_2::Point_2 _Point; + typedef Hyperbolic_isometry_2 _Isometry; + typedef Hyperbolic_fundamental_domain_2 _Domain; + +public: + /// \name Creation + /// @{ + /*! + Default constructor + */ + Hyperbolic_surface_triangulation_2() {}; + + /*! + Constructor from a convex fundamental domain + */ + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + + /*! + Constructor from a decorated combinatorial map + */ + Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); + + /*! + Constructor from a decorated combinatorial map and an anchor + */ + Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + + /*! + Copy constructor + */ + Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); + /// @} + + /// \name Get and set + /// @{ + /*! + Returns the decorated combinatorial map + */ + Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); + + /*! + Tells whether the triangulation is anchored + */ + bool has_anchor() const; + + /*! + Returns the anchor + */ + Anchor& get_anchor_ref(); + /// @} + + /// \name Stream input output + /// @{ + /*! + Writes the triangulation in a stream + */ + void to_stream(std::ostream& s) const; + + /*! + Reads the triangulation from a stream + */ + void from_stream(std::istream& s); + /// @} + + /// \name Delaunay flips algorithm + /// @{ + /*! + Tells whether an edge is Delaunay flippable + */ + bool is_delaunay_flippable(_Dart_handle dart) const; + + /*! + Flips a Delaunay flippable edge + */ + void flip(_Dart_handle dart); + + /*! + Applies the Delaunay flips algorithm + */ + int make_delaunay(); + /// @} + + /// \name Lifting + /// @{ + /*! + Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. + The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. + This method is to be used only if the triangulation has an anchor. + */ + std::vector> lift(bool center=true) const; + /// @} + + /// \name Validity + /// @{ + /*! + Partial validity test + */ + bool is_valid() const; + /// @} +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h new file mode 100644 index 000000000000..b743d606824d --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h @@ -0,0 +1,74 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +namespace CGAL { + +template +class Hyperbolic_point_2 { + public: + /// \name Types + /// @{ + typedef ComplexType Complex; + /// @} + + /// \name Creation + /// @{ + /*! + %Default constructor + */ + Hyperbolic_point_2(); + + /*! + %Constructor from the complex number representing the point + */ + Hyperbolic_point_2(const Complex& z); + /// @} + + /// \name Get and set + /// @{ + /*! + %Get the complex number representing the point + */ + Complex get_z() const; + + /*! + %Set the complex number representing the point + */ + void set_z(const Complex& z); + /// @} +}; + +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_point_2& point); + +template +void operator>>(std::istream& s, Hyperbolic_point_2& point); + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2TraitsClasses + +The class `Hyperbolic_surfaces_traits_2` is designed as one of the +default models for the traits concept `HyperbolicSurfacesTraits_2` +offered by \cgal. + +\tparam FieldType must be a model of `Field`. + +This class provides exact constructions and predicates. The default value for `FieldType` is `CGAL::Gmpq`, +which guarantees exact constructions when the input points have rational coordinates. + +\sa `Hyperbolic_surfaces_traits_2` + +\cgalModels{HyperbolicSurfacesTraits_2} +*/ +template +class Hyperbolic_surfaces_traits_2 { +public: + /// \name Types + /// @{ + typedef FieldType FT; + typedef Complex_without_sqrt Complex; + typedef Hyperbolic_point_2 Point_2; + /// @} +}; + +} //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in new file mode 100644 index 000000000000..10555936e0cc --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in @@ -0,0 +1,7 @@ +@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} + +EXTRACT_PRIVATE = NO + +PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Hyperbolic Surface Triangulations" + +HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt new file mode 100644 index 000000000000..a851bd373a87 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -0,0 +1,60 @@ +/// \defgroup PkgHyperbolicSurfaceTriangulation2Ref Hyperbolic Surface Triangulations Reference + +/// \defgroup PkgHyperbolicSurfaceTriangulation2Concepts Concepts +/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref + +/// \defgroup PkgHyperbolicSurfaceTriangulation2MainClasses Main Classes +/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref + +/// \defgroup PkgHyperbolicSurfaceTriangulation2TraitsClasses Traits Classes +/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref + +/// \defgroup PkgHyperbolicSurfaceTriangulation2VertexFaceClasses Face Classes +/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref + + + +/*! +\addtogroup PkgHyperbolicSurfaceTriangulation2Ref + +\cgalPkgDescriptionBegin{Hyperbolic Surface Triangulations} +\cgalPkgPicture{Hyperbolic_surface_triangulation_2/fig/cover.svg} + +\cgalPkgSummaryBegin +\cgalPkgAuthors{Vincent Despré, Loïc Dubois, Monique Teillaud} +\cgalPkgDesc{This package enables handling and building triangulations of closed orientable hyperbolic surfaces. A method is offered that implements the Delaunay flip algorithm on such triangulations. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} +\cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} +\cgalPkgSummaryEnd + +\cgalPkgShortInfoBegin +\cgalPkgSince{6} +\cgalPkgDependsOn{\ref PkgCombinatorialMap} +\cgalPkgBib{} +\cgalPkgLicense{\ref licensesGPL "GPL"} +\cgalPkgDemo{Hyperbolic Surface Triangulation,Hyperbolic_Surface_triangulation_2.zip} +\cgalPkgShortInfoEnd + +\cgalPkgDescriptionEnd + +\cgalClassifedRefPages + +\cgalCRPSection{Concepts} + +- `HyperbolicSurfacesTraits_2` describes the requirements for triangulations, convex fundamental domains, and isometries of the Poincaré disk modeL + +\cgalCRPSection{Classes} + +- `CGAL::Hyperbolic_Surface_triangulation_2` is the main class of the Hyperbolic Surface Triangulation package. It represents a triangulation of a closed orientable hyperbolic surface. It offers factilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model. + +- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain in the Poincaré disk model. The domain is a convex polygon given by the list of its vertices, and a pairing of the sides of the polygon. A method is offered that computes the isometry sending a side to its paired side. + +- `CGAL::Hyperbolic_fundamental_domain_factory_2` randomly generates convex fundamental domains of closed orientable hyperbolic surfaces of genus two. + +- `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. + +- `CGAL::Complex_without_sqrt` represents a complex number. + +A model for the concept `HyperbolicSurfacesTraits_2` is provided: +- `CGAL::Hyperbolic_surfaces_traits_2` is templated by a fiel type FT and guarantees exact constructions for input points with coordinates in FT. + +*/ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies new file mode 100644 index 000000000000..904b349392fa --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies @@ -0,0 +1,4 @@ +Manual +Stream_support +Number_types +Combinatorial_map diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt new file mode 100644 index 000000000000..91f2dba7f06b --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -0,0 +1,3 @@ +/*! +\example Hyperbolic_surface_triangulation_2/example.cpp +*/ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg new file mode 100644 index 000000000000..51505f723bf1 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg @@ -0,0 +1,1329 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h index 60c4548d036d..d4779680ec0b 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h @@ -32,7 +32,7 @@ class Hyperbolic_point_2 { Hyperbolic_point_2(const Complex& z) { _z = z; } Complex get_z() const { return _z; } - void set_z(const Complex& z) { _z = z; } + void set_z(const Complex& z) { _z = z; } }; template From e799290385e98ef79a1bf12a95ed93fab4ef0719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Thu, 11 Apr 2024 15:10:09 +0200 Subject: [PATCH 07/97] new point type --- .../demo.cpp | 13 +- .../window.cpp | 28 +-- .../window.h | 20 +- .../examples.txt | 2 +- .../fig/cover.svg | 14 +- .../data/domain | 17 +- .../data/input triangulation | 43 ++-- .../data/output triangulation | 55 ++--- .../example.cpp | 38 ++- .../include/CGAL/Complex_without_sqrt.h | 18 -- .../CGAL/Hyperbolic_fundamental_domain_2.h | 73 +++--- .../Hyperbolic_fundamental_domain_factory_2.h | 70 +++--- .../include/CGAL/Hyperbolic_isometry_2.h | 104 ++++----- .../CGAL/Hyperbolic_surface_triangulation_2.h | 219 ++++++++++-------- .../CGAL/Hyperbolic_surfaces_traits_2.h | 16 ++ .../hs_test_complex.cpp | 8 - .../hs_test_domain.cpp | 62 ++--- .../hs_test_factory.cpp | 53 +++-- .../hs_test_isometry.cpp | 44 ++-- 19 files changed, 461 insertions(+), 436 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp index 12e81ffad8b8..10a366680ecd 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp @@ -14,13 +14,20 @@ #include -#include -#include #include #include #include -typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +#include +#include +#include +#include +#include +#include +#include + +typedef CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; typedef CGAL::Hyperbolic_fundamental_domain_factory_2 Factory; typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp index 848933ebfc49..73ca88662a84 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp @@ -40,15 +40,15 @@ void DemoWindowItem::modelChanged(){} // Only used by Qt : we don't need to fill ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void DemoWindowItem::draw_triangulation(Triangulation& triangulation){ - typedef std::vector> RealizationVector; + typedef std::vector> RealizationVector; RealizationVector realized_triangles; realized_triangles = triangulation.lift(); - Complex point_1, point_2, point_3; + Point point_1, point_2, point_3; for (typename RealizationVector::iterator it = realized_triangles.begin(); it != realized_triangles.end(); ++it){ - point_1 = std::get<1>(*it).get_z(); - point_2 = std::get<2>(*it).get_z(); - point_3 = std::get<3>(*it).get_z(); + point_1 = std::get<1>(*it); + point_2 = std::get<2>(*it); + point_3 = std::get<3>(*it); _edges.push_back(std::make_pair(point_1, point_2)); _edges.push_back(std::make_pair(point_2, point_3)); @@ -58,10 +58,10 @@ void DemoWindowItem::draw_triangulation(Triangulation& triangulation){ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void DemoWindowItem::draw_point(QPainter* painter, Complex position){ - // First convert the complex number of coordinates in doubles, well-scaled - double point_x = _poincare_disk_radius_in_pixels * CGAL::to_double(position.real()); - double point_y = _poincare_disk_radius_in_pixels * CGAL::to_double(position.imag()); +void DemoWindowItem::draw_point(QPainter* painter, Point position){ + // First convert the point in doubles, well-scaled + double point_x = _poincare_disk_radius_in_pixels * CGAL::to_double(position.x()); + double point_y = _poincare_disk_radius_in_pixels * CGAL::to_double(position.y()); // Then draw a small circle QRectF circle_rect = QRectF(point_x-1, point_y-1, 3, 3); @@ -69,14 +69,14 @@ void DemoWindowItem::draw_point(QPainter* painter, Complex position){ } -void DemoWindowItem::draw_edge(QPainter* painter, Complex source, Complex target){ +void DemoWindowItem::draw_edge(QPainter* painter, Point source, Point target){ // First convert the points coordinates to doubles - double src_x = CGAL::to_double(source.real()); - double src_y = CGAL::to_double(source.imag()); + double src_x = CGAL::to_double(source.x()); + double src_y = CGAL::to_double(source.y()); - double tar_x = CGAL::to_double(target.real()); - double tar_y = CGAL::to_double(target.imag()); + double tar_x = CGAL::to_double(target.x()); + double tar_y = CGAL::to_double(target.y()); // 0. If src and tar are too colinear or too close from each other then draw a line double determinant = src_x*tar_y - src_y*tar_x; // determinant of the matrix whose columns are the vectors src and tar : indicates colinearity diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h index ae4d5bf9f68d..31b46da6b5e7 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h @@ -10,13 +10,19 @@ #include "ui_drawing_window_description.h" // CGAL headers -#include -#include #include + +#include +#include +#include +#include +#include +#include #include -typedef CGAL::Complex_without_sqrt Complex; -typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +typedef CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +typedef Traits::Hyperbolic_point_2 Point; typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; class DemoWindowItem : @@ -28,7 +34,7 @@ class DemoWindowItem : typedef CGAL::Bbox_2 Bbox_2; // "Bounding box" : just a box type used for drawing // Edges to draw - std::vector> _edges; + std::vector> _edges; // Pens for drawing QPen _poincare_disk_pen; @@ -54,9 +60,9 @@ class DemoWindowItem : private: // Sub-methods for drawing edges and vertices - void draw_point(QPainter* painter, Complex position); + void draw_point(QPainter* painter, Point position); - void draw_edge(QPainter* painter, Complex source, Complex target); + void draw_edge(QPainter* painter, Point source, Point target); void draw_line(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y); void draw_arc(QPainter* painter, double point_1_x, double point_1_y, double point_2_x, double point_2_y, double center_x, double center_y); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index 91f2dba7f06b..c7e5a40b9501 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,3 +1,3 @@ /*! -\example Hyperbolic_surface_triangulation_2/example.cpp +\example Hyperbolic_surface_triangulation_2_Example/example.cpp */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg index 51505f723bf1..48e01a5158e2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="180.01363mm" - height="180.32155mm" - viewBox="0 0 180.01363 180.32155" + width="90.006813mm" + height="90.160774mm" + viewBox="0 0 90.006815 90.160775" version="1.1" id="svg8" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -72,8 +72,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.49497476" - inkscape:cx="170.17446" - inkscape:cy="144.92341" + inkscape:cx="-475.699" + inkscape:cy="-29.499758" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -100,9 +100,9 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(-113.79912,-78.812441)"> + transform="translate(-158.80253,-123.89283)"> #include #include -#include + #include +#include +#include +#include +#include +#include +#include #include using namespace CGAL; -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_surface_triangulation_2 Triangulation; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; int main(){ Factory factory = Factory(time(NULL)); - Domain domain0, domain; + Domain domain; Triangulation triangulation; std::string filename = "./data/domain"; // Generate the domain std::cout << "generating the domain " << std::endl; - domain0 = factory.generate_domain_g2(); + domain = factory.generate_domain_g2(); // Save the domain std::cout << "saving the domain " << std::endl; std::ofstream output_file (filename.c_str()); - output_file << domain0; + output_file << domain; output_file.close(); - // Load the domain - std::cout << "loading the domain" << std::endl; - std::ifstream input_file (filename.c_str()); - input_file >> domain; - input_file.close(); - // Triangulate the domain std::cout << "triangulating the domain " << std::endl; triangulation = Triangulation(domain); @@ -67,14 +68,7 @@ int main(){ output_file << triangulation; output_file.close(); - // Load the resulting triangulation - std::cout << "loading the resulting triangulation" << std::endl; - Triangulation triangulation2; - input_file = std::ifstream ("./data/output triangulation"); - input_file >> triangulation2; - input_file.close(); - - std::cout << triangulation2 << std::endl; + std::cout << triangulation << std::endl; return 0; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 06ace2fb0d9e..2e5a60238363 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -57,12 +57,6 @@ template bool operator!=(const Complex_without_sqrt& z1, const Com templatestd::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); templatevoid operator>>(std::istream& s, Complex_without_sqrt& z); -// Returns the cross ratio (d-b)*(c-a) / ((d-a)*(c-b)) -template Complex_without_sqrt cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt d); -// Returns d such that (d-b)*(c-a) / ((d-a)*(c-b)) = cratio -template Complex_without_sqrt fourth_point_from_cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt cratio); - - //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -176,18 +170,6 @@ void operator>>(std::istream& s, Complex_without_sqrt& z){ z.set_imag(FT(line)); } -//////////////////////////////////////////////////////////////////////////////// - -template -Complex_without_sqrt cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt d){ - return (d-b)*(c-a) / ((d-a)*(c-b)); -} - -template -Complex_without_sqrt fourth_point_from_cross_ratio(Complex_without_sqrt a, Complex_without_sqrt b, Complex_without_sqrt c, Complex_without_sqrt cratio){ - return ( cratio*a*(c-b) + b*(a-c) ) / ( cratio*(c-b) + (a-c) ); -} - } // namespace CGAL #endif // CGAL_COMPLEX_WITHOUT_SQRT diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index cf69c7434b69..08ed7d5b9bf0 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -30,27 +30,26 @@ together with a pairing of the sides of P, such that every two paired sides have identifying every two paired sides in a way that respects the orientation of P would result in a closed orientable hyperbolic surface. */ -template +template class Hyperbolic_fundamental_domain_2 { private: - typedef typename GeometricTraits_2::Point_2 _Point; - typedef Hyperbolic_isometry_2 _Isometry; + typedef typename Traits_2::Hyperbolic_point_2 _Point; + typedef typename Traits_2::Complex _Cmplx; + typedef Hyperbolic_isometry_2 _Isometry; std::vector<_Point> _vertices; std::vector _pairings; public: - typedef GeometricTraits_2 Geometric_traits_2; - Hyperbolic_fundamental_domain_2(); - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); - void set(const std::vector& vertices, const std::vector& pairings); + void set(const std::vector& vertices, const std::vector& pairings); int size() const; // Returns the number of vertices (equivalently, the number of sides) - typename GeometricTraits_2::Point_2 vertex(int index) const; // Returns the index-th vertex + typename Traits_2::Hyperbolic_point_2 vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side - Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B void from_stream(std::istream& s); void to_stream(std::ostream& s) const; @@ -58,49 +57,49 @@ class Hyperbolic_fundamental_domain_2 { bool is_valid() const; }; -template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); -template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); +template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector<_Point>& vertices, const std::vector& pairings){ +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector<_Point>& vertices, const std::vector& pairings){ set(vertices, pairings); } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_fundamental_domain_2::set(const std::vector<_Point>& vertices, const std::vector& pairings){ +template +void Hyperbolic_fundamental_domain_2::set(const std::vector<_Point>& vertices, const std::vector& pairings){ _vertices = vertices; _pairings = pairings; } //////////////////////////////////////////////////////////////////////////////// -template -int Hyperbolic_fundamental_domain_2::size() const{ +template +int Hyperbolic_fundamental_domain_2::size() const{ return _vertices.size(); } -template -typename GeometricTraits_2::Point_2 Hyperbolic_fundamental_domain_2::vertex(int index) const{ +template +typename Traits_2::Hyperbolic_point_2 Hyperbolic_fundamental_domain_2::vertex(int index) const{ return _vertices[index]; } -template -int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ +template +int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ return _pairings[index]; } -template -Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ +template +Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ int n = size(); int paired_index = paired_side(index); @@ -110,14 +109,14 @@ Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2(p1,p2,q1,q2); + _Isometry isom = isometry_pairing_the_sides(p1,p2,q1,q2); return isom; } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ +template +void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ int n = size(); s << std::to_string(n) << std::endl; @@ -131,8 +130,8 @@ void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& } } -template -void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ +template +void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ _vertices.clear(); _pairings.clear(); @@ -153,21 +152,21 @@ void Hyperbolic_fundamental_domain_2::from_stream(std::istrea //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ domain.to_stream(s); return s; } -template -void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ +template +void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ domain.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_2::is_valid()const{ +template +bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Get the number of vertices int n = _vertices.size(); @@ -199,7 +198,7 @@ bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Check that the vertices all lie within the open unit disk for (int k=0; k= typename GeometricTraits_2::FT(1)){ + if (_vertices[k].get_z().squared_modulus() >= typename Traits_2::FT(1)){ return false; } } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 2ab7dc85ffec..3693946ffb81 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -28,20 +28,18 @@ namespace CGAL { /* Factory class, whose only purpose is to construct random domains of genus 2 closed orientable hyperbolic surfaces, via its method generate_domain_g2. */ -template +template class Hyperbolic_fundamental_domain_factory_2{ private: - typedef typename GeometricTraits_2::FT _FT; - typedef Complex_without_sqrt<_FT> _Cmplx; - typedef typename GeometricTraits_2::Point_2 _Point; + typedef typename Traits_2::FT _FT; + typedef typename Traits_2::Complex _Cmplx; + typedef typename Traits_2::Hyperbolic_point_2 _Point; Random _random; public: - typedef GeometricTraits_2 Geometric_traits_2; - Hyperbolic_fundamental_domain_factory_2(unsigned int seed); - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_2 generate_domain_g2(); private: float random_positive_float(); // returns number in [0,1] @@ -63,16 +61,16 @@ class Hyperbolic_fundamental_domain_factory_2{ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ +template +Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ _random = Random(seed); } //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ - Hyperbolic_fundamental_domain_2 domain; +template +Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ + Hyperbolic_fundamental_domain_2 domain; bool is_domain_generated = false; _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; @@ -105,14 +103,14 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain _Cmplx exact_zero(_FT(0), _FT(0)); std::vector<_Point> vertices; - vertices.push_back(exact_z0); - vertices.push_back(exact_z1); - vertices.push_back(exact_z2); - vertices.push_back(exact_z3); - vertices.push_back(exact_zero-exact_z0); - vertices.push_back(exact_zero-exact_z1); - vertices.push_back(exact_zero-exact_z2); - vertices.push_back(exact_zero-exact_z3); + vertices.push_back(_Point(exact_z0.real(), exact_z0.imag())); + vertices.push_back(_Point(exact_z1.real(), exact_z1.imag())); + vertices.push_back(_Point(exact_z2.real(), exact_z2.imag())); + vertices.push_back(_Point(exact_z3.real(), exact_z3.imag())); + vertices.push_back(_Point(-exact_z0.real(), -exact_z0.imag())); + vertices.push_back(_Point(-exact_z1.real(), -exact_z1.imag())); + vertices.push_back(_Point(-exact_z2.real(), -exact_z2.imag())); + vertices.push_back(_Point(-exact_z3.real(), -exact_z3.imag())); std::vector pairings; for (int k=0; k<8; k++){ @@ -125,18 +123,18 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain //////////////////////////////////////////////////////////////////////////////// -template -float Hyperbolic_fundamental_domain_factory_2::random_positive_float(){ +template +float Hyperbolic_fundamental_domain_factory_2::random_positive_float(){ return _random.uniform_01(); } -template -float Hyperbolic_fundamental_domain_factory_2::random_float(){ +template +float Hyperbolic_fundamental_domain_factory_2::random_float(){ return _random.uniform_01() * 2 - 1; } -template -Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ +template +Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ Complex_without_sqrt result (random_float(), random_positive_float()); while (result.squared_modulus() >= 1){ result.set_real(random_float()); @@ -148,23 +146,23 @@ Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2 -typename GeometricTraits_2::FT Hyperbolic_fundamental_domain_factory_2::exact_number_from_float(float x){ +template +typename Traits_2::FT Hyperbolic_fundamental_domain_factory_2::exact_number_from_float(float x){ if (x< 0){ return _FT(0)-exact_number_from_float(-x); } return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION, _DENOMINATOR_FOR_GENERATION); } -template -Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ +template +typename Traits_2::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ return _Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag())); } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ if ( ((z2/z1).imag()<=0) || ((z3/z2).imag()<=0) ){ return false; } @@ -185,8 +183,8 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_ return true; } -template -bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ _FT zero_number (0); _FT one_number (1); if ( (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ @@ -231,8 +229,8 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_ //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ +template +bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ _FT zero_number(0); _FT one_number(1); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 973882b50d0f..0b24e2507d75 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -23,19 +23,17 @@ namespace CGAL { Represents a hyperbolic isometry in the Poincare disk model the hyperbolic plane. The isometry f is stored as list (c0, c1, c2, c3) of 4 complex numbers, so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. */ -template +template class Hyperbolic_isometry_2{ private: - typedef Hyperbolic_isometry_2 _Self; - typedef typename GeometricTraits_2::FT _FT; - typedef Complex_without_sqrt<_FT> _Cmplx; - typedef typename GeometricTraits_2::Point_2 _Point; + typedef Hyperbolic_isometry_2 _Self; + typedef typename Traits_2::FT _FT; + typedef typename Traits_2::Complex _Cmplx; + typedef typename Traits_2::Hyperbolic_point_2 _Point; _Cmplx _coefficients[4]; public: - typedef GeometricTraits_2 Geometric_traits_2; - Hyperbolic_isometry_2(); void set_to_identity(); @@ -54,74 +52,74 @@ class Hyperbolic_isometry_2{ _Self compose(const _Self& other) const; }; -template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); // When inverse=false, returns the hyperbolic translation that maps -p to zero, and zero to p. Otherwise, returns the hyperbolic translation that maps p to zero, and zero to -p. -template -Hyperbolic_isometry_2 hyperbolic_translation(const typename GeometricTraits_2::Point_2& p, bool inverse=false); +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits_2::Hyperbolic_point_2& p, bool inverse=false); // When inverse=false, returns the hyperbolic rotation around zero that maps p to q. Otherwise, returns the hyperbolic rotation around zero that maps q to p. -template -Hyperbolic_isometry_2 hyperbolic_rotation(const typename GeometricTraits_2::Point_2& p, const typename GeometricTraits_2::Point_2& q, bool inverse=false); +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits_2::Hyperbolic_point_2& p, const typename Traits_2::Hyperbolic_point_2& q, bool inverse=false); // Returns the hyperbolic isometry that maps p1 to q1 and p2 to q2 -template -Hyperbolic_isometry_2 segments_pairing(const typename GeometricTraits_2::Point_2& p1, const typename GeometricTraits_2::Point_2& p2, const typename GeometricTraits_2::Point_2& q1, const typename GeometricTraits_2::Point_2& q2); +template +Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits_2::Hyperbolic_point_2& p1, const typename Traits_2::Hyperbolic_point_2& p2, const typename Traits_2::Hyperbolic_point_2& q1, const typename Traits_2::Hyperbolic_point_2& q2); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ +template +Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ set_to_identity(); } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_isometry_2::set_to_identity(){ +template +void Hyperbolic_isometry_2::set_to_identity(){ set_coefficients(_Cmplx(_FT(1)), _Cmplx(_FT(0)), _Cmplx(_FT(0)), _Cmplx(_FT(1))); } -template -void Hyperbolic_isometry_2::set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3){ +template +void Hyperbolic_isometry_2::set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3){ set_coefficient(0, c0); set_coefficient(1, c1); set_coefficient(2, c2); set_coefficient(3, c3); } -template -void Hyperbolic_isometry_2::set_coefficient(int index, const _Cmplx& coefficient){ +template +void Hyperbolic_isometry_2::set_coefficient(int index, const _Cmplx& coefficient){ _coefficients[index] = coefficient; } //////////////////////////////////////////////////////////////////////////////// -template -Complex_without_sqrt Hyperbolic_isometry_2::get_coefficient(int index) const{ +template +typename Traits_2::Complex Hyperbolic_isometry_2::get_coefficient(int index) const{ return _coefficients[index]; } //////////////////////////////////////////////////////////////////////////////// -template -typename GeometricTraits_2::Point_2 Hyperbolic_isometry_2::evaluate(const _Point& point) const{ - _Cmplx z = point.get_z(); +template +typename Traits_2::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(const _Point& point) const{ + _Cmplx z (point.x(), point.y()); _Cmplx numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; _Cmplx denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; - - return _Point(numerator_of_the_result / denominator_of_the_result); + _Cmplx result = numerator_of_the_result / denominator_of_the_result; + return _Point(result.real(), result.imag()); } //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ +template +Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ _Self result; for (int i=0; i<2; i++){ for (int j=0; j<2; j++){ @@ -134,8 +132,8 @@ Hyperbolic_isometry_2 Hyperbolic_isometry_2 -std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry){ +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry){ for (int k=0; k<4; k++){ s << isometry.get_coefficient(k); } @@ -144,39 +142,39 @@ std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2 -Hyperbolic_isometry_2 hyperbolic_translation(const typename GeometricTraits_2::Point_2& p, bool inverse){ - Complex_without_sqrt one (typename GeometricTraits_2::FT(1)); - Complex_without_sqrt z; +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits_2::Hyperbolic_point_2& p, bool inverse){ + typename Traits_2::Complex one (typename Traits_2::FT(1)); + typename Traits_2::Complex z; if (inverse){ - z = p.get_z(); + z = typename Traits_2::Complex(p.x(), p.y()); } else { - z = - p.get_z(); + z = - typename Traits_2::Complex(p.x(), p.y()); } - Hyperbolic_isometry_2 result; + Hyperbolic_isometry_2 result; result.set_coefficients(one, z, z.conjugate(), one); return result; } -template -Hyperbolic_isometry_2 hyperbolic_rotation(const typename GeometricTraits_2::Point_2& p, const typename GeometricTraits_2::Point_2& q, bool inverse){ - Complex_without_sqrt zero (typename GeometricTraits_2::FT(0)); - Hyperbolic_isometry_2 result; +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits_2::Hyperbolic_point_2& p, const typename Traits_2::Hyperbolic_point_2& q, bool inverse){ + typename Traits_2::Complex zero (typename Traits_2::FT(0)); + Hyperbolic_isometry_2 result; if (inverse){ - result.set_coefficients(p.get_z(), zero, zero, q.get_z()); + result.set_coefficients(typename Traits_2::Complex(p.x(), p.y()), zero, zero, typename Traits_2::Complex(q.x(), q.y())); } else { - result.set_coefficients(q.get_z(), zero, zero, p.get_z()); + result.set_coefficients(typename Traits_2::Complex(q.x(), q.y()), zero, zero, typename Traits_2::Complex(p.x(), p.y())); } return result; } -template -Hyperbolic_isometry_2 segments_pairing(const typename GeometricTraits_2::Point_2& p1, const typename GeometricTraits_2::Point_2& p2, const typename GeometricTraits_2::Point_2& q1, const typename GeometricTraits_2::Point_2& q2){ - Hyperbolic_isometry_2 A,B,Binv,C; - A = hyperbolic_translation(p1); - B = hyperbolic_translation(q1); - Binv = hyperbolic_translation(q1,true); - C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); +template +Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits_2::Hyperbolic_point_2& p1, const typename Traits_2::Hyperbolic_point_2& p2, const typename Traits_2::Hyperbolic_point_2& q1, const typename Traits_2::Hyperbolic_point_2& q2){ + Hyperbolic_isometry_2 A,B,Binv,C; + A = hyperbolic_translation(p1); + B = hyperbolic_translation(q1); + Binv = hyperbolic_translation(q1,true); + C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); return (Binv.compose(C)).compose(A); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 1126b4aebd16..6d8406712148 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -35,15 +35,13 @@ It is also possible to specify an anchor for the triangulation. An anchor consis 2) three points A,B,C in the hyperbolic plane. The points A,B,C are the three vertices in counter-clockwise order of a triangle. This triangle is a lift of T, and A is a lift of V. */ -template +template class Hyperbolic_surface_triangulation_2{ public: - typedef GeometricTraits_2 Geometric_traits_2; - struct Combinatorial_map_with_cross_ratios_item{ template struct Dart_wrapper{ - typedef Cell_attribute> Edge_attrib; + typedef Cell_attribute> Edge_attrib; typedef std::tuple Attributes; }; }; @@ -51,7 +49,7 @@ class Hyperbolic_surface_triangulation_2{ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; - typename GeometricTraits_2::Point_2 vertices[3]; + typename Traits_2::Hyperbolic_point_2 vertices[3]; }; private: @@ -66,11 +64,11 @@ class Hyperbolic_surface_triangulation_2{ typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> _Edge_const_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> _Face_const_range; - typedef typename GeometricTraits_2::FT _Number; - typedef Complex_without_sqrt<_Number> _Complex_number; - typedef typename GeometricTraits_2::Point_2 _Point; - typedef Hyperbolic_isometry_2 _Isometry; - typedef Hyperbolic_fundamental_domain_2 _Domain; + typedef typename Traits_2::FT _Number; + typedef typename Traits_2::Complex _Complex_number; + typedef typename Traits_2::Hyperbolic_point_2 _Point; + typedef Hyperbolic_isometry_2 _Isometry; + typedef Hyperbolic_fundamental_domain_2 _Domain; Combinatorial_map_with_cross_ratios _combinatorial_map; bool _has_anchor = false; @@ -78,7 +76,7 @@ class Hyperbolic_surface_triangulation_2{ public: Hyperbolic_surface_triangulation_2() {}; - Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); @@ -97,7 +95,7 @@ class Hyperbolic_surface_triangulation_2{ // Flips Delaunay flippable edges as long as possible int make_delaunay(); // Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. This method is to be used only if the triangulation has an anchor. - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; bool is_valid() const; @@ -115,17 +113,22 @@ class Hyperbolic_surface_triangulation_2{ void copy_from(const Combinatorial_map_with_cross_ratios& cmap); void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + + // Returns the cross ratio of the points a,b,c,d + _Complex_number cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Point& d) const; + // Returns the point d such that the cross ratio of a,b,c,d is cratio + _Point fourth_point_from_cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Complex_number& cratio) const; }; -template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); -template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); +template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); +template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const _Domain& domain){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const _Domain& domain){ // (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices) _combinatorial_map.clear(); int size = domain.size(); @@ -150,7 +153,7 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang p3 = domain.vertex(k+1); _combinatorial_map.template sew<2>(dart_1, dart_2); - _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0.get_z(),p1.get_z(),p2.get_z(),p3.get_z()))); + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0,p1,p2,p3))); } // Sew the boundary edges and set their cross ratios @@ -186,7 +189,7 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang if (_combinatorial_map.template is_sewable<2>(dart_1, dart_2)){ _combinatorial_map.template sew<2>(dart_1, dart_2); - _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0.get_z(),p1.get_z(),p2.get_z(),p3.get_z()))); + _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio(p0,p1,p2,p3))); } } @@ -198,21 +201,21 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang _has_anchor = true; } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ copy_from(cmap); } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ copy_from(cmap, anchor); } //////////////////////////////////////////////////////////////////////////////// -template -//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ -Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ +template +//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ +Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ copy_from(other.get_combinatorial_map_ref(), other.get_anchor_ref()); } @@ -224,30 +227,30 @@ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triang //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ return _combinatorial_map; } -template -bool Hyperbolic_surface_triangulation_2::has_anchor() const { +template +bool Hyperbolic_surface_triangulation_2::has_anchor() const { return _has_anchor; } -template -typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ return _anchor; } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(_Dart_handle dart) const{ +template +bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(_Dart_handle dart) const{ return ( get_cross_ratio(dart).imag()>_Number(0) ); } -template -void Hyperbolic_surface_triangulation_2::flip(_Dart_handle dart){ +template +void Hyperbolic_surface_triangulation_2::flip(_Dart_handle dart){ // First gather all the information needed @@ -269,18 +272,18 @@ void Hyperbolic_surface_triangulation_2::flip(_Dart_handle da if (_anchor.dart == a){ _anchor.dart = e; - _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), cross_ratio_AC)); + _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); } else if (_anchor.dart == b){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), cross_ratio_AC)); + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); } else if (_anchor.dart == c){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), cross_ratio_AC)); + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); } else if (_anchor.dart == d){ _anchor.dart = b; - _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), cross_ratio_AC)); + _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); } else if (_anchor.dart == e){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), _anchor.vertices[2].get_z(), cross_ratio_AC)); + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); } else if (_anchor.dart == f){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2].get_z(), _anchor.vertices[0].get_z(), _anchor.vertices[1].get_z(), cross_ratio_AC)); + _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); } // Compute the new cross ratios @@ -330,8 +333,8 @@ void Hyperbolic_surface_triangulation_2::flip(_Dart_handle da } } -template -int Hyperbolic_surface_triangulation_2::make_delaunay(){ +template +int Hyperbolic_surface_triangulation_2::make_delaunay(){ int number_of_flips_done = 0; _Dart_handle edge_to_flip = pick_edge_to_flip(); @@ -345,8 +348,8 @@ int Hyperbolic_surface_triangulation_2::make_delaunay(){ } -template -std::vector::Combinatorial_map_with_cross_ratios::Dart_const_handle,typename GeometricTraits_2::Point_2,typename GeometricTraits_2::Point_2,typename GeometricTraits_2::Point_2>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ +template +std::vector::Combinatorial_map_with_cross_ratios::Dart_const_handle,typename Traits_2::Hyperbolic_point_2,typename Traits_2::Hyperbolic_point_2,typename Traits_2::Hyperbolic_point_2>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ std::vector> realizations; size_t visited_darts_mark = _combinatorial_map.get_new_mark(); @@ -359,7 +362,7 @@ std::vector, std::vector>, Compare> queue; - std::map<_Dart_const_handle, _Complex_number> positions; + std::map<_Dart_const_handle, _Point> positions; _Dart_const_range darts = _combinatorial_map.darts(); @@ -368,22 +371,26 @@ std::vector(_anchor.vertices[0]); - positions[_anchor.dart] = center_the_drawing.evaluate(_anchor.vertices[0]).get_z(); - positions[const_ccw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[1]).get_z(); - positions[const_cw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[2]).get_z(); + _Isometry center_the_drawing = hyperbolic_translation(_anchor.vertices[0]); + positions[_anchor.dart] = center_the_drawing.evaluate(_anchor.vertices[0]); + positions[const_ccw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[1]); + positions[const_cw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[2]); } else { - positions[_anchor.dart] = _anchor.vertices[0].get_z(); - positions[const_ccw(_anchor.dart)] = _anchor.vertices[1].get_z(); - positions[const_cw(_anchor.dart)] = _anchor.vertices[2].get_z(); + positions[_anchor.dart] = _anchor.vertices[0]; + positions[const_ccw(_anchor.dart)] = _anchor.vertices[1]; + positions[const_cw(_anchor.dart)] = _anchor.vertices[2]; } std::tuple<_Dart_const_handle,_Point,_Point,_Point> value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); realizations.push_back(value); - double weight_of_anchor_dart = CGAL::to_double(_anchor.vertices[0].get_z().squared_modulus()) + CGAL::to_double(_anchor.vertices[1].get_z().squared_modulus()); - double weight_of_ccw_anchor_dart = CGAL::to_double(_anchor.vertices[1].get_z().squared_modulus() )+ CGAL::to_double(_anchor.vertices[2].get_z().squared_modulus()); - double weight_of_cw_anchor_dart = CGAL::to_double(_anchor.vertices[2].get_z().squared_modulus()) + CGAL::to_double(_anchor.vertices[0].get_z().squared_modulus()); + _Complex_number anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); + _Complex_number anchor_z1 (_anchor.vertices[1].x(), _anchor.vertices[1].y()); + _Complex_number anchor_z2 (_anchor.vertices[2].x(), _anchor.vertices[2].y()); + + double weight_of_anchor_dart = CGAL::to_double(anchor_z0.squared_modulus() + anchor_z1.squared_modulus()); + double weight_of_ccw_anchor_dart = CGAL::to_double(anchor_z1.squared_modulus() + anchor_z2.squared_modulus()); + double weight_of_cw_anchor_dart = CGAL::to_double(anchor_z2.squared_modulus() + anchor_z0.squared_modulus()); queue.push(std::make_pair(_anchor.dart, weight_of_anchor_dart)); queue.push(std::make_pair(const_ccw(_anchor.dart), weight_of_ccw_anchor_dart)); @@ -402,19 +409,22 @@ std::vector -bool Hyperbolic_surface_triangulation_2::is_valid() const{ +template +bool Hyperbolic_surface_triangulation_2::is_valid() const{ // 1. Check the combinatorial map // Check that the combinatorial map is valid @@ -471,8 +481,8 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ +template +void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ // Give indices to the darts std::map<_Dart_const_handle, int> darts_indices; int current_dart_index = 0; @@ -507,8 +517,8 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostre s << _anchor.vertices[0] << _anchor.vertices[1] << _anchor.vertices[2]; } -template -void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ +template +void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ _combinatorial_map.clear(); std::string line; @@ -564,60 +574,60 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::ist //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.to_stream(s); return s; } -template -void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::ccw(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::ccw(_Dart_handle dart){ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::cw(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::cw(_Dart_handle dart){ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::opposite(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::opposite(_Dart_handle dart){ return _combinatorial_map.opposite(dart); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(_Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(_Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(_Dart_const_handle dart) const{ return _combinatorial_map.opposite(dart); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::_Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(_Dart_const_handle dart) const{ return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ +template +typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ for (typename _Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ if ( is_delaunay_flippable(it) ){ return it; @@ -628,14 +638,15 @@ typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyp //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ - _combinatorial_map.copy_from_const(cmap); +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ + //_combinatorial_map.copy_from_const(cmap); + _combinatorial_map.copy(cmap); _has_anchor = false; } -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ // Because of the anchor, we must operate the copy ourself _combinatorial_map.clear(); @@ -668,6 +679,26 @@ void Hyperbolic_surface_triangulation_2::copy_from(const Comb _has_anchor = true; } +//////////////////////////////////////////////////////////////////////////////// + +template +typename Traits_2::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Point& d) const{ + _Complex_number za (a.x(), a.y()); + _Complex_number zb (b.x(), b.y()); + _Complex_number zc (c.x(), c.y()); + _Complex_number zd (d.x(), d.y()); + return (zd-zb)*(zc-za) / ((zd-za)*(zc-zb)); +} + +template +typename Traits_2::Hyperbolic_point_2 Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Complex_number& cratio) const{ + _Complex_number za (a.x(), a.y()); + _Complex_number zb (b.x(), b.y()); + _Complex_number zc (c.x(), c.y()); + _Complex_number result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); + return _Point(result.real(), result.imag()); +} + } // namespace CGAL #endif // CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h index d4779680ec0b..551f6bbf3801 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h @@ -20,6 +20,8 @@ namespace CGAL { +/* + template class Hyperbolic_point_2 { private: @@ -48,9 +50,14 @@ void operator>>(std::istream& s, Hyperbolic_point_2& point) { point.set_z(z); } +*/ + + /* Traits class offered by CGAL. */ + +/* template class Hyperbolic_surfaces_traits_2 { public: @@ -58,6 +65,15 @@ class Hyperbolic_surfaces_traits_2 { typedef Complex_without_sqrt Complex; typedef Hyperbolic_point_2 Point_2; }; +*/ + +template +class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { +public: + typedef typename HyperbolicTraitsClass::FT FT; + typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2; + typedef Complex_without_sqrt Complex; +}; } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index d4dc8492bda2..feeb70859899 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -51,9 +51,6 @@ int main() { std::cout << "printing a complex for test purposes : " << std::endl << z2_gmpq << std::endl; - Complex_gmpq cr_gmpq = cross_ratio(z1_gmpq, -z2_gmpq, z1_gmpq.conjugate(), z2_gmpq); - assert( fourth_point_from_cross_ratio(z1_gmpq,-z2_gmpq,z1_gmpq.conjugate(),cr_gmpq) == z2_gmpq); - Complex_gmpq z3_gmpq; std::stringstream buffer; buffer << z2_gmpq; @@ -86,11 +83,6 @@ int main() { std::cout << "printing a complex for test purposes : " << std::endl << z2_integer << std::endl; - Complex_integer cr_integer = cross_ratio(z1_integer, -z2_integer, z1_integer.conjugate(), z2_integer); - Complex_integer not_z2_integer = fourth_point_from_cross_ratio(z1_integer,-z2_integer,z1_integer.conjugate(),cr_integer); - assert( not_z2_integer != z2_integer); - assert( not_z2_integer == Complex_integer(Exact_integer(0),Exact_integer(26)) ); - Complex_integer z3_integer; buffer << z2_integer; buffer >> z3_integer; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index 051bd16693e7..492e60f60c6d 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -12,36 +12,46 @@ #include #include -#include + #include #include +#include +#include +#include +#include +#include +#include using namespace CGAL; -typedef Gmpq FT; - -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; -typedef typename Traits::Point_2 Point; -typedef Complex_without_sqrt Complex; +typedef typename Traits::FT FT; +typedef typename Traits::Hyperbolic_point_2 Point; +typedef typename Traits::Complex Complex; int main() { std::vector vertices; - Complex z0 = Complex (FT(809,10000),FT(0)); - Complex z1 = Complex (FT(7359,10000),FT(1877,10000)); - Complex z2 = Complex (FT(-999,2500),FT(881,1000)); - Complex z3 = Complex (FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")); - vertices.push_back( Point(z0) ); - vertices.push_back( Point(z1) ); - vertices.push_back( Point(z2) ); - vertices.push_back( Point(z3) ); - vertices.push_back( Point(-z0) ); - vertices.push_back( Point(-z1) ); - vertices.push_back( Point(-z2) ); - vertices.push_back( Point(-z3) ); + Point z0 = Point(FT("4881/5000"),FT("0")); + Point z1 = Point(FT("9211/10000"),FT("2733/10000")); + Point z2 = Point(FT("1709/5000"),FT("7253/10000")); + Point z3 = Point(FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + Point z4 = Point(FT("-4881/5000"),FT("0")); + Point z5 = Point(FT("-9211/10000"),FT("-2733/10000")); + Point z6 = Point(FT("-1709/5000"),FT("-7253/10000")); + Point z7 = Point(FT("427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("-582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + vertices.push_back(z0); + vertices.push_back(z1); + vertices.push_back(z2); + vertices.push_back(z3); + vertices.push_back(z4); + vertices.push_back(z5); + vertices.push_back(z6); + vertices.push_back(z7); std::vector pairings; for (int k=0; k<8; k++){ @@ -51,11 +61,11 @@ int main() { Domain domain = Domain(vertices, pairings); assert( domain.size()==8 ); for (int k=0; k<8; k++){ - assert( domain.vertex(k).get_z()==vertices[k].get_z()); + assert( domain.vertex(k)==vertices[k] ); assert( domain.paired_side(k)==(k+4)%8 ); - assert( domain.side_pairing(k).evaluate(domain.vertex((k+4)%8)).get_z()==domain.vertex((k+1)%8).get_z() ); - assert( domain.side_pairing(k).evaluate(domain.vertex((k+5)%8)).get_z()==domain.vertex(k).get_z() ); + assert( domain.side_pairing(k).evaluate(domain.vertex((k+4)%8))==domain.vertex((k+1)%8) ); + assert( domain.side_pairing(k).evaluate(domain.vertex((k+5)%8))==domain.vertex(k) ); } assert( domain.is_valid() ); @@ -64,11 +74,11 @@ int main() { domain_prime.set(vertices, pairings); assert( domain_prime.size()==8 ); for (int k=0; k<8; k++){ - assert( domain_prime.vertex(k).get_z()==vertices[k].get_z()); + assert( domain_prime.vertex(k)==vertices[k]); assert( domain_prime.paired_side(k)==(k+4)%8 ); - assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+4)%8)).get_z()==domain_prime.vertex((k+1)%8).get_z() ); - assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+5)%8)).get_z()==domain_prime.vertex(k).get_z() ); + assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+4)%8))==domain_prime.vertex((k+1)%8) ); + assert( domain_prime.side_pairing(k).evaluate(domain_prime.vertex((k+5)%8))==domain_prime.vertex(k) ); } Domain domain_ter = Domain(); @@ -77,7 +87,7 @@ int main() { buffer >> domain_ter; assert( domain_ter.size()==8 ); for (int k=0; k<8; k++){ - assert( domain_ter.vertex(k).get_z()==vertices[k].get_z()); + assert( domain_ter.vertex(k)==vertices[k]); assert( domain_ter.paired_side(k)==(k+4)%8 ); } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index 0936b0455c5c..07836e76033e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -13,20 +13,27 @@ #include #include #include -#include + +#include #include +#include +#include +#include +#include +#include +#include using namespace CGAL; -typedef Gmpq FT; - -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; -typedef typename Traits::Point_2 Point; -typedef Complex_without_sqrt Complex; +typedef typename Traits::FT FT; +typedef typename Traits::Hyperbolic_point_2 Point; +typedef typename Traits::Complex Complex; int main() { @@ -34,22 +41,26 @@ int main() { Domain domain = factory.generate_domain_g2(); std::vector vertices; - Complex z0 = Complex (FT("4881/5000"),FT("0")); - Complex z1 = Complex (FT("9211/10000"),FT("2733/10000")); - Complex z2 = Complex (FT("1709/5000"),FT("7253/10000")); - Complex z3 = Complex (FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); - vertices.push_back( Point(z0) ); - vertices.push_back( Point(z1) ); - vertices.push_back( Point(z2) ); - vertices.push_back( Point(z3) ); - vertices.push_back( Point(-z0) ); - vertices.push_back( Point(-z1) ); - vertices.push_back( Point(-z2) ); - vertices.push_back( Point(-z3) ); + Point z0 = Point(FT("4881/5000"),FT("0")); + Point z1 = Point(FT("9211/10000"),FT("2733/10000")); + Point z2 = Point(FT("1709/5000"),FT("7253/10000")); + Point z3 = Point(FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + Point z4 = Point(FT("-4881/5000"),FT("0")); + Point z5 = Point(FT("-9211/10000"),FT("-2733/10000")); + Point z6 = Point(FT("-1709/5000"),FT("-7253/10000")); + Point z7 = Point(FT("427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("-582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + vertices.push_back(z0); + vertices.push_back(z1); + vertices.push_back(z2); + vertices.push_back(z3); + vertices.push_back(z4); + vertices.push_back(z5); + vertices.push_back(z6); + vertices.push_back(z7); assert( domain.size()==8 ); for (int k=0; k<8; k++){ - assert( domain.vertex(k).get_z()==vertices[k].get_z()); + assert( domain.vertex(k)==vertices[k]); assert( domain.paired_side(k)==(k+4)%8 ); } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index 7115b0214666..4fd0ad41a615 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -12,20 +12,26 @@ #include #include -#include + #include #include +#include +#include +#include +#include +#include +#include using namespace CGAL; -typedef Gmpq FT; - -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_isometry_2 Isometry; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_isometry_2 Isometry; -typedef typename Traits::Point_2 Point; -typedef Complex_without_sqrt Complex; +typedef typename Traits::FT FT; +typedef typename Traits::Hyperbolic_point_2 Point; +typedef typename Traits::Complex Complex; int main() { @@ -65,31 +71,31 @@ int main() { assert( h.get_coefficient(2) == Complex(FT(-192,17),FT(504,85)) ); assert( h.get_coefficient(3) == Complex(FT(5333816,65025),FT(8,17)) ); - Point point (Complex(FT(3,11),FT(-1,73))); + Point point (FT(3,11),FT(-1,73)); Point image_point = h.evaluate(point); - assert( image_point.get_z()==Complex(FT(9146011623056232,66567955527962869), FT(-12617302915955411,133135911055925738)) ); + assert( image_point==Point(FT(9146011623056232,66567955527962869), FT(-12617302915955411,133135911055925738)) ); std::cout << "printing an isometry for test purposes : " << std::endl << h; Isometry tau_1 = hyperbolic_translation(point); - Isometry tau_1_prime = hyperbolic_translation(Point(-point.get_z()), true); + Isometry tau_1_prime = hyperbolic_translation(Point (FT(-3,11),FT(1,73)), true); Isometry tau_1_inv = hyperbolic_translation(point, true); - assert( tau_1.evaluate(image_point).get_z() == tau_1_prime.evaluate(image_point).get_z() ); - assert( tau_1.compose(tau_1_inv).evaluate(image_point).get_z() == image_point.get_z() ); + assert( tau_1.evaluate(image_point) == tau_1_prime.evaluate(image_point) ); + assert( tau_1.compose(tau_1_inv).evaluate(image_point) == image_point ); - Point p (Complex(FT(2,15),FT(0))); - Point q (Complex(FT(0),FT(17,93))); + Point p (FT(2,15),FT(0)); + Point q (FT(0),FT(17,93)); Isometry rotation = hyperbolic_rotation(p, q); Isometry rotation_prime = hyperbolic_rotation(q, p, true); Isometry rotation_inv = hyperbolic_rotation(p, q, true); - assert( rotation.evaluate(image_point).get_z() == rotation_prime.evaluate(image_point).get_z() ); - assert( rotation.compose(rotation_inv).evaluate(image_point).get_z() == image_point.get_z() ); + assert( rotation.evaluate(image_point) == rotation_prime.evaluate(image_point) ); + assert( rotation.compose(rotation_inv).evaluate(image_point) == image_point ); Point p_imag = rotation.evaluate(p); Point q_imag = rotation.evaluate(q); - Isometry pairing = segments_pairing(p, q, p_imag, q_imag); - assert( pairing.evaluate(p).get_z() == p_imag.get_z() ); - assert( pairing.evaluate(q).get_z() == q_imag.get_z() ); + Isometry pairing = isometry_pairing_the_sides(p, q, p_imag, q_imag); + assert( pairing.evaluate(p) == p_imag ); + assert( pairing.evaluate(q) == q_imag ); return 0; } From 6b424b1a33c16bfdf189e96428d7b93165449cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 12 Apr 2024 13:50:03 +0200 Subject: [PATCH 08/97] documentation almost finished up to user manual --- Documentation/doc/Documentation/packages.txt | 1 + .../CGAL/Complex_without_sqrt.h | 30 +- .../CGAL/Hyperbolic_fundamental_domain_2.h | 32 +- .../Hyperbolic_fundamental_domain_factory_2.h | 15 +- .../CGAL/Hyperbolic_isometry_2.h | 46 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 120 +- .../CGAL/Hyperbolic_surfaces_traits_2.h | 66 +- .../Concepts/HyperbolicSurfacesTraits_2.h | 38 + .../Doxyfile.in | 6 +- .../PackageDescription.txt | 32 +- .../fig/cover.svg | 16 +- .../fig/header.svg | 20664 ++++++++++++++++ .../data/domain | 2 +- .../data/input triangulation | 38 +- .../data/output triangulation | 58 +- .../example.cpp | 47 +- .../include/CGAL/Complex_without_sqrt.h | 2 - .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- 18 files changed, 20904 insertions(+), 311 deletions(-) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/header.svg diff --git a/Documentation/doc/Documentation/packages.txt b/Documentation/doc/Documentation/packages.txt index aa061c842d8d..ea73a88914ce 100644 --- a/Documentation/doc/Documentation/packages.txt +++ b/Documentation/doc/Documentation/packages.txt @@ -70,6 +70,7 @@ \package_listing{Triangulation_on_sphere_2} \package_listing{Periodic_2_triangulation_2} \package_listing{Hyperbolic_triangulation_2} +\package_listing{Hyperbolic_surface_triangulation_2} \package_listing{Periodic_4_hyperbolic_triangulation_2} \package_listing{Triangulation_3} \package_listing{TDS_3} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h index 2767665f893c..3b3bc49e7d22 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h @@ -6,35 +6,27 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Templated by a field type FT. Represents a complex number over FT. +Templated by a field type FT, represents a complex number over FT. -\tparam FT is the field type and must be a model of `Field`. +\tparam FT is the field type and must be a model of `FieldNumberType`. */ template class Complex_without_sqrt { -private: - typedef Complex_without_sqrt _Self; - public: - /// \name Types - /// @{ - typedef FT Ft; - /// @} - /// \name Creation /// @{ /*! - Default constructor. Sets the complex number to 0 + 0 * i. + Default constructor, sets the complex number to 0 + 0 * i. */ Complex_without_sqrt(); /*! - Constructor from the real part. Sets the complex number to 'real' + 0 * i. + Constructor from the real part, sets the complex number to 'real' + 0 * i. */ Complex_without_sqrt(const FT& real); /*! - Constructor from the real and imaginary parts. Sets the complex number to 'real' + 'imaginary' * i. + Constructor from the real and imaginary parts, sets the complex number to 'real' + 'imaginary' * i. */ Complex_without_sqrt(const FT& real, const FT& imag); /// @} @@ -72,32 +64,32 @@ class Complex_without_sqrt { /*! Returns the conjugate */ - _Self conjugate() const; + Complex_without_sqrt conjugate() const; /*! Returns the sum of itself and other */ - _Self operator+(const _Self& other) const; + Complex_without_sqrt operator+(const Complex_without_sqrt& other) const; /*! Returns the difference of itself and other */ - _Self operator-(const _Self& other) const; + Complex_without_sqrt operator-(const Complex_without_sqrt& other) const; /*! Returns the opposite of itself */ - _Self operator-() const; + Complex_without_sqrt operator-() const; /*! Returns the multiplication of itself and other */ - _Self operator*(const _Self& other) const; + Complex_without_sqrt operator*(const Complex_without_sqrt& other) const; /*! Returns the division of itself by other */ - _Self operator/(const _Self& other) const; + Complex_without_sqrt operator/(const Complex_without_sqrt& other) const; /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 1b60e620dbeb..7c504f87f900 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -6,29 +6,17 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a convex geodesic fundamental domain of a closed orientable hyperbolic surface. -The domain is given as a polygon P given by the list of its vertices in the Poincaré disk model, +Represents a fundamental domain of a closed orientable hyperbolic surface, the domain is convex and its edges are geodesic segments. +The domain is given as a polygon P represented by the list of its vertices in the Poincaré disk model, together with a pairing of the sides of P. The n-th side of P is the side between the n-th and the (n+1)-th vertex, where indices are modulo the number of vertices of P. -The sides pairing are represented by a list of integers, such that if the n-th integer of the list is m, then the n-th side is paired to the m-th side +The sides pairing are represented by a list of integers, such that if the n-th integer of the list is m, then the n-th side is paired to the m-th side. -\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ -template +template class Hyperbolic_fundamental_domain_2 { -private: - typedef typename GeometricTraits_2::Point_2 _Point; - typedef Hyperbolic_isometry_2 _Isometry; - - std::vector<_Point> _vertices; - std::vector _pairings; - public: - /// \name Types - /// @{ - typedef GeometricTraits_2 Geometric_traits_2; - /// @} - /// \name Creation /// @{ /*! @@ -39,7 +27,7 @@ class Hyperbolic_fundamental_domain_2 { /*! Constructor from the list of vertices and the sides pairing. */ - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); /// @} /// \name Get and set @@ -47,7 +35,7 @@ class Hyperbolic_fundamental_domain_2 { /*! Sets the vertices and the sides pairings of the domain. */ - void set(const std::vector& vertices, const std::vector& pairings); + void set(const std::vector& vertices, const std::vector& pairings); /*! Returns the number of vertices (equivalently, the number of sides) of the domain. @@ -57,7 +45,7 @@ class Hyperbolic_fundamental_domain_2 { /*! Returns the index-th vertex */ - typename GeometricTraits_2::Point_2 vertex(int index) const; + typename Traits_2::Hyperbolic_point_2 vertex(int index) const; /*! Returns the index of the side paired to side A, where A is the index-th side @@ -65,9 +53,9 @@ class Hyperbolic_fundamental_domain_2 { int paired_side(int index) const; /*! - // Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B */ - Hyperbolic_isometry_2 side_pairing(int index) const; + Hyperbolic_isometry_2 side_pairing(int index) const; /// @} /// \name Stream input output diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index a42559e0fd31..15d580891a52 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -6,22 +6,17 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Factory class, whose only purpose is to randomly generate some convex domains of closed orientable hyperbolic surfaces of genus two. +Factory class, whose only purpose is to randomly generate some domains of surfaces of genus two. -\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ -template +template class Hyperbolic_fundamental_domain_factory_2{ public: - /// \name Types - /// @{ - typedef GeometricTraits_2 Geometric_traits_2; - /// @} - /// \name Creation /// @{ /*! - Default constructor. The seed is used for random generation + Default constructor, the seed is used for random generation. */ Hyperbolic_fundamental_domain_factory_2(unsigned int seed); /// @} @@ -31,7 +26,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /*! Randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. */ - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_2 generate_domain_g2(); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index fc0c8aca73e4..44444a388256 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -6,29 +6,21 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents an isometry in the Poincare disk model. -The isometry f is stored as list (c0, c1, c2, c3) of four complex numbers, +Represents an isometry in the Poincaré disk model. +The isometry f is represented by a list (c0, c1, c2, c3) of complex numbers, so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. -\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +Facilities are offered to compose isometries, and apply an isometry to a point. + +\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ -template +template class Hyperbolic_isometry_2{ - private: - typedef Hyperbolic_isometry_2 _Self; - typedef Complex_without_sqrt<_FT> _Cmplx; - typedef typename GeometricTraits_2::Point_2 _Point; - public: - /// \name Types - /// @{ - typedef GeometricTraits_2 Geometric_traits_2; - /// @} - /// \name Creation /// @{ /*! - Default constructor + Default constructor. */ Hyperbolic_isometry_2(); /// @} @@ -36,39 +28,37 @@ class Hyperbolic_isometry_2{ /// \name Get and set /// @{ /*! - Set the isometry to the identity + Set the isometry to the identity. */ void set_to_identity(); /*! - Can be used to set the coefficients of the isometry manually. - Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + Can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. */ - void set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3); + void set_coefficients(const Traits_2::Complex& c0, const Traits_2::Complex& c1, const Traits_2::Complex& c2, const Traits_2::Complex& c3); /*! - Can be used to set one coefficient of the isometry smanually. - Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + Can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. */ - void set_coefficient(int index, const _Cmplx& coefficient); + void set_coefficient(int index, const Traits_2::Complex& coefficient); /*! - Returns the index-th coefficient + Returns the index-th coefficient. */ - _Cmplx get_coefficient(int index) const; + Traits_2::Complex get_coefficient(int index) const; /// @} /// \name Operations /// @{ /*! - Evaluates the isometry at point + Evaluates the isometry at the point. */ - _Point evaluate(const _Point& point) const; + Traits_2::Hyperbolic_point_2 evaluate(const Traits_2::Hyperbolic_point_2& point) const; /*! - Returns the composition of itself and other + Returns the composition of itself and other. */ - _Self compose(const _Self& other) const; + Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index ec56c6226890..316865ca740e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -6,78 +6,74 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -The class `Hyperbolic_surface_triangulation_2` is the main class of the Hyperbolic Surface Triangulation package. -It represents a triangulation of a closed orientable hyperbolic surface. -It offers factilities such as the generation of the triangulation from a convex fundamental domain, -the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model. +Represents a triangulation of a closed orientable hyperbolic surface, whose edges are geodesic segments. -\tparam GeometricTraits_2 is the geometric traits class and must be a model of `HyperbolicSurfacesTraits_2`. +Offers facilities such as the generation of the triangulation from a convex fundamental domain, +the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. + +The triangulation T is represented internally by an instance of CGAL::Combinatorial_map whose edges are attributed complex numbers. The complex number attributed to an edge e of T is the cross ratio of e in T, it can be defined as follows. Consider a lift f of e in the Poincaré disk model of the hyperbolic plane. +Orient f, and let z0 and z2 be the two complex numbers representing the first and second vertices of f. +Consider the lifted triangle of T that lies on the right of f, and let z1 be the complex number representing the third vertex of this triangle (the vertex distinct from z0 and z2). +Similarly, consider the lifted triangle of T that lies on the left of f, and let z3 be the complex number representing the third vertex of this triangle. +The cross ratio of e in T is then the complex number (z3-z1)*(z2-z0) / ((z3-z0)*(z2-z1)). This definition does not depend on the choice of the lift f, nor on the orientation of f. + +The triangulation T can optionnally contain some additional data: the anchor. +The anchor contains a lift t of a triangle of T in the hyperbolic plane: t is represented by its three vertices in the Poincaré disk model, and by a dart of the corresponding triangle in the combinatorial map of T. +While the combinatorial map and its cross ratios uniquely determine T, the anchor is used when building a portion of the lift of T in the hyperbolic plane. + + +\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ -template +template class Hyperbolic_surface_triangulation_2{ public: /// \name Types /// @{ - typedef GeometricTraits_2 Geometric_traits_2; - struct Combinatorial_map_with_cross_ratios_item{ template struct Dart_wrapper{ - typedef Cell_attribute> Edge_attrib; + typedef Cell_attribute> Edge_attrib; typedef std::tuple Attributes; }; }; + /*! + Type of combinatorial map whose edges are attributed complex numbers. + */ typedef Combinatorial_map<2,Combinatorial_map_with_cross_ratios_item> Combinatorial_map_with_cross_ratios; + /*! + Stores a dart d of the combinatorial map, belonging to a triangle t, and stores the three vertices of a lift of t in the hyperbolic plane. + */ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; - typename GeometricTraits_2::Point_2 vertices[3]; + typename Traits_2::Hyperbolic_point_2 vertices[3]; }; /// @} -private: - typedef typename Combinatorial_map_with_cross_ratios::Dart_handle _Dart_handle; - typedef typename Combinatorial_map_with_cross_ratios::Dart_range _Dart_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> _Vertex_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> _Edge_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> _Face_range; - - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle _Dart_const_handle; - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range _Dart_const_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> _Edge_const_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> _Face_const_range; - - typedef typename GeometricTraits_2::FT _Number; - typedef Complex_without_sqrt<_Number> _Complex_number; - typedef typename GeometricTraits_2::Point_2 _Point; - typedef Hyperbolic_isometry_2 _Isometry; - typedef Hyperbolic_fundamental_domain_2 _Domain; - -public: /// \name Creation /// @{ /*! - Default constructor + Default constructor. */ Hyperbolic_surface_triangulation_2() {}; /*! - Constructor from a convex fundamental domain + Constructor from a convex fundamental domain: triangulates the polygon of the domain, and identifies the paired sides of the domain. */ - Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); /*! - Constructor from a decorated combinatorial map + Constructor from a decorated combinatorial map. */ Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); /*! - Constructor from a decorated combinatorial map and an anchor + Constructor from a decorated combinatorial map and an anchor. */ Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); /*! - Copy constructor + Copy constructor. */ Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); /// @} @@ -85,48 +81,35 @@ class Hyperbolic_surface_triangulation_2{ /// \name Get and set /// @{ /*! - Returns the decorated combinatorial map + Returns the decorated combinatorial map. */ Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); /*! - Tells whether the triangulation is anchored + Tells if the triangulation has an anchor. */ bool has_anchor() const; /*! - Returns the anchor + Returns the anchor (if there is one). */ Anchor& get_anchor_ref(); /// @} - /// \name Stream input output + /// \name Delaunay flip algorithm /// @{ /*! - Writes the triangulation in a stream + Tells if if the edge supported by the dart is Delaunay flippable. */ - void to_stream(std::ostream& s) const; + bool is_delaunay_flippable(Combinatorial_map_with_cross_ratios::Dart_handle dart) const; /*! - Reads the triangulation from a stream + Flips the edge supported by the dart. */ - void from_stream(std::istream& s); - /// @} + void flip(Combinatorial_map_with_cross_ratios::Dart_handle dart); - /// \name Delaunay flips algorithm - /// @{ /*! - Tells whether an edge is Delaunay flippable - */ - bool is_delaunay_flippable(_Dart_handle dart) const; - - /*! - Flips a Delaunay flippable edge - */ - void flip(_Dart_handle dart); - - /*! - Applies the Delaunay flips algorithm + Applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. */ int make_delaunay(); /// @} @@ -134,20 +117,33 @@ class Hyperbolic_surface_triangulation_2{ /// \name Lifting /// @{ /*! - Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. - The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. - This method is to be used only if the triangulation has an anchor. + Lifts the triangulation in the hyperbolic plane. Returns, for every triangle T of the triangulation, one of the darts of T in the combinatorial map of the triangulation, together with a triple A,B,C of points in the hyperbolic plane. + The points A,B,C are the vertices of a lift of T in the hyperbolic plane. + This method is to be used only if the triangulation has an anchor. */ - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; /// @} /// \name Validity /// @{ /*! - Partial validity test + Partial validity test. */ bool is_valid() const; /// @} + + /// \name Stream input output + /// @{ + /*! + Writes the triangulation in a stream. + */ + void to_stream(std::ostream& s) const; + + /*! + Reads the triangulation from a stream. + */ + void from_stream(std::istream& s); + /// @} }; } //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h index b743d606824d..e3d8a33a5cef 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h @@ -3,72 +3,28 @@ namespace CGAL { -template -class Hyperbolic_point_2 { - public: - /// \name Types - /// @{ - typedef ComplexType Complex; - /// @} - - /// \name Creation - /// @{ - /*! - %Default constructor - */ - Hyperbolic_point_2(); - - /*! - %Constructor from the complex number representing the point - */ - Hyperbolic_point_2(const Complex& z); - /// @} - - /// \name Get and set - /// @{ - /*! - %Get the complex number representing the point - */ - Complex get_z() const; - - /*! - %Set the complex number representing the point - */ - void set_z(const Complex& z); - /// @} -}; - -template -std::ostream& operator<<(std::ostream& s, const Hyperbolic_point_2& point); - -template -void operator>>(std::istream& s, Hyperbolic_point_2& point); - /*! \ingroup PkgHyperbolicSurfaceTriangulation2TraitsClasses -The class `Hyperbolic_surfaces_traits_2` is designed as one of the -default models for the traits concept `HyperbolicSurfacesTraits_2` -offered by \cgal. +Traits class offered by \cgal as a default model for the traits concept `HyperbolicSurfacesTraits_2`. -\tparam FieldType must be a model of `Field`. +\tparam HyperbolicTraitsClass must be a model of `HyperbolicDelaunayTriangulationTraits_2`. -This class provides exact constructions and predicates. The default value for `FieldType` is `CGAL::Gmpq`, -which guarantees exact constructions when the input points have rational coordinates. - -\sa `Hyperbolic_surfaces_traits_2` +The default value for `HyperbolicTraitsClass` is `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>>`, + which provides exact constructions and predicates over rational numbers. \cgalModels{HyperbolicSurfacesTraits_2} */ -template -class Hyperbolic_surfaces_traits_2 { +template +class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { public: /// \name Types /// @{ - typedef FieldType FT; - typedef Complex_without_sqrt Complex; - typedef Hyperbolic_point_2 Point_2; - /// @} + typedef typename HyperbolicTraitsClass::FT FT; + typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2; + typedef Complex_without_sqrt Complex; + /// @} }; + } //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index e69de29bb2d1..3572ace8f06d 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -0,0 +1,38 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2Concepts +\cgalConcept + +\cgalRefines{HyperbolicDelaunayTriangulationTraits_2} + +The concept `HyperbolicSurfacesTraits_2` describes the set of requirements +to be fulfilled by any class instantiating the first template parameter of the main classes of the package. +Notably, it defines the field type, the complex number type, and the point type used by thoses classes. + +\cgalHasModelsBegin +\cgalHasModels{CGAL::Hyperbolic_surfaces_traits_2} +\cgalHasModelsEnd +*/ + +class HyperbolicSurfacesTraits_2 { +public: + /// \name Types + /// @{ + /*! + Field number type. + */ + typedef unspecified_type FT; + + /*! + Represents a point in the Poincaré disk model. + */ + typedef unspecified_type Hyperbolic_point_2; + + /*! + Represents a complex number over FT. + */ + typedef unspecified_type Complex; + /// @} +}; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in index 10555936e0cc..e2d86cae3c12 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in @@ -1,7 +1,5 @@ @INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} -EXTRACT_PRIVATE = NO +PROJECT_NAME = "CGAL ${CGAL_CREATED_VERSION_NUM} - Hyperbolic Surface Triangulations" -PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Hyperbolic Surface Triangulations" - -HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg +IMAGE_PATH += ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index a851bd373a87..2565b3bdb3f2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -9,52 +9,48 @@ /// \defgroup PkgHyperbolicSurfaceTriangulation2TraitsClasses Traits Classes /// \ingroup PkgHyperbolicSurfaceTriangulation2Ref -/// \defgroup PkgHyperbolicSurfaceTriangulation2VertexFaceClasses Face Classes -/// \ingroup PkgHyperbolicSurfaceTriangulation2Ref - /*! \addtogroup PkgHyperbolicSurfaceTriangulation2Ref -\cgalPkgDescriptionBegin{Hyperbolic Surface Triangulations} -\cgalPkgPicture{Hyperbolic_surface_triangulation_2/fig/cover.svg} - +\cgalPkgDescriptionBegin{Hyperbolic Surface Triangulations,PkgHyperbolicSurfaceTriangulation2} +\cgalPkgPicture{cover.svg} \cgalPkgSummaryBegin -\cgalPkgAuthors{Vincent Despré, Loïc Dubois, Monique Teillaud} -\cgalPkgDesc{This package enables handling and building triangulations of closed orientable hyperbolic surfaces. A method is offered that implements the Delaunay flip algorithm on such triangulations. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} +\cgalPkgAuthors{Vincent Despré, Loïc Dubois, and Monique Teillaud} +\cgalPkgDesc{This package enables handling and building triangulations of closed orientable hyperbolic surfaces. Facilities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} \cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} \cgalPkgSummaryEnd - \cgalPkgShortInfoBegin \cgalPkgSince{6} -\cgalPkgDependsOn{\ref PkgCombinatorialMap} -\cgalPkgBib{} +\cgalPkgDependsOn{\ref PkgCombinatorialMaps} +\cgalPkgBib{cgal:nobibfornow} \cgalPkgLicense{\ref licensesGPL "GPL"} -\cgalPkgDemo{Hyperbolic Surface Triangulation,Hyperbolic_Surface_triangulation_2.zip} +\cgalPkgDemo{Hyperbolic Surface Triangulations,nofilefornow.zip} \cgalPkgShortInfoEnd - \cgalPkgDescriptionEnd + \cgalClassifedRefPages \cgalCRPSection{Concepts} -- `HyperbolicSurfacesTraits_2` describes the requirements for triangulations, convex fundamental domains, and isometries of the Poincaré disk modeL +- `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the first template parameter of the main classes of the package. \cgalCRPSection{Classes} -- `CGAL::Hyperbolic_Surface_triangulation_2` is the main class of the Hyperbolic Surface Triangulation package. It represents a triangulation of a closed orientable hyperbolic surface. It offers factilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface, whose edges are geodesic segments. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain in the Poincaré disk model. The domain is a convex polygon given by the list of its vertices, and a pairing of the sides of the polygon. A method is offered that computes the isometry sending a side to its paired side. +- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface, the domain is convex and its edges are geodesic segments. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` randomly generates convex fundamental domains of closed orientable hyperbolic surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some domains of surfaces of genus two. - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. - `CGAL::Complex_without_sqrt` represents a complex number. A model for the concept `HyperbolicSurfacesTraits_2` is provided: -- `CGAL::Hyperbolic_surfaces_traits_2` is templated by a fiel type FT and guarantees exact constructions for input points with coordinates in FT. +- `CGAL::Hyperbolic_surfaces_traits_2` inherits from its template parameter HyperbolicTraitsClass. HyperbolicTraitsClass must be a model of `CGAL::HyperbolicDelaunayTriangulationTraits_2`. + */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg index 48e01a5158e2..51db91191f5f 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/cover.svg @@ -9,9 +9,9 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="90.006813mm" - height="90.160774mm" - viewBox="0 0 90.006815 90.160775" + width="29.70225mm" + height="29.753056mm" + viewBox="0 0 29.70225 29.753055" version="1.1" id="svg8" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" @@ -71,9 +71,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.49497476" - inkscape:cx="-475.699" - inkscape:cy="-29.499758" + inkscape:zoom="1.4" + inkscape:cx="322.83357" + inkscape:cy="-170.07787" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" @@ -100,9 +100,9 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(-158.80253,-123.89283)"> + transform="translate(-188.9548,-154.09669)"> + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain index 818b94610fc8..1e215f909937 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain @@ -7,4 +7,4 @@ 1 2 3 -9933/10000 0/14649/10000 821/1250-279/2500 338/625-691606090839819251686222707053325448173470909/791340231865496639850333043353447401253850000 41259675119916560624187827593431919306102719/98917528983187079981291630419180925156731250-9933/10000 0/1-4649/10000 -821/1250279/2500 -338/625691606090839819251686222707053325448173470909/791340231865496639850333043353447401253850000 -41259675119916560624187827593431919306102719/98917528983187079981291630419180925156731250 \ No newline at end of file +8699/10000 0/11861/10000 1733/2500-3377/10000 9003/10000-6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 5223442426846244308918986056775777360051/9940656140785426707445141474848966485000-8699/10000 0/1-1861/10000 -1733/25003377/10000 -9003/100006620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/9940656140785426707445141474848966485000 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation index 763be3b29f1f..78b05054ac81 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation @@ -19,40 +19,40 @@ 16 0 10 -447186528675781537801474254857733906238478935768709361530755611299132858599333364017148179416771201069902000905581849758421942133912783806166766/102456043558103770086094065519521334984971886517763666416006340075578329440603749603193641598816041210641527246020081664221664393519851201887107 --26703794287859213795177242752119305119226368666019070558339901136488524640838668607961492119544712918424734789456902814928945961943342231716562/102456043558103770086094065519521334984971886517763666416006340075578329440603749603193641598816041210641527246020081664221664393519851201887107 +31506456736405903020370389752002223618739050934773356476494603930661888400247155106521882837735915590914302367561251569996069054771/19666908619024398748661111194680998812161200490089420512800226939763143826288426638968195633548351364196902255728000484168455372921 +-10942036471875720789661373633987476000278817326569744001031482740881162495813282774078651622772378927112795054222078631808380976570/19666908619024398748661111194680998812161200490089420512800226939763143826288426638968195633548351364196902255728000484168455372921 1 13 -11213159724812122299119584366888127039653164328513039099010509575416353849157991317682044613834761781957991/10506485848098945424239728264377422433596505749494225252432558778376636667104264463281788704546892285312500 --250024949093085809294968619726594046210729090832785802991673387383082135541919761342891684924814482349987/10506485848098945424239728264377422433596505749494225252432558778376636667104264463281788704546892285312500 +781495798070627006240716806122025726923037870049911391732354523001194837454202883145862222364700736/518959061964181593065228471522802585455159787087527619446826772869615047041589398927831625454753875 +-189371139005493597405801850741198856424898333894357777815345725964528561388869334334384331324813952/518959061964181593065228471522802585455159787087527619446826772869615047041589398927831625454753875 2 3 -16200890636470732097066230988579416128973996836397536807/13277371966811210817556660930832150066211711248042325401 -39764993301423141548431380222903256111099482615527462/13277371966811210817556660930832150066211711248042325401 +33170177440464786037472229658217437089162532200904069/28653081009409190506186758645478542974247822783293428 +-2881683164465598049360620044098315562600796282921627/28653081009409190506186758645478542974247822783293428 4 16 -21876136744606842981437392092043558423102680489304735016272009115123035088448189449095337326094083964491/24169299587058030236450995941689198627023750863208523766173764428176456452733340803541277406445927768192 --500083148872945114139005721714700060624428087234605329750382330676715229026375269485974296403913661527/1510581224191126889778187246355574914188984428950532735385860276761028528295833800221329837902870485512 +4968299124723638747470108984820672788583954090330933476742557608662529252342845259348637207946588/1092723322016120716697135186936420972199720229313106050600294971658808361779690253357358402590801 +-3710777211174814069803263597089707253605910565291672515132945250011055487415185079146286040277016/1092723322016120716697135186936420972199720229313106050600294971658808361779690253357358402590801 5 6 -6268479009204879977105486598171382278407351982230783258689653654382646312359919529289927018307179/4061656741795181574746768556245107687575937024836402640882239743976705165841123699521309798964525 --2268961621854229329869397783089753533382514195610182212612625136258961258569981760093801776205152/4061656741795181574746768556245107687575937024836402640882239743976705165841123699521309798964525 +6868196145384959604496666901710238377850723465006792196291575673905052618260753468991653/4512179813278917894620980641174220845204410724290139615197173368381108374974869947312900 +992966786892819982858568422190986341410307226998576345153711088722823043609105491013523/2256089906639458947310490320587110422602205362145069807598586684190554187487434973656450 7 17 --4057485157163052630723618036779562746744519839717451226680261981889274839649746795397628886275181716805998229000253379/970599397631665801148653032213743180873400086089053166737510761749253209602631593144920177750104228702585543582011133 --34995503598610703286088982666908435397773589133100980116650151688551289828533529574724899626459438137205449674909415424/970599397631665801148653032213743180873400086089053166737510761749253209602631593144920177750104228702585543582011133 +3838745443937089205797672579622610574940724000512580094354841231935859013368227074455133372479862872729051776/2792774644075839789079825641406262199694380590959140310513183122642864419113366392739524183043200248176025425 +-419917553322016960246338861059632699136082144146026079734688609648112002646459230291767354514634912767695018/2792774644075839789079825641406262199694380590959140310513183122642864419113366392739524183043200248176025425 8 9 -45724439780544078941319330340411883727713360291683886210189674602749527225589859709060445657214461/34185393779135841079786121165116403996715106500498473355548557039118472371088235076397335891584625 -7558563915445632018014487449244426196747249673670831120301328235364598387560048696927961220014348/34185393779135841079786121165116403996715106500498473355548557039118472371088235076397335891584625 +3114766427122699665246846787487231099217947976229375660284921270902534685298858968767852/1436580578422650900222988739384048912302018101193137102559185467556416740710493104427325 +-480178213698279712120970016846476821429655020078205232858939611692290690401563240567064/1436580578422650900222988739384048912302018101193137102559185467556416740710493104427325 11 12 -6919282672264808788373750615835793903408550497925565129917498927899495206701947393/1914497977587076407464713087368148786980965774615350809092889613427624510321725636 -1734934652350122354307199446341446494876831800480341381153618436151758008121825151/1914497977587076407464713087368148786980965774615350809092889613427624510321725636 +3653219555667964529773235938987407912652506426196655912731639432265479411967/862105622530160440533988544608093897509008327675550103459967993437704876759 +821928388597754697723656111158999167770322913806691357525165361068978224664/862105622530160440533988544608093897509008327675550103459967993437704876759 14 15 -19363650467924620817113814672969817389190950814833373539/8385660713348827504673674392899647669015969924076077522 -4730015346175856773361915425202254662296805470736915047/4192830356674413752336837196449823834507984962038038761 +367972160625745498381781337885902553624408780293807/155993853182239792548992915927181900401134875092556 +-203686408962208932751841465532884383690422013015937/155993853182239792548992915927181900401134875092556 yes 0 -691606090839819251686222707053325448173470909/791340231865496639850333043353447401253850000 -41259675119916560624187827593431919306102719/989175289831870799812916304191809251567312509933/10000 0/14649/10000 821/1250 \ No newline at end of file +6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/99406561407854267074451414748489664850008699/10000 0/11861/10000 1733/2500 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation index f3581db4ae40..b770eeab7fb3 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation @@ -1,58 +1,58 @@ 18 0 -17 -8 +2 1 -6 3 -2 -9 -5 -4 -10 14 +11 +4 +6 7 -13 +5 12 -11 +9 +8 +13 +10 15 +17 16 0 10 -1171701131807607013883175441536438359056637630221592572043219/561215235555233630651127058439814364164078607435266780647275 --64293950378904405550370586369795493590853374394688078055808/561215235555233630651127058439814364164078607435266780647275 +1410000724299332371389937532179569909345394144843007514025660414206229132158133286943374347183749/943206938456426848032579404146903758988585847142955614923216948450820533926886687932406897458693 +-378203855070776132981855592240576514546653804754149596779405444218184870104170008110986172602592/943206938456426848032579404146903758988585847142955614923216948450820533926886687932406897458693 1 13 -175177794228943332699485376008552732319846908135463372970707757886594245485084351640/64909831790694496941819500604202200997031256146472444412669045413629357762259655489 --6776923776386859273610851274247046433976129524246239894583898097398543553087047424/64909831790694496941819500604202200997031256146472444412669045413629357762259655489 +19887196285155362006559791529168511521878079992153762798320374740982268112117465118536/5695659538440479945688231745469228747738456347456028770029769144745558792211768848325 +-2020047788855743957716975831845108354598311318683179072501379587874312874979490668184/1898553179480159981896077248489742915912818782485342923343256381581852930737256282775 2 3 -160481757183117073360763599147977619848689084587064975102240276523056302675315701330619761185849137867452861812958727914745292838011936026767/46078478919914993979131146204978748167044107041509489332706260049433435017259165143552461099129354239545955932877685060746285542596481191488 --586075592927007497575348262139967644516083671905915011609881235573945416053320888907747029368254322555117029767490639917195596119269240238/22319263226833825208641648943036581143411989348231158895529594711444320086484908116408223344890780959780072404987628701298982059695170577127 +6952553306127437081538854938783858191628119902512172/3553986791555825582432866732054454794023091951404233 +-117683685598659097344156110122051960107612839281662/3553986791555825582432866732054454794023091951404233 4 16 -24114082181697812017141681699/21714720433102296172051374143 --74463557192016738043534492672/195432483897920665548462367287 +69055447624598675510761206497378089755596880628450190282835993738602955377822671504/23082064347185302307994922894443016398172531426943122529923903901597058083720283433 +-16510233578563126183381484406110441677273046112784347381826830384078313894030637328/23082064347185302307994922894443016398172531426943122529923903901597058083720283433 5 6 -112755121519519225860988895580865288525393018689343339620304790934320070415854775598755275708746184921545188976285335/86774449112898353653395519253851382568605331097587990447698387281905618672581715381645927004863137865684599234033239 --1016972275395250812531304598110037069121655413752042419265967401645068630428071604998971339111736932843785755648000/28924816370966117884465173084617127522868443699195996815899462427301872890860571793881975668287712621894866411344413 +1049144868836174810155855532588462544991770341294219/565066778411545262213703803259792733610830505412100 +-973666829727979576537068308912339823765071013691099/1695200335234635786641111409779378200832491516236300 7 17 -15123176713372064024723286801736341935605318145202603631114436117152316213073596688878542813440341780988286602924095796580788857225532603844128336979/12638377662418532687678211071021479477754238044664565895087464029277054018694138740286575579207563133870013156656192553559097454228799571334118909184 --34871624205394135027155537070860922076189570967738805150821441755533347800947932959525298529056510520040613689609948689534061941680673992480005691/394949301950579146489944095969421233679819938895767684221483250914907938084191835633955486850236347933437911145506017298721795444649986604191215912 +9594373718491727209904832762705261976898972860619142190311548079277408483/5863591293207692876668472708486555803276952920809286612220352693895622500 +-93858350255859857801320495515080557659316462466407550282076592733768086/1465897823301923219167118177121638950819238230202321653055088173473905625 8 9 -175177794228943332699485376008552732319846908135463372970707757886594245485084351640/64909831790694496941819500604202200997031256146472444412669045413629357762259655489 --6776923776386859273610851274247046433976129524246239894583898097398543553087047424/64909831790694496941819500604202200997031256146472444412669045413629357762259655489 +6952553306127437081538854938783858191628119902512172/3553986791555825582432866732054454794023091951404233 +-117683685598659097344156110122051960107612839281662/3553986791555825582432866732054454794023091951404233 11 12 -1171701131807607013883175441536438359056637630221592572043219/561215235555233630651127058439814364164078607435266780647275 --64293950378904405550370586369795493590853374394688078055808/561215235555233630651127058439814364164078607435266780647275 +164145601358763061887064511271541162016808441468505801711118339937019152090722212948967560/116314153246275137925667195759016871345997882528619966514696077675729394736390029357319321 +-18086731335787069646367071980123057612042140519705630245572530376682480852944621571599400/116314153246275137925667195759016871345997882528619966514696077675729394736390029357319321 14 15 -13281329392/3746052025 --13939718656/3746052025 +1049144868836174810155855532588462544991770341294219/565066778411545262213703803259792733610830505412100 +-973666829727979576537068308912339823765071013691099/1695200335234635786641111409779378200832491516236300 yes 0 -691606090839819251686222707053325448173470909/791340231865496639850333043353447401253850000 -41259675119916560624187827593431919306102719/9891752898318707998129163041918092515673125045599195671870735594350379535549011208911059859002043314739324589552438987/48988515486233663384410970938345909831483644289612973015470861413366152500 -3841187362027735828012071282522110372486017391276289403195175136798381354/12247128871558415846102742734586477457870911072403243253867715353341538125279/2500 -338/625 \ No newline at end of file +6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/99406561407854267074451414748489664850008699/10000 0/11861/10000 1733/2500 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp index c636b8aa313d..0f513ec3893e 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -10,8 +10,8 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include #include +#include #include #include @@ -28,47 +28,28 @@ using namespace CGAL; typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_surface_triangulation_2 Triangulation; int main(){ + // Generates the domain: Factory factory = Factory(time(NULL)); - Domain domain; - Triangulation triangulation; - std::string filename = "./data/domain"; - - // Generate the domain - std::cout << "generating the domain " << std::endl; - domain = factory.generate_domain_g2(); - - // Save the domain - std::cout << "saving the domain " << std::endl; - std::ofstream output_file (filename.c_str()); - output_file << domain; - output_file.close(); - - // Triangulate the domain - std::cout << "triangulating the domain " << std::endl; - triangulation = Triangulation(domain); + Domain domain = factory.generate_domain_g2(); - // Save the resulting triangulation - std::cout << "saving the input triangulation " << std::endl; - output_file = std::ofstream ("./data/input triangulation"); - output_file << triangulation; - output_file.close(); + // Triangulates the domain: + Triangulation triangulation = Triangulation(domain); - // Delaunay flip the triangulation - std::cout << "Delaunay flipping the triangulation " << std::endl; - triangulation.make_delaunay(); + // Applies the Delaunay flip algorithm to the triangulation: + triangulation.make_delaunay(); - // Save the resulting triangulation - std::cout << "saving the output triangulation " << std::endl; - output_file = std::ofstream ("./data/output triangulation"); - output_file << triangulation; - output_file.close(); + // Saves the triangulation: + output_file = std::ofstream ("OutputTriangulation.txt"); + output_file << triangulation; + output_file.close(); - std::cout << triangulation << std::endl; + // Prints the triangulation: + std::cout << triangulation << std::endl; return 0; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 2e5a60238363..9d81b5887151 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -30,8 +30,6 @@ class Complex_without_sqrt { FT _real, _imag; public: - typedef FT Ft; - Complex_without_sqrt(); Complex_without_sqrt(const FT& real); Complex_without_sqrt(const FT& real, const FT& imag); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 6d8406712148..c2e7c1984d95 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -90,7 +90,7 @@ class Hyperbolic_surface_triangulation_2{ void to_stream(std::ostream& s) const; void from_stream(std::istream& s); - bool is_delaunay_flippable(_Dart_handle dart) const; // Should be const + bool is_delaunay_flippable(_Dart_handle dart) const; void flip(_Dart_handle dart); // Flips Delaunay flippable edges as long as possible int make_delaunay(); From 3d1d7282d1816b60057195d191906591e8b05f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 12 Apr 2024 17:46:46 +0200 Subject: [PATCH 09/97] user manual --- .../Hyperbolic_surface_triangulation_2.txt | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt new file mode 100644 index 000000000000..b872a73ef012 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -0,0 +1,97 @@ + +\page Chapter_Hyperbolic_Surface_Triangulations Triangulations of hyperbolic surfaces + +namespace CGAL { +/*! + +\mainpage User Manual +\anchor Chapter_Hyperbolic_Surface_Triangulations + +\cgalAutoToc +\authors Vincent Despré, Loïc Dubois, and Monique Teillaud + +
+ +
+ +This package enables handling and building triangulations of closed orientable hyperbolic surfaces. +Facilities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. +A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that randomly generates such domains in genus two. + + +\section Section_Hyperbolic_Surface_Triangulations_Background Background + +\subsection Subsection_Hyperbolic_Surface_Triangulations_Hyperbolic Hyperbolic surfaces + +We assume some familiarity with basic notions from covering space theory, and 2-dimensional hyperbolic geometry. In this document, every hyperbolic surface is connected and complete. The Poincaré disk \f$ \mathbb{D} \f$ is a simply connected hyperbolic surface whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. +In particular, every point of \f$ \mathbb{D} \f$ is a complex number. This package deals with the hyperbolic surfaces \f$ S \f$ that are closed (compact, and without boundary) and orientable. +Every such surface is homemorphic to the connect sum of \f$ g \geq 2 \f$ tori, where \f$ g \f$ is unique, and is called the genus of \f$ S \f$. +The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space of \f$ S \f$, where the projection map \f$ \mathbb{D} \to S \f$ is a (local) isometry. + +\subsection Subsection_Hyperbolic_Surface_Triangulations_Decomposition Fundamental domains and triangulations + +Let \f$ S \f$ be a closed orientable hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. +A graph \f$ G \f$ embedded in \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) has genus zero; It is in that sense that the faces of \f$ G \f$ are "manageable". +In this document, it is implicit that if a graph \f$ G \f$ is embedded in a hyperbolic surface \f$ S \f$, then every edge of \f$ G \f$ is geodesic in \f$ S \f$. +We consider two types of cellular decompositions of \f$ S \f$: + +
    +
  • We consider cellular decompositions \f$ G \f$ of \f$ S \f$ that have only one face. +Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, that we call fundamental domain for \f$ S \f$. +The edges of \f$ P \f$ are paired, so that every edge of \f$ G \f$ is cut into two edges that are paired in \f$ P \f$. +Every closed orientable hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$. + +
  • Also, we consider triangulations of \f$ S \f$. +A cellular decomposition \f$ T \f$ of \f$ S \f$ is a triangulation if every face of \f$ T \f$ is a "triangle", in the sense that it admits three incidences with edges of \f$ T \f$. +Observe that this definition allows for triangulations with only one vertex. +
+ +A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$. +The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of arbitrary arcs of \f$ P \f$. + +\subsection Subsection_Hyperbolic_Surface_Triangulations_Cratios_Delaunay Cross ratios and the Delaunay flip algorithm + +Let \f$ S \f$ be a closed orientable hyperbolic surface, and let \f$ T \f$ be a triangulation of \f$ S \f$. The geometry of \f$ T \f$ is unambiguously determined by the cross ratios of the edges of \f$ T \f$. The cross ratio of an edge \f$ e \f$ of \f$ T \f$ is a complex number \f$ R_T(e) \in \mathbb{C} \f$ defined as follows. +Consider the lift \f$ \widetilde T \f$ of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. +In \f$ \widetilde T \f$, let \f$ \widetilde e \f$ be a lift of \f$ e \f$. +Orient \f$ \widetilde e \f$ arbitrarily, and let \f$ z_0 \in \mathbb{D} \f$ and \f$ z_2 \in \mathbb{D} \f$ be respectively the first and second vertices of \f$ \widetilde e \f$. +In \f$ \widetilde T \f$, consider the triangle on the right of \f$ \widetilde e \f$, and let \f$ z_1 \in \mathbb{D} \f$ be the third vertex of this triangle (the vertex distinct from \f$ z_0 \f$ and \f$ z_2 \f$). +Similarly, consider the triangle on the left of \f$ \widetilde e \f$, and let \f$ z_3 \in \mathbb{D} \f$ be the third vertex of this triangle. +Then \f$ R_T(e) = (z_3-z_1)*(z_2-z_0) / ((z_3-z_0)*(z_2-z_1)) \f$. +This definition does not depend on the choice of the lift \f$ \widetilde e \f$, nor on the orientation of \f$ \widetilde e \f$. + +An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is negative or null. +This definition has an equivalent "empty disk" formulation, see . +Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. +If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. +This operation is called a flip. +When a flip occurs, the cross ratios of the edges involved are modified via simple formulas. +The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. +This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$. + + + + + + + + +\section Section_Hyperbolic_Surface_Triangulations_Content Content + + + + + + + +\section Section_Hyperbolic_Surface_Triangulations_Example Example + +The example below randomly generates a convex fundamental domain of a surface, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. +\cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} + + + +*/ +} /* namespace CGAL */ + +\\\\\\\\\\\\ From 1f1ca86d2d5484630d54bbe4fbd673d2470189fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 12 Apr 2024 18:29:18 +0200 Subject: [PATCH 10/97] finished with user manual --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 13 +++++++++--- .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 12 ++++++++++- .../Concepts/HyperbolicSurfacesTraits_2.h | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 20 +++++++++++++++---- .../PackageDescription.txt | 8 ++++---- 6 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 7c504f87f900..ba7a278d0d37 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -6,7 +6,7 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a fundamental domain of a closed orientable hyperbolic surface, the domain is convex and its edges are geodesic segments. +Represents a fundamental domain of a closed orientable hyperbolic surface. The domain is given as a polygon P represented by the list of its vertices in the Poincaré disk model, together with a pairing of the sides of P. The n-th side of P is the side between the n-th and the (n+1)-th vertex, where indices are modulo the number of vertices of P. @@ -61,12 +61,19 @@ class Hyperbolic_fundamental_domain_2 { /// \name Stream input output /// @{ /*! - Reads the domain from a stream + Reads the domain from a stream. + + The format of the input should be the same as the format of the output of the 'from_stream' method. */ void from_stream(std::istream& s); /*! - Writes the domain in a stream + Writes the domain in a stream. + + The format of the output is the following. + The first line prints the number n of vertices of the domain. + For i=0 to n-1 the index of the side paired to side i is printed on a separate line. + For i=0 to n-1 the i-th vertex is printed on a separate line. */ void to_stream(std::ostream& s) const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 15d580891a52..62949461f2c3 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -6,7 +6,7 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Factory class, whose only purpose is to randomly generate some domains of surfaces of genus two. +Factory class, whose only purpose is to randomly generate some convex domains of surfaces of genus two. \tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 316865ca740e..92d0d8e0c1a4 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -6,7 +6,7 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a triangulation of a closed orientable hyperbolic surface, whose edges are geodesic segments. +Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. @@ -136,11 +136,21 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Writes the triangulation in a stream. + + The format of the output is the following. + Each dart of the triangulation is given an index between 0 and n-1, where n is the number of darts of the triangulation. + The first line contains the number n of darts. + For every triangle t, the indices of the three darts of t are printed on three distinct lines. + For every edge e, the indices of the two darts of e are printed on two distinct lines, followed by a third line on which the cross ratio of e is printed. + The next line contains either 'yes' or 'no' and tells whether the triangulation has an anchor. + If the triangulation has anchor A, then the two next lines print respectively the index of the dart of A, and the three complex numbers of A. */ void to_stream(std::ostream& s) const; /*! Reads the triangulation from a stream. + + The format of the input should be the same as the format of the output of the 'from_stream' method. */ void from_stream(std::istream& s); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index 3572ace8f06d..db227095dea0 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -8,7 +8,7 @@ \cgalRefines{HyperbolicDelaunayTriangulationTraits_2} The concept `HyperbolicSurfacesTraits_2` describes the set of requirements -to be fulfilled by any class instantiating the first template parameter of the main classes of the package. +to be fulfilled by any class instantiating the template parameter of the main classes of the package. Notably, it defines the field type, the complex number type, and the point type used by thoses classes. \cgalHasModelsBegin diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index b872a73ef012..a48e4cf62c6c 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -23,10 +23,10 @@ A triangulation of a surface can be generated from a convex fundamental domain o \subsection Subsection_Hyperbolic_Surface_Triangulations_Hyperbolic Hyperbolic surfaces -We assume some familiarity with basic notions from covering space theory, and 2-dimensional hyperbolic geometry. In this document, every hyperbolic surface is connected and complete. The Poincaré disk \f$ \mathbb{D} \f$ is a simply connected hyperbolic surface whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. -In particular, every point of \f$ \mathbb{D} \f$ is a complex number. This package deals with the hyperbolic surfaces \f$ S \f$ that are closed (compact, and without boundary) and orientable. -Every such surface is homemorphic to the connect sum of \f$ g \geq 2 \f$ tori, where \f$ g \f$ is unique, and is called the genus of \f$ S \f$. -The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space of \f$ S \f$, where the projection map \f$ \mathbb{D} \to S \f$ is a (local) isometry. +We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. The Poincaré disk \f$ \mathbb{D} \f$ is a simply connected hyperbolic surface whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. +In particular, every point of \f$ \mathbb{D} \f$ is a complex number. Appart from the Poincaré disk, this package is mainly concerned by the hyperbolic surfaces \f$ S \f$ that are closed (compact, and without boundary) and orientable. +Every such surface is homeomorphic to the connect sum of \f$ g \geq 2 \f$ tori, where \f$ g \f$ is unique, and is called the genus of \f$ S \f$. +The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \mathbb{D} \to S \f$ is a (local) isometry. \subsection Subsection_Hyperbolic_Surface_Triangulations_Decomposition Fundamental domains and triangulations @@ -79,6 +79,18 @@ This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$. \section Section_Hyperbolic_Surface_Triangulations_Content Content +The package contains three main classes: + +- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. + +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some convex fundamental domains of surfaces of genus two. + +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. + +The package also contains the secondary classes `CGAL::Complex_without_sqrt` and `CGAL::Hyperbolic_isometry_2` to deal with complex numbers, and with isometries in the Poincaré disk. + +The concept `HyperbolicSurfacesTraits_2` is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and describes the set of requirements to be fulfilled by any class instantiating the template parameter of most classes of the package. +This concept is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 2565b3bdb3f2..6c7218b525f6 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -35,15 +35,15 @@ \cgalCRPSection{Concepts} -- `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the first template parameter of the main classes of the package. +- `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the template parameter of most classes of the package. \cgalCRPSection{Classes} -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface, whose edges are geodesic segments. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface, the domain is convex and its edges are geodesic segments. +- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some convex domains of surfaces of genus two. - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. From 471b3bbf015fde05034440dd3940812ad6ca5fdb Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Mon, 15 Apr 2024 13:36:07 +0200 Subject: [PATCH 11/97] add non-separating --- .../Hyperbolic_surface_triangulation_2_Example/example.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp index 0f513ec3893e..34486093b37f 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -44,7 +44,7 @@ int main(){ triangulation.make_delaunay(); // Saves the triangulation: - output_file = std::ofstream ("OutputTriangulation.txt"); +std::ofstream output_file = std::ofstream ("OutputTriangulation.txt"); output_file << triangulation; output_file.close(); From 497c88ab2865cd0edf3b2ae546489ef0e4b49db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 26 Apr 2024 17:24:53 +0200 Subject: [PATCH 12/97] doc improvement --- Documentation/doc/biblio/cgal_manual.bib | 8 + .../CGAL/Complex_without_sqrt.h | 54 ++- .../CGAL/Hyperbolic_fundamental_domain_2.h | 32 +- .../Hyperbolic_fundamental_domain_factory_2.h | 6 +- .../CGAL/Hyperbolic_isometry_2.h | 36 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 64 ++-- .../Concepts/HyperbolicSurfacesTraits_2.h | 18 +- .../Doxyfile.in | 4 +- .../Hyperbolic_surface_triangulation_2.txt | 67 ++-- .../PackageDescription.txt | 6 +- .../example.cpp | 2 +- .../include/CGAL/Complex_without_sqrt.h | 48 +-- .../CGAL/Hyperbolic_fundamental_domain_2.h | 83 +++-- .../Hyperbolic_fundamental_domain_factory_2.h | 106 +++--- .../include/CGAL/Hyperbolic_isometry_2.h | 134 +++---- .../CGAL/Hyperbolic_surface_triangulation_2.h | 342 +++++++++--------- .../hs_test_complex.cpp | 16 +- 17 files changed, 547 insertions(+), 479 deletions(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 51dfb1090046..f104cfb5c40b 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -689,6 +689,14 @@ @article{cgal:dh-pifch-96 keywords = "Convex hull problem, Frame, Linear programming, Data envelopment analysis, Redundancy" } +@inproceedings{despre2020flipping, + title={Flipping geometric triangulations on hyperbolic surfaces}, + author={Despr{\'e}, Vincent and Schlenker, Jean-Marc and Teillaud, Monique}, + booktitle={SoCG 2020-36th International Symposium on Computational Geometry}, + year={2020} +} + + @article{cgal:dl-cginc-19, author = {Despr\'{e}, Vincent and Lazarus, Francis}, title = {Computing the Geometric Intersection Number of Curves}, diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h index 3b3bc49e7d22..98f26b138fa9 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h @@ -6,7 +6,9 @@ namespace CGAL { /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Templated by a field type FT, represents a complex number over FT. +Represents a complex number over a field. + +\cgalModels{CGAL::ComplexWithoutSqrt} \tparam FT is the field type and must be a model of `FieldNumberType`. */ @@ -21,38 +23,38 @@ class Complex_without_sqrt { Complex_without_sqrt(); /*! - Constructor from the real part, sets the complex number to 'real' + 0 * i. + Constructor from the real part, sets the complex number to 'real_part' + 0 * i. */ - Complex_without_sqrt(const FT& real); + Complex_without_sqrt(const FT& real_part); /*! - Constructor from the real and imaginary parts, sets the complex number to 'real' + 'imaginary' * i. + Constructor from the real and imaginary parts, sets the complex number to 'real_part' + 'imaginary_part' * i. */ - Complex_without_sqrt(const FT& real, const FT& imag); + Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); /// @} - /// \name Get and set + /// \name Access functions /// @{ /*! - Sets the real part to 'real' + Sets the real part to 'real_part' */ - void set_real(const FT& real); + void set_real_part(const FT& real_part); /*! - Sets the imaginary part to 'imag' + Sets the imaginary part to 'imaginary_part' */ - void set_imag(const FT& imag); + void set_imaginary_part(const FT& imaginary_part); /*! Returns the real part */ - FT real() const; + FT real_part() const; /*! Returns the imaginary part */ - FT imag() const; - /// @} + FT imaginary_part() const; + /// @} /// \name Operations /// @{ @@ -91,6 +93,32 @@ class Complex_without_sqrt { */ Complex_without_sqrt operator/(const Complex_without_sqrt& other) const; /// @} + + /// \name Equality test + /// @{ + /*! + Equality test operator. + */ + template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + /*! + Inequality test operator. + */ + template bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + /// @} + + /// \name Input/output + /// @{ + /*! + Outputs the complex number in a stream. + */ + templatestd::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); + + /*! + Reads the complex number from a stream. + */ + templatevoid operator>>(std::istream& s, Complex_without_sqrt& z); + /// @} }; + } //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index ba7a278d0d37..9d27c2be8cf8 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -12,11 +12,18 @@ together with a pairing of the sides of P. The n-th side of P is the side between the n-th and the (n+1)-th vertex, where indices are modulo the number of vertices of P. The sides pairing are represented by a list of integers, such that if the n-th integer of the list is m, then the n-th side is paired to the m-th side. -\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. */ -template +template class Hyperbolic_fundamental_domain_2 { public: + /// \name Types + /// @{ + /*! + Point type. + */ + typedef typename Traits::Hyperbolic_point_2 Point; + /// @} /// \name Creation /// @{ /*! @@ -27,15 +34,15 @@ class Hyperbolic_fundamental_domain_2 { /*! Constructor from the list of vertices and the sides pairing. */ - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); /// @} - /// \name Get and set + /// \name Access functions /// @{ /*! Sets the vertices and the sides pairings of the domain. */ - void set(const std::vector& vertices, const std::vector& pairings); + void set(const std::vector& vertices, const std::vector& pairings); /*! Returns the number of vertices (equivalently, the number of sides) of the domain. @@ -45,7 +52,7 @@ class Hyperbolic_fundamental_domain_2 { /*! Returns the index-th vertex */ - typename Traits_2::Hyperbolic_point_2 vertex(int index) const; + Point vertex(int index) const; /*! Returns the index of the side paired to side A, where A is the index-th side @@ -55,17 +62,17 @@ class Hyperbolic_fundamental_domain_2 { /*! Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B */ - Hyperbolic_isometry_2 side_pairing(int index) const; + Hyperbolic_isometry_2 side_pairing(int index) const; /// @} - /// \name Stream input output + /// \name Input/output /// @{ /*! Reads the domain from a stream. The format of the input should be the same as the format of the output of the 'from_stream' method. */ - void from_stream(std::istream& s); + template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); /*! Writes the domain in a stream. @@ -75,13 +82,14 @@ class Hyperbolic_fundamental_domain_2 { For i=0 to n-1 the index of the side paired to side i is printed on a separate line. For i=0 to n-1 the i-th vertex is printed on a separate line. */ - void to_stream(std::ostream& s) const; + template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /// @} /// \name Validity - /// @{ /*! - Partial validity test + Validity test. + + Checks that the number of vertices is even, that there are as many side pairings as vertices, and that the vertices all lie within the open unit disk. */ bool is_valid() const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 62949461f2c3..589456063659 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -8,9 +8,9 @@ namespace CGAL { Factory class, whose only purpose is to randomly generate some convex domains of surfaces of genus two. -\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. */ -template +template class Hyperbolic_fundamental_domain_factory_2{ public: /// \name Creation @@ -26,7 +26,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /*! Randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. */ - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_2 generate_domain_g2(); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 44444a388256..2ea13c07d59a 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -12,11 +12,22 @@ so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open un Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. */ -template +template class Hyperbolic_isometry_2{ public: + /// \name Types + /// @{ + /*! + Complex number type. + */ + typedef typename Traits::Complex ComplexNumber; + /*! + Point type. + */ + typedef typename Traits::Hyperbolic_point_2 Point; + /// @} /// \name Creation /// @{ /*! @@ -25,7 +36,7 @@ class Hyperbolic_isometry_2{ Hyperbolic_isometry_2(); /// @} - /// \name Get and set + /// \name Access functions /// @{ /*! Set the isometry to the identity. @@ -35,17 +46,17 @@ class Hyperbolic_isometry_2{ /*! Can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. */ - void set_coefficients(const Traits_2::Complex& c0, const Traits_2::Complex& c1, const Traits_2::Complex& c2, const Traits_2::Complex& c3); + void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! Can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. */ - void set_coefficient(int index, const Traits_2::Complex& coefficient); + void set_coefficient(int index, const ComplexNumber& coefficient); /*! Returns the index-th coefficient. */ - Traits_2::Complex get_coefficient(int index) const; + ComplexNumber get_coefficient(int index) const; /// @} /// \name Operations @@ -53,14 +64,23 @@ class Hyperbolic_isometry_2{ /*! Evaluates the isometry at the point. */ - Traits_2::Hyperbolic_point_2 evaluate(const Traits_2::Hyperbolic_point_2& point) const; + Point evaluate(const Point& point) const; /*! Returns the composition of itself and other. */ - Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; + Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; /// @} + /// \name Input/output + /// @{ + /*! + Writes the isometry in a stream. + */ + template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); + /// @} + + }; } //namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 92d0d8e0c1a4..88e3a46b529a 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -11,42 +11,36 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -The triangulation T is represented internally by an instance of CGAL::Combinatorial_map whose edges are attributed complex numbers. The complex number attributed to an edge e of T is the cross ratio of e in T, it can be defined as follows. Consider a lift f of e in the Poincaré disk model of the hyperbolic plane. -Orient f, and let z0 and z2 be the two complex numbers representing the first and second vertices of f. -Consider the lifted triangle of T that lies on the right of f, and let z1 be the complex number representing the third vertex of this triangle (the vertex distinct from z0 and z2). -Similarly, consider the lifted triangle of T that lies on the left of f, and let z3 be the complex number representing the third vertex of this triangle. -The cross ratio of e in T is then the complex number (z3-z1)*(z2-z0) / ((z3-z0)*(z2-z1)). This definition does not depend on the choice of the lift f, nor on the orientation of f. - -The triangulation T can optionnally contain some additional data: the anchor. -The anchor contains a lift t of a triangle of T in the hyperbolic plane: t is represented by its three vertices in the Poincaré disk model, and by a dart of the corresponding triangle in the combinatorial map of T. -While the combinatorial map and its cross ratios uniquely determine T, the anchor is used when building a portion of the lift of T in the hyperbolic plane. - - -\tparam Traits_2 is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. */ -template +template class Hyperbolic_surface_triangulation_2{ public: /// \name Types /// @{ - struct Combinatorial_map_with_cross_ratios_item{ - template - struct Dart_wrapper{ - typedef Cell_attribute> Edge_attrib; - typedef std::tuple Attributes; - }; - }; /*! Type of combinatorial map whose edges are attributed complex numbers. */ - typedef Combinatorial_map<2,Combinatorial_map_with_cross_ratios_item> Combinatorial_map_with_cross_ratios; + typedef Combinatorial_map<2,unspecified_type> Combinatorial_map_with_cross_ratios; + /*! + Combinatorial map dart handle type. + */ + typedef typename Combinatorial_map_with_cross_ratios::Dart_handle Dart_handle; + /*! + Combinatorial map dart const handle type. + */ + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle Dart_const_handle; + /*! + Point type. + */ + typedef typename Traits::Hyperbolic_point_2 Point; /*! Stores a dart d of the combinatorial map, belonging to a triangle t, and stores the three vertices of a lift of t in the hyperbolic plane. */ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; - typename Traits_2::Hyperbolic_point_2 vertices[3]; + typename Traits::Hyperbolic_point_2 vertices[3]; }; /// @} @@ -60,7 +54,7 @@ class Hyperbolic_surface_triangulation_2{ /*! Constructor from a convex fundamental domain: triangulates the polygon of the domain, and identifies the paired sides of the domain. */ - Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); /*! Constructor from a decorated combinatorial map. @@ -71,14 +65,17 @@ class Hyperbolic_surface_triangulation_2{ Constructor from a decorated combinatorial map and an anchor. */ Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + /// @} + /// \name Assignment + /// @{ /*! Copy constructor. */ Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); /// @} - /// \name Get and set + /// \name Access functions /// @{ /*! Returns the decorated combinatorial map. @@ -101,12 +98,12 @@ class Hyperbolic_surface_triangulation_2{ /*! Tells if if the edge supported by the dart is Delaunay flippable. */ - bool is_delaunay_flippable(Combinatorial_map_with_cross_ratios::Dart_handle dart) const; + bool is_delaunay_flippable(Dart_handle dart) const; /*! Flips the edge supported by the dart. */ - void flip(Combinatorial_map_with_cross_ratios::Dart_handle dart); + void flip(Dart_handle dart); /*! Applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. @@ -119,20 +116,25 @@ class Hyperbolic_surface_triangulation_2{ /*! Lifts the triangulation in the hyperbolic plane. Returns, for every triangle T of the triangulation, one of the darts of T in the combinatorial map of the triangulation, together with a triple A,B,C of points in the hyperbolic plane. The points A,B,C are the vertices of a lift of T in the hyperbolic plane. + If the center parameter is set to true, then one of the lifted triangles admits the point 0 as a vertex. + This method is to be used only if the triangulation has an anchor. */ - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; /// @} /// \name Validity /// @{ /*! - Partial validity test. + Validity test. + + Checks that the combinatorial map has no 1,2-boundary and calls the is_valid method of the combinatorial map. + If there is an anchor, then checks that the dart handle of the anchor does indeed point to a dart of the combinatorial map, and checks that the three vertices of the anchor lie within the open unit disk. */ bool is_valid() const; /// @} - /// \name Stream input output + /// \name Input/output /// @{ /*! Writes the triangulation in a stream. @@ -145,14 +147,14 @@ class Hyperbolic_surface_triangulation_2{ The next line contains either 'yes' or 'no' and tells whether the triangulation has an anchor. If the triangulation has anchor A, then the two next lines print respectively the index of the dart of A, and the three complex numbers of A. */ - void to_stream(std::ostream& s) const; + template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); /*! Reads the triangulation from a stream. The format of the input should be the same as the format of the output of the 'from_stream' method. */ - void from_stream(std::istream& s); + template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index db227095dea0..9422b18d81ae 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -5,33 +5,21 @@ \ingroup PkgHyperbolicSurfaceTriangulation2Concepts \cgalConcept -\cgalRefines{HyperbolicDelaunayTriangulationTraits_2} - The concept `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the template parameter of the main classes of the package. -Notably, it defines the field type, the complex number type, and the point type used by thoses classes. + +\cgalRefines{HyperbolicDelaunayTriangulationTraits_2} \cgalHasModelsBegin \cgalHasModels{CGAL::Hyperbolic_surfaces_traits_2} \cgalHasModelsEnd */ - class HyperbolicSurfacesTraits_2 { public: /// \name Types /// @{ /*! - Field number type. - */ - typedef unspecified_type FT; - - /*! - Represents a point in the Poincaré disk model. - */ - typedef unspecified_type Hyperbolic_point_2; - - /*! - Represents a complex number over FT. + Represents a complex number over a field: must be a model of 'CGAL::ComplexWithoutSqrt'. */ typedef unspecified_type Complex; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in index e2d86cae3c12..d14ddac30d92 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in @@ -1,5 +1,7 @@ @INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS} -PROJECT_NAME = "CGAL ${CGAL_CREATED_VERSION_NUM} - Hyperbolic Surface Triangulations" +EXTRACT_PRIVATE = NO + +PROJECT_NAME = "CGAL ${CGAL_CREATED_VERSION_NUM} - 2D Hyperbolic Surface Triangulations" IMAGE_PATH += ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index a48e4cf62c6c..240d82cfce08 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -7,7 +7,7 @@ namespace CGAL { \mainpage User Manual \anchor Chapter_Hyperbolic_Surface_Triangulations -\cgalAutoToc + \authors Vincent Despré, Loïc Dubois, and Monique Teillaud
@@ -19,16 +19,17 @@ Facilities are offered such as the Delaunay flip algorithm, and the construction A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that randomly generates such domains in genus two. -\section Section_Hyperbolic_Surface_Triangulations_Background Background +\section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic surfaces -\subsection Subsection_Hyperbolic_Surface_Triangulations_Hyperbolic Hyperbolic surfaces +\subsection Section_Hyperbolic_Surface_Triangulations_surfaces Hyperbolic surfaces -We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. The Poincaré disk \f$ \mathbb{D} \f$ is a simply connected hyperbolic surface whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. -In particular, every point of \f$ \mathbb{D} \f$ is a complex number. Appart from the Poincaré disk, this package is mainly concerned by the hyperbolic surfaces \f$ S \f$ that are closed (compact, and without boundary) and orientable. -Every such surface is homeomorphic to the connect sum of \f$ g \geq 2 \f$ tori, where \f$ g \f$ is unique, and is called the genus of \f$ S \f$. -The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \mathbb{D} \to S \f$ is a (local) isometry. +We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. +The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. +This package is concerned with the closed (compact, and without boundary) and orientable hyperbolic surfaces \f$ S \f$. +The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi : \mathbb{D} \to S \f$ is a (local) isometry. +The pre-image \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. -\subsection Subsection_Hyperbolic_Surface_Triangulations_Decomposition Fundamental domains and triangulations +\subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental domains and triangulations Let \f$ S \f$ be a closed orientable hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. A graph \f$ G \f$ embedded in \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) has genus zero; It is in that sense that the faces of \f$ G \f$ are "manageable". @@ -49,9 +50,17 @@ Observe that this definition allows for triangulations with only one vertex. A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$. The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of arbitrary arcs of \f$ P \f$. -\subsection Subsection_Hyperbolic_Surface_Triangulations_Cratios_Delaunay Cross ratios and the Delaunay flip algorithm +\subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of convex fundamental domains + +\section Subsection_Hyperbolic_Surface_Triangulations_Representation Representation + +\subsection Subsection_Hyperbolic_Surface_Triangulations_Data_Structure Data structure -Let \f$ S \f$ be a closed orientable hyperbolic surface, and let \f$ T \f$ be a triangulation of \f$ S \f$. The geometry of \f$ T \f$ is unambiguously determined by the cross ratios of the edges of \f$ T \f$. The cross ratio of an edge \f$ e \f$ of \f$ T \f$ is a complex number \f$ R_T(e) \in \mathbb{C} \f$ defined as follows. +We represent convex fundamental domains by the list of their vertices in the Poincaré disk, and by the list of their sides pairings. + +Let \f$ T \f$ be a triangulation of a closed orientable hyperbolic surface. +We represent \f$ T \f$ by an instance of CGAL::Combinatorial_map whose edges are attributed complex numbers. +The complex number \f$ R_T(e) \in \mathbb{C} \f$ attributed to an edge \f$ e \f$ of \f$ T \f$ is the cross ratio of \f$ e \f$ in \f$ T \f$, defined as follows. Consider the lift \f$ \widetilde T \f$ of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. In \f$ \widetilde T \f$, let \f$ \widetilde e \f$ be a lift of \f$ e \f$. Orient \f$ \widetilde e \f$ arbitrarily, and let \f$ z_0 \in \mathbb{D} \f$ and \f$ z_2 \in \mathbb{D} \f$ be respectively the first and second vertices of \f$ \widetilde e \f$. @@ -60,37 +69,40 @@ Similarly, consider the triangle on the left of \f$ \widetilde e \f$, and let \f Then \f$ R_T(e) = (z_3-z_1)*(z_2-z_0) / ((z_3-z_0)*(z_2-z_1)) \f$. This definition does not depend on the choice of the lift \f$ \widetilde e \f$, nor on the orientation of \f$ \widetilde e \f$. -An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is negative or null. -This definition has an equivalent "empty disk" formulation, see . +While the triangulation \f$ T \f$ is unambiguously determined by the combinatorial map and its cross ratios, the internal representation of \f$ T \f$ can contain some additional data: the anchor. +The anchor is used when building a portion of the lift of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. +It contains a lift \f$ t \f$ of a triangle of \f$ T \f$ in \f$ \mathbb{D} \f$: \f$ t \f$ is represented by its three vertices in \f$ \mathbb{D} \f$, and by a dart of the corresponding triangle in the combinatorial map of \f$ T \f$. + + +\subsection Subsection_Hyperbolic_Surface_Triangulations_Delaunay Delaunay flip algorithm + +Let \f$ T \f$ be a triangulation of a closed orientable hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. +(This definition has an equivalent "empty disk" formulation in the package \ref PkgHyperbolicTriangulation2). Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. This operation is called a flip. When a flip occurs, the cross ratios of the edges involved are modified via simple formulas. The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. -This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$. - - +This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cgalCite{despre2020flipping}. - - - - - -\section Section_Hyperbolic_Surface_Triangulations_Content Content +\section Section_Hyperbolic_Surface_Triangulations_Software_Design Software design The package contains three main classes: +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. -- `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. +- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a closed orientable hyperbolic surface. - `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some convex fundamental domains of surfaces of genus two. -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. -The package also contains the secondary classes `CGAL::Complex_without_sqrt` and `CGAL::Hyperbolic_isometry_2` to deal with complex numbers, and with isometries in the Poincaré disk. +The package also contains the secondary class `CGAL::Hyperbolic_isometry_2` to deal with isometries in the Poincaré disk. + +The concept `HyperbolicSurfacesTraits_2` is a refinement of `HyperbolicDelaunayTriangulationTraits_2`. +This concept describes the requirements for the template parameter of the classes of the package. +It is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. -The concept `HyperbolicSurfacesTraits_2` is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and describes the set of requirements to be fulfilled by any class instantiating the template parameter of most classes of the package. -This concept is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. +The concept `ComplexWithoutSqrt` describes a complex number type that does not use square root. It is modeled by the class `CGAL::Complex_without_sqrt`. @@ -98,10 +110,11 @@ This concept is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. \section Section_Hyperbolic_Surface_Triangulations_Example Example -The example below randomly generates a convex fundamental domain of a surface, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. +The example below randomly generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. \cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} +\section Section_Hyperbolic_Surface_Implementation_History Design and implementation history */ } /* namespace CGAL */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 6c7218b525f6..7baaea478873 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -16,18 +16,21 @@ \cgalPkgDescriptionBegin{Hyperbolic Surface Triangulations,PkgHyperbolicSurfaceTriangulation2} \cgalPkgPicture{cover.svg} + \cgalPkgSummaryBegin \cgalPkgAuthors{Vincent Despré, Loïc Dubois, and Monique Teillaud} \cgalPkgDesc{This package enables handling and building triangulations of closed orientable hyperbolic surfaces. Facilities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} \cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} \cgalPkgSummaryEnd + \cgalPkgShortInfoBegin \cgalPkgSince{6} \cgalPkgDependsOn{\ref PkgCombinatorialMaps} -\cgalPkgBib{cgal:nobibfornow} +\cgalPkgBib{cgal:y-t2} \cgalPkgLicense{\ref licensesGPL "GPL"} \cgalPkgDemo{Hyperbolic Surface Triangulations,nofilefornow.zip} \cgalPkgShortInfoEnd + \cgalPkgDescriptionEnd @@ -52,5 +55,4 @@ A model for the concept `HyperbolicSurfacesTraits_2` is provided: - `CGAL::Hyperbolic_surfaces_traits_2` inherits from its template parameter HyperbolicTraitsClass. HyperbolicTraitsClass must be a model of `CGAL::HyperbolicDelaunayTriangulationTraits_2`. - */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp index 0f513ec3893e..097a0a851aed 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -44,7 +44,7 @@ int main(){ triangulation.make_delaunay(); // Saves the triangulation: - output_file = std::ofstream ("OutputTriangulation.txt"); + std::ofstream output_file ("OutputTriangulation.txt"); output_file << triangulation; output_file.close(); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 9d81b5887151..808561131d47 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -31,14 +31,14 @@ class Complex_without_sqrt { public: Complex_without_sqrt(); - Complex_without_sqrt(const FT& real); - Complex_without_sqrt(const FT& real, const FT& imag); + Complex_without_sqrt(const FT& real_part); + Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); - void set_real(const FT& real); - void set_imag(const FT& imag); + void set_real_part(const FT& real_part); + void set_imaginary_part(const FT& imaginary_part); - FT real() const; - FT imag() const; + FT real_part() const; + FT imaginary_part() const; FT squared_modulus() const; _Self conjugate() const; @@ -66,38 +66,38 @@ Complex_without_sqrt::Complex_without_sqrt(){ } template -Complex_without_sqrt::Complex_without_sqrt(const FT& real){ - _real = real; +Complex_without_sqrt::Complex_without_sqrt(const FT& real_part){ + _real = real_part; _imag = FT(0); } template -Complex_without_sqrt::Complex_without_sqrt(const FT& real, const FT& imag){ - _real = real; - _imag = imag; +Complex_without_sqrt::Complex_without_sqrt(const FT& real_part, const FT& imaginary_part){ + _real = real_part; + _imag = imaginary_part; } //////////////////////////////////////////////////////////////////////////////// template -void Complex_without_sqrt::set_real(const FT& real){ - _real = real; +void Complex_without_sqrt::set_real_part(const FT& real_part){ + _real = real_part; } template -void Complex_without_sqrt::set_imag(const FT& imag){ - _imag = imag; +void Complex_without_sqrt::set_imaginary_part(const FT& imaginary_part){ + _imag = imaginary_part; } //////////////////////////////////////////////////////////////////////////////// template -FT Complex_without_sqrt::real() const{ +FT Complex_without_sqrt::real_part() const{ return _real; } template -FT Complex_without_sqrt::imag() const{ +FT Complex_without_sqrt::imaginary_part() const{ return _imag; } @@ -115,12 +115,12 @@ Complex_without_sqrt Complex_without_sqrt::conjugate() const{ template Complex_without_sqrt Complex_without_sqrt::operator+(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real+other.real(), _imag+other.imag()); + return Complex_without_sqrt(_real+other.real_part(), _imag+other.imaginary_part()); } template Complex_without_sqrt Complex_without_sqrt::operator-(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real-other.real(), _imag-other.imag()); + return Complex_without_sqrt(_real-other.real_part(), _imag-other.imaginary_part()); } template @@ -130,7 +130,7 @@ Complex_without_sqrt Complex_without_sqrt::operator-() const{ template Complex_without_sqrt Complex_without_sqrt::operator*(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real*other.real()-_imag*other.imag(), _real*other.imag()+_imag*other.real()); + return Complex_without_sqrt(_real*other.real_part()-_imag*other.imaginary_part(), _real*other.imaginary_part()+_imag*other.real_part()); } template @@ -143,7 +143,7 @@ Complex_without_sqrt Complex_without_sqrt::operator/(const Complex_witho template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ - return (z1.real()==z2.real() && z1.imag()==z2.imag()); + return (z1.real_part()==z2.real_part() && z1.imaginary_part()==z2.imaginary_part()); } template @@ -155,7 +155,7 @@ bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z){ - s << z.real() << std::endl << z.imag() << std::endl; + s << z.real_part() << std::endl << z.imaginary_part() << std::endl; return s; } @@ -163,9 +163,9 @@ template void operator>>(std::istream& s, Complex_without_sqrt& z){ std::string line; std::getline(s, line); - z.set_real(FT(line)); + z.set_real_part(FT(line)); std::getline(s, line); - z.set_imag(FT(line)); + z.set_imaginary_part(FT(line)); } } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 08ed7d5b9bf0..58610b7ad49e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -30,93 +30,92 @@ together with a pairing of the sides of P, such that every two paired sides have identifying every two paired sides in a way that respects the orientation of P would result in a closed orientable hyperbolic surface. */ -template +template class Hyperbolic_fundamental_domain_2 { -private: - typedef typename Traits_2::Hyperbolic_point_2 _Point; - typedef typename Traits_2::Complex _Cmplx; - typedef Hyperbolic_isometry_2 _Isometry; - - std::vector<_Point> _vertices; - std::vector _pairings; public: + typedef typename Traits::Hyperbolic_point_2 Point; + Hyperbolic_fundamental_domain_2(); - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); - void set(const std::vector& vertices, const std::vector& pairings); + void set(const std::vector& vertices, const std::vector& pairings); int size() const; // Returns the number of vertices (equivalently, the number of sides) - typename Traits_2::Hyperbolic_point_2 vertex(int index) const; // Returns the index-th vertex + Point vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side - Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B void from_stream(std::istream& s); void to_stream(std::ostream& s) const; bool is_valid() const; + +private: + std::vector _vertices; + std::vector _pairings; }; -template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); -template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); +template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector<_Point>& vertices, const std::vector& pairings){ +template +Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings){ set(vertices, pairings); } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_fundamental_domain_2::set(const std::vector<_Point>& vertices, const std::vector& pairings){ +template +void Hyperbolic_fundamental_domain_2::set(const std::vector& vertices, const std::vector& pairings){ _vertices = vertices; _pairings = pairings; } //////////////////////////////////////////////////////////////////////////////// -template -int Hyperbolic_fundamental_domain_2::size() const{ +template +int Hyperbolic_fundamental_domain_2::size() const{ return _vertices.size(); } -template -typename Traits_2::Hyperbolic_point_2 Hyperbolic_fundamental_domain_2::vertex(int index) const{ +template +typename Hyperbolic_fundamental_domain_2::Point Hyperbolic_fundamental_domain_2::vertex(int index) const{ return _vertices[index]; } -template -int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ +template +int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ return _pairings[index]; } -template -Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ +template +Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ int n = size(); int paired_index = paired_side(index); - _Point p1,p2,q1,q2; + Point p1,p2,q1,q2; q1 = vertex(index); q2 = vertex((index+1)%n); p2 = vertex(paired_index); p1 = vertex((paired_index+1)%n); - _Isometry isom = isometry_pairing_the_sides(p1,p2,q1,q2); + Hyperbolic_isometry_2 isom = isometry_pairing_the_sides(p1,p2,q1,q2); return isom; } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ +template +void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ int n = size(); s << std::to_string(n) << std::endl; @@ -130,8 +129,8 @@ void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const } } -template -void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ +template +void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ _vertices.clear(); _pairings.clear(); @@ -144,7 +143,7 @@ void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ } for (int k=0; k> p; _vertices.push_back(p); } @@ -152,21 +151,21 @@ void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ domain.to_stream(s); return s; } -template -void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ +template +void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ domain.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_2::is_valid()const{ +template +bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Get the number of vertices int n = _vertices.size(); @@ -198,7 +197,7 @@ bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Check that the vertices all lie within the open unit disk for (int k=0; k= typename Traits_2::FT(1)){ + if (_vertices[k].get_z().squared_modulus() >= typename Traits::FT(1)){ return false; } } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 3693946ffb81..2689f0684950 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -28,23 +28,23 @@ namespace CGAL { /* Factory class, whose only purpose is to construct random domains of genus 2 closed orientable hyperbolic surfaces, via its method generate_domain_g2. */ -template +template class Hyperbolic_fundamental_domain_factory_2{ private: - typedef typename Traits_2::FT _FT; - typedef typename Traits_2::Complex _Cmplx; - typedef typename Traits_2::Hyperbolic_point_2 _Point; + typedef typename Traits::FT _FT; + typedef typename Traits::Complex _Cmplx; + typedef typename Traits::Hyperbolic_point_2 _Point; Random _random; public: Hyperbolic_fundamental_domain_factory_2(unsigned int seed); - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_2 generate_domain_g2(); private: float random_positive_float(); // returns number in [0,1] float random_float(); // returns number in [-1,1] - Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0 + Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imaginary_part(z) > 0 _FT exact_number_from_float(float x); _Cmplx exact_complex_from_float_complex(const Complex_without_sqrt& z); @@ -61,16 +61,16 @@ class Hyperbolic_fundamental_domain_factory_2{ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ +template +Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ _random = Random(seed); } //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ - Hyperbolic_fundamental_domain_2 domain; +template +Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ + Hyperbolic_fundamental_domain_2 domain; bool is_domain_generated = false; _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; @@ -103,14 +103,14 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_ _Cmplx exact_zero(_FT(0), _FT(0)); std::vector<_Point> vertices; - vertices.push_back(_Point(exact_z0.real(), exact_z0.imag())); - vertices.push_back(_Point(exact_z1.real(), exact_z1.imag())); - vertices.push_back(_Point(exact_z2.real(), exact_z2.imag())); - vertices.push_back(_Point(exact_z3.real(), exact_z3.imag())); - vertices.push_back(_Point(-exact_z0.real(), -exact_z0.imag())); - vertices.push_back(_Point(-exact_z1.real(), -exact_z1.imag())); - vertices.push_back(_Point(-exact_z2.real(), -exact_z2.imag())); - vertices.push_back(_Point(-exact_z3.real(), -exact_z3.imag())); + vertices.push_back(_Point(exact_z0.real_part(), exact_z0.imaginary_part())); + vertices.push_back(_Point(exact_z1.real_part(), exact_z1.imaginary_part())); + vertices.push_back(_Point(exact_z2.real_part(), exact_z2.imaginary_part())); + vertices.push_back(_Point(exact_z3.real_part(), exact_z3.imaginary_part())); + vertices.push_back(_Point(-exact_z0.real_part(), -exact_z0.imaginary_part())); + vertices.push_back(_Point(-exact_z1.real_part(), -exact_z1.imaginary_part())); + vertices.push_back(_Point(-exact_z2.real_part(), -exact_z2.imaginary_part())); + vertices.push_back(_Point(-exact_z3.real_part(), -exact_z3.imaginary_part())); std::vector pairings; for (int k=0; k<8; k++){ @@ -123,22 +123,22 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_ //////////////////////////////////////////////////////////////////////////////// -template -float Hyperbolic_fundamental_domain_factory_2::random_positive_float(){ +template +float Hyperbolic_fundamental_domain_factory_2::random_positive_float(){ return _random.uniform_01(); } -template -float Hyperbolic_fundamental_domain_factory_2::random_float(){ +template +float Hyperbolic_fundamental_domain_factory_2::random_float(){ return _random.uniform_01() * 2 - 1; } -template -Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ +template +Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ Complex_without_sqrt result (random_float(), random_positive_float()); while (result.squared_modulus() >= 1){ - result.set_real(random_float()); - result.set_imag(random_positive_float()); + result.set_real_part(random_float()); + result.set_imaginary_part(random_positive_float()); } return result; @@ -146,48 +146,48 @@ Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::r //////////////////////////////////////////////////////////////////////////////// -template -typename Traits_2::FT Hyperbolic_fundamental_domain_factory_2::exact_number_from_float(float x){ +template +typename Traits::FT Hyperbolic_fundamental_domain_factory_2::exact_number_from_float(float x){ if (x< 0){ return _FT(0)-exact_number_from_float(-x); } return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION, _DENOMINATOR_FOR_GENERATION); } -template -typename Traits_2::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ - return _Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag())); +template +typename Traits::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ + return _Cmplx(exact_number_from_float(z.real_part()), exact_number_from_float(z.imaginary_part())); } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ - if ( ((z2/z1).imag()<=0) || ((z3/z2).imag()<=0) ){ +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ + if ( ((z2/z1).imaginary_part()<=0) || ((z3/z2).imaginary_part()<=0) ){ return false; } Complex_without_sqrt one (1,0); Complex_without_sqrt u = (one - z1*z2.conjugate()) * (one - z2*z3.conjugate()); - float a = -(u*z1.conjugate()*z3).imag(); - float b = (u*(z3-z1.conjugate())).imag(); - float c = u.imag(); + float a = -(u*z1.conjugate()*z3).imaginary_part(); + float b = (u*(z3-z1.conjugate())).imaginary_part(); + float c = u.imaginary_part(); const float COMPUTATION_TRESHOLD = 0.00001; if (a+b+c> 0 - COMPUTATION_TRESHOLD){ return false; } - z0.set_real( 2*c/(std::sqrt(b*b-4*a*c)-b) ); - z0.set_imag(0); + z0.set_real_part( 2*c/(std::sqrt(b*b-4*a*c)-b) ); + z0.set_imaginary_part(0); return true; } -template -bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ +template +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ _FT zero_number (0); _FT one_number (1); - if ( (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ + if ( (z0.real_part()<=zero_number) || (z1.imaginary_part()<=zero_number) || (z2.imaginary_part()<=zero_number) || (z3.imaginary_part()<=zero_number) ){ return false; } @@ -195,7 +195,7 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_ return false; } - if ( ((z1/z0).imag()<=zero_number) || ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ + if ( ((z1/z0).imaginary_part()<=zero_number) || ((z2/z1).imaginary_part()<=zero_number) || ((z3/z2).imaginary_part()<=zero_number) ){ return false; } @@ -208,17 +208,17 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_ _Cmplx f_of_z3 = (z0 + z3) / (z0*z3 + one_cmplx); _Cmplx intermediate = (one_cmplx - f_of_z0*f_of_z1.conjugate()) * (one_cmplx - f_of_z1*f_of_z2.conjugate()); - _FT P_of_zero = intermediate.imag(); - _FT P_of_one = (intermediate * (one_cmplx-f_of_z2*f_of_z3.conjugate())).imag(); + _FT P_of_zero = intermediate.imaginary_part(); + _FT P_of_one = (intermediate * (one_cmplx-f_of_z2*f_of_z3.conjugate())).imaginary_part(); if (P_of_one == P_of_zero){ return false; } _FT lbda = P_of_zero / (P_of_zero - P_of_one); - _Cmplx V (lbda*(f_of_z3.real()), lbda*(f_of_z3.imag())); + _Cmplx V (lbda*(f_of_z3.real_part()), lbda*(f_of_z3.imaginary_part())); - if ( (V.imag()<=zero_number) || (V.squared_modulus()>=one_number) || ((V/f_of_z2).imag()<=zero_number) ){ + if ( (V.imaginary_part()<=zero_number) || (V.squared_modulus()>=one_number) || ((V/f_of_z2).imaginary_part()<=zero_number) ){ return false; } @@ -229,13 +229,13 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_ //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ +template +bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ _FT zero_number(0); _FT one_number(1); // 1. Check the positions - if ( (z0.imag()!=zero_number) || (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ + if ( (z0.imaginary_part()!=zero_number) || (z0.real_part()<=zero_number) || (z1.imaginary_part()<=zero_number) || (z2.imaginary_part()<=zero_number) || (z3.imaginary_part()<=zero_number) ){ return false; } @@ -243,14 +243,14 @@ bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, return false; } - if ( ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ + if ( ((z2/z1).imaginary_part()<=zero_number) || ((z3/z2).imaginary_part()<=zero_number) ){ return false; } // 2. Check the area _Cmplx one_cmplx (one_number, zero_number); _Cmplx Z = (one_cmplx-z0*z1.conjugate()) * (one_cmplx-z1*z2.conjugate()) *(one_cmplx-z2*z3.conjugate()) *(one_cmplx+z3*z0.conjugate()); - if (Z.imag()!=zero_number){ + if (Z.imaginary_part()!=zero_number){ return false; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 0b24e2507d75..326c4af7c9d3 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -23,104 +23,104 @@ namespace CGAL { Represents a hyperbolic isometry in the Poincare disk model the hyperbolic plane. The isometry f is stored as list (c0, c1, c2, c3) of 4 complex numbers, so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. */ -template +template class Hyperbolic_isometry_2{ -private: - typedef Hyperbolic_isometry_2 _Self; - typedef typename Traits_2::FT _FT; - typedef typename Traits_2::Complex _Cmplx; - typedef typename Traits_2::Hyperbolic_point_2 _Point; - - _Cmplx _coefficients[4]; - public: + typedef Hyperbolic_isometry_2 Self; + typedef typename Traits::FT FT; + typedef typename Traits::Complex ComplexNumber; + typedef typename Traits::Hyperbolic_point_2 Point; + Hyperbolic_isometry_2(); void set_to_identity(); // Can be used to set the coefficients manually. Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. - void set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3); - void set_coefficient(int index, const _Cmplx& coefficient); + void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); + void set_coefficient(int index, const ComplexNumber& coefficient); // Returns the index-th coefficient - _Cmplx get_coefficient(int index) const; + ComplexNumber get_coefficient(int index) const; // Evaluates the isometry at point - _Point evaluate(const _Point& point) const; + Point evaluate(const Point& point) const; // Returns the composition of self and other - _Self compose(const _Self& other) const; + Self compose(const Self& other) const; + +private: + ComplexNumber _coefficients[4]; }; -template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); +template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); // When inverse=false, returns the hyperbolic translation that maps -p to zero, and zero to p. Otherwise, returns the hyperbolic translation that maps p to zero, and zero to -p. -template -Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits_2::Hyperbolic_point_2& p, bool inverse=false); +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits::Hyperbolic_point_2& p, bool inverse=false); // When inverse=false, returns the hyperbolic rotation around zero that maps p to q. Otherwise, returns the hyperbolic rotation around zero that maps q to p. -template -Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits_2::Hyperbolic_point_2& p, const typename Traits_2::Hyperbolic_point_2& q, bool inverse=false); +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits::Hyperbolic_point_2& p, const typename Traits::Hyperbolic_point_2& q, bool inverse=false); // Returns the hyperbolic isometry that maps p1 to q1 and p2 to q2 -template -Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits_2::Hyperbolic_point_2& p1, const typename Traits_2::Hyperbolic_point_2& p2, const typename Traits_2::Hyperbolic_point_2& q1, const typename Traits_2::Hyperbolic_point_2& q2); +template +Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits::Hyperbolic_point_2& p1, const typename Traits::Hyperbolic_point_2& p2, const typename Traits::Hyperbolic_point_2& q1, const typename Traits::Hyperbolic_point_2& q2); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ +template +Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ set_to_identity(); } //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_isometry_2::set_to_identity(){ - set_coefficients(_Cmplx(_FT(1)), - _Cmplx(_FT(0)), - _Cmplx(_FT(0)), - _Cmplx(_FT(1))); +template +void Hyperbolic_isometry_2::set_to_identity(){ + set_coefficients(ComplexNumber(FT(1)), + ComplexNumber(FT(0)), + ComplexNumber(FT(0)), + ComplexNumber(FT(1))); } -template -void Hyperbolic_isometry_2::set_coefficients(const _Cmplx& c0, const _Cmplx& c1, const _Cmplx& c2, const _Cmplx& c3){ +template +void Hyperbolic_isometry_2::set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3){ set_coefficient(0, c0); set_coefficient(1, c1); set_coefficient(2, c2); set_coefficient(3, c3); } -template -void Hyperbolic_isometry_2::set_coefficient(int index, const _Cmplx& coefficient){ +template +void Hyperbolic_isometry_2::set_coefficient(int index, const ComplexNumber& coefficient){ _coefficients[index] = coefficient; } //////////////////////////////////////////////////////////////////////////////// -template -typename Traits_2::Complex Hyperbolic_isometry_2::get_coefficient(int index) const{ +template +typename Traits::Complex Hyperbolic_isometry_2::get_coefficient(int index) const{ return _coefficients[index]; } //////////////////////////////////////////////////////////////////////////////// -template -typename Traits_2::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(const _Point& point) const{ - _Cmplx z (point.x(), point.y()); - _Cmplx numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; - _Cmplx denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; - _Cmplx result = numerator_of_the_result / denominator_of_the_result; - return _Point(result.real(), result.imag()); +template +typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(const Point& point) const{ + ComplexNumber z (point.x(), point.y()); + ComplexNumber numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; + ComplexNumber denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; + ComplexNumber result = numerator_of_the_result / denominator_of_the_result; + return Point(result.real_part(), result.imaginary_part()); } //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ - _Self result; +template +Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ + Self result; for (int i=0; i<2; i++){ for (int j=0; j<2; j++){ result.set_coefficient(2*i+j, @@ -132,8 +132,8 @@ Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const H //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry){ +template +std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry){ for (int k=0; k<4; k++){ s << isometry.get_coefficient(k); } @@ -142,39 +142,39 @@ std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits_2::Hyperbolic_point_2& p, bool inverse){ - typename Traits_2::Complex one (typename Traits_2::FT(1)); - typename Traits_2::Complex z; +template +Hyperbolic_isometry_2 hyperbolic_translation(const typename Traits::Hyperbolic_point_2& p, bool inverse){ + typename Traits::Complex one (typename Traits::FT(1)); + typename Traits::Complex z; if (inverse){ - z = typename Traits_2::Complex(p.x(), p.y()); + z = typename Traits::Complex(p.x(), p.y()); } else { - z = - typename Traits_2::Complex(p.x(), p.y()); + z = - typename Traits::Complex(p.x(), p.y()); } - Hyperbolic_isometry_2 result; + Hyperbolic_isometry_2 result; result.set_coefficients(one, z, z.conjugate(), one); return result; } -template -Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits_2::Hyperbolic_point_2& p, const typename Traits_2::Hyperbolic_point_2& q, bool inverse){ - typename Traits_2::Complex zero (typename Traits_2::FT(0)); - Hyperbolic_isometry_2 result; +template +Hyperbolic_isometry_2 hyperbolic_rotation(const typename Traits::Hyperbolic_point_2& p, const typename Traits::Hyperbolic_point_2& q, bool inverse){ + typename Traits::Complex zero (typename Traits::FT(0)); + Hyperbolic_isometry_2 result; if (inverse){ - result.set_coefficients(typename Traits_2::Complex(p.x(), p.y()), zero, zero, typename Traits_2::Complex(q.x(), q.y())); + result.set_coefficients(typename Traits::Complex(p.x(), p.y()), zero, zero, typename Traits::Complex(q.x(), q.y())); } else { - result.set_coefficients(typename Traits_2::Complex(q.x(), q.y()), zero, zero, typename Traits_2::Complex(p.x(), p.y())); + result.set_coefficients(typename Traits::Complex(q.x(), q.y()), zero, zero, typename Traits::Complex(p.x(), p.y())); } return result; } -template -Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits_2::Hyperbolic_point_2& p1, const typename Traits_2::Hyperbolic_point_2& p2, const typename Traits_2::Hyperbolic_point_2& q1, const typename Traits_2::Hyperbolic_point_2& q2){ - Hyperbolic_isometry_2 A,B,Binv,C; - A = hyperbolic_translation(p1); - B = hyperbolic_translation(q1); - Binv = hyperbolic_translation(q1,true); - C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); +template +Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits::Hyperbolic_point_2& p1, const typename Traits::Hyperbolic_point_2& p2, const typename Traits::Hyperbolic_point_2& q1, const typename Traits::Hyperbolic_point_2& q2){ + Hyperbolic_isometry_2 A,B,Binv,C; + A = hyperbolic_translation(p1); + B = hyperbolic_translation(q1); + Binv = hyperbolic_translation(q1,true); + C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); return (Binv.compose(C)).compose(A); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index c2e7c1984d95..d73c4f48f9ad 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -35,13 +35,13 @@ It is also possible to specify an anchor for the triangulation. An anchor consis 2) three points A,B,C in the hyperbolic plane. The points A,B,C are the three vertices in counter-clockwise order of a triangle. This triangle is a lift of T, and A is a lift of V. */ -template +template class Hyperbolic_surface_triangulation_2{ public: struct Combinatorial_map_with_cross_ratios_item{ template struct Dart_wrapper{ - typedef Cell_attribute> Edge_attrib; + typedef Cell_attribute> Edge_attrib; typedef std::tuple Attributes; }; }; @@ -49,34 +49,28 @@ class Hyperbolic_surface_triangulation_2{ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; - typename Traits_2::Hyperbolic_point_2 vertices[3]; + typename Traits::Hyperbolic_point_2 vertices[3]; }; -private: - typedef typename Combinatorial_map_with_cross_ratios::Dart_handle _Dart_handle; - typedef typename Combinatorial_map_with_cross_ratios::Dart_range _Dart_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> _Vertex_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> _Edge_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> _Face_range; - - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle _Dart_const_handle; - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range _Dart_const_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> _Edge_const_range; - typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> _Face_const_range; - - typedef typename Traits_2::FT _Number; - typedef typename Traits_2::Complex _Complex_number; - typedef typename Traits_2::Hyperbolic_point_2 _Point; - typedef Hyperbolic_isometry_2 _Isometry; - typedef Hyperbolic_fundamental_domain_2 _Domain; + typedef typename Combinatorial_map_with_cross_ratios::Dart_handle Dart_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_range Dart_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range; - Combinatorial_map_with_cross_ratios _combinatorial_map; - bool _has_anchor = false; - Anchor _anchor; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle Dart_const_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range Dart_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range; + + typedef typename Traits::FT Number; + typedef typename Traits::Complex ComplexNumber; + typedef typename Traits::Hyperbolic_point_2 Point; + typedef Hyperbolic_isometry_2 Isometry; + typedef Hyperbolic_fundamental_domain_2 Domain; -public: Hyperbolic_surface_triangulation_2() {}; - Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); + Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); @@ -90,58 +84,62 @@ class Hyperbolic_surface_triangulation_2{ void to_stream(std::ostream& s) const; void from_stream(std::istream& s); - bool is_delaunay_flippable(_Dart_handle dart) const; - void flip(_Dart_handle dart); + bool is_delaunay_flippable(Dart_handle dart) const; + void flip(Dart_handle dart); // Flips Delaunay flippable edges as long as possible int make_delaunay(); // Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. This method is to be used only if the triangulation has an anchor. - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; bool is_valid() const; private: - _Dart_handle ccw(_Dart_handle dart); - _Dart_handle cw(_Dart_handle dart); - _Dart_handle opposite(_Dart_handle dart); - _Dart_const_handle const_ccw(_Dart_const_handle dart) const; - _Dart_const_handle const_cw(_Dart_const_handle dart) const; - _Dart_const_handle const_opposite(_Dart_const_handle dart) const; + Combinatorial_map_with_cross_ratios _combinatorial_map; + bool _has_anchor = false; + Anchor _anchor; + + Dart_handle ccw(Dart_handle dart); + Dart_handle cw(Dart_handle dart); + Dart_handle opposite(Dart_handle dart); + Dart_const_handle const_ccw(Dart_const_handle dart) const; + Dart_const_handle const_cw(Dart_const_handle dart) const; + Dart_const_handle const_opposite(Dart_const_handle dart) const; - _Complex_number get_cross_ratio(_Dart_const_handle dart) const; + ComplexNumber get_cross_ratio(Dart_const_handle dart) const; - _Dart_handle pick_edge_to_flip(); + Dart_handle pick_edge_to_flip(); void copy_from(const Combinatorial_map_with_cross_ratios& cmap); void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); // Returns the cross ratio of the points a,b,c,d - _Complex_number cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Point& d) const; + ComplexNumber cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; // Returns the point d such that the cross ratio of a,b,c,d is cratio - _Point fourth_point_from_cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Complex_number& cratio) const; + Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const; }; -template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); -template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); +template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); +template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const _Domain& domain){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Domain& domain){ // (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices) _combinatorial_map.clear(); int size = domain.size(); // Make the triangles - _Dart_handle dart_of_triangle[size-2]; + Dart_handle dart_of_triangle[size-2]; for (int k=0; k::Hyperbolic_surface_triangulation_2 _has_anchor = true; } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ copy_from(cmap); } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ copy_from(cmap, anchor); } //////////////////////////////////////////////////////////////////////////////// -template -//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ -Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ +template +//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ +Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ copy_from(other.get_combinatorial_map_ref(), other.get_anchor_ref()); } @@ -227,73 +225,73 @@ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2 //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ return _combinatorial_map; } -template -bool Hyperbolic_surface_triangulation_2::has_anchor() const { +template +bool Hyperbolic_surface_triangulation_2::has_anchor() const { return _has_anchor; } -template -typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ return _anchor; } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(_Dart_handle dart) const{ - return ( get_cross_ratio(dart).imag()>_Number(0) ); +template +bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_handle dart) const{ + return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); } -template -void Hyperbolic_surface_triangulation_2::flip(_Dart_handle dart){ +template +void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ // First gather all the information needed - _Dart_handle a = opposite(dart); // Get a fresh handle - _Dart_handle b = ccw(a); - _Dart_handle c = cw(a); + Dart_handle a = opposite(dart); // Get a fresh handle + Dart_handle b = ccw(a); + Dart_handle c = cw(a); - _Dart_handle d = opposite(a); - _Dart_handle e = ccw(d); - _Dart_handle f = cw(d); + Dart_handle d = opposite(a); + Dart_handle e = ccw(d); + Dart_handle f = cw(d); - _Complex_number cross_ratio_AB = get_cross_ratio(e); - _Complex_number cross_ratio_BC = get_cross_ratio(f); - _Complex_number cross_ratio_CD = get_cross_ratio(b); - _Complex_number cross_ratio_DA = get_cross_ratio(c); - _Complex_number cross_ratio_AC = get_cross_ratio(a); + ComplexNumber cross_ratio_AB = get_cross_ratio(e); + ComplexNumber cross_ratio_BC = get_cross_ratio(f); + ComplexNumber cross_ratio_CD = get_cross_ratio(b); + ComplexNumber cross_ratio_DA = get_cross_ratio(c); + ComplexNumber cross_ratio_AC = get_cross_ratio(a); // Modify the anchor if (_anchor.dart == a){ _anchor.dart = e; - _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); + _anchor.vertices[1] = Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); } else if (_anchor.dart == b){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); + _anchor.vertices[2] = Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); } else if (_anchor.dart == c){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); + _anchor.vertices[2] = Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); } else if (_anchor.dart == d){ _anchor.dart = b; - _anchor.vertices[1] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); + _anchor.vertices[1] = Point(fourth_point_from_cross_ratio(_anchor.vertices[1], _anchor.vertices[2], _anchor.vertices[0], cross_ratio_AC)); } else if (_anchor.dart == e){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); + _anchor.vertices[2] = Point(fourth_point_from_cross_ratio(_anchor.vertices[0], _anchor.vertices[1], _anchor.vertices[2], cross_ratio_AC)); } else if (_anchor.dart == f){ - _anchor.vertices[2] = _Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); + _anchor.vertices[2] = Point(fourth_point_from_cross_ratio(_anchor.vertices[2], _anchor.vertices[0], _anchor.vertices[1], cross_ratio_AC)); } // Compute the new cross ratios - _Complex_number one (_Number(1), _Number(0)); - _Complex_number cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one) ; - _Complex_number cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC) ; - _Complex_number cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD) ; - _Complex_number cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC) ; - _Complex_number cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD) ; + ComplexNumber one (Number(1), Number(0)); + ComplexNumber cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one) ; + ComplexNumber cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC) ; + ComplexNumber cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD) ; + ComplexNumber cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC) ; + ComplexNumber cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD) ; // Make the topological flip @@ -333,11 +331,11 @@ void Hyperbolic_surface_triangulation_2::flip(_Dart_handle dart){ } } -template -int Hyperbolic_surface_triangulation_2::make_delaunay(){ +template +int Hyperbolic_surface_triangulation_2::make_delaunay(){ int number_of_flips_done = 0; - _Dart_handle edge_to_flip = pick_edge_to_flip(); + Dart_handle edge_to_flip = pick_edge_to_flip(); while (edge_to_flip != nullptr){ flip(edge_to_flip); edge_to_flip = pick_edge_to_flip(); @@ -348,30 +346,30 @@ int Hyperbolic_surface_triangulation_2::make_delaunay(){ } -template -std::vector::Combinatorial_map_with_cross_ratios::Dart_const_handle,typename Traits_2::Hyperbolic_point_2,typename Traits_2::Hyperbolic_point_2,typename Traits_2::Hyperbolic_point_2>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ - std::vector> realizations; +template +std::vector::Dart_const_handle, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ + std::vector> realizations; size_t visited_darts_mark = _combinatorial_map.get_new_mark(); _combinatorial_map.unmark_all(visited_darts_mark); struct Compare { - bool operator()(std::pair<_Dart_const_handle,double> const & x, std::pair<_Dart_const_handle,double> const & y) { + bool operator()(std::pair const & x, std::pair const & y) { return x.second > y.second; } }; - std::priority_queue, std::vector>, Compare> queue; + std::priority_queue, std::vector>, Compare> queue; - std::map<_Dart_const_handle, _Point> positions; + std::map positions; - _Dart_const_range darts = _combinatorial_map.darts(); + Dart_const_range darts = _combinatorial_map.darts(); _combinatorial_map.mark(_anchor.dart, visited_darts_mark); _combinatorial_map.mark(const_ccw(_anchor.dart), visited_darts_mark); _combinatorial_map.mark(const_cw(_anchor.dart), visited_darts_mark); if (center){ - _Isometry center_the_drawing = hyperbolic_translation(_anchor.vertices[0]); + Isometry center_the_drawing = hyperbolic_translation(_anchor.vertices[0]); positions[_anchor.dart] = center_the_drawing.evaluate(_anchor.vertices[0]); positions[const_ccw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[1]); positions[const_cw(_anchor.dart)] = center_the_drawing.evaluate(_anchor.vertices[2]); @@ -381,12 +379,12 @@ std::vector::Co positions[const_cw(_anchor.dart)] = _anchor.vertices[2]; } - std::tuple<_Dart_const_handle,_Point,_Point,_Point> value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); + std::tuple value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); realizations.push_back(value); - _Complex_number anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); - _Complex_number anchor_z1 (_anchor.vertices[1].x(), _anchor.vertices[1].y()); - _Complex_number anchor_z2 (_anchor.vertices[2].x(), _anchor.vertices[2].y()); + ComplexNumber anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); + ComplexNumber anchor_z1 (_anchor.vertices[1].x(), _anchor.vertices[1].y()); + ComplexNumber anchor_z2 (_anchor.vertices[2].x(), _anchor.vertices[2].y()); double weight_of_anchor_dart = CGAL::to_double(anchor_z0.squared_modulus() + anchor_z1.squared_modulus()); double weight_of_ccw_anchor_dart = CGAL::to_double(anchor_z1.squared_modulus() + anchor_z2.squared_modulus()); @@ -399,31 +397,31 @@ std::vector::Co while( ! queue.empty() ){ - _Dart_const_handle invader = queue.top().first; + Dart_const_handle invader = queue.top().first; queue.pop(); - _Dart_const_handle invaded = const_opposite(invader); + Dart_const_handle invaded = const_opposite(invader); if (!_combinatorial_map.is_marked(invaded, visited_darts_mark)){ _combinatorial_map.mark(invaded, visited_darts_mark); _combinatorial_map.mark(const_ccw(invaded), visited_darts_mark); _combinatorial_map.mark(const_cw(invaded), visited_darts_mark); - _Point a = positions[const_ccw(invader)]; - _Point b = positions[const_cw(invader)]; - _Point c = positions[invader]; - _Complex_number cross_ratio = get_cross_ratio(invader); + Point a = positions[const_ccw(invader)]; + Point b = positions[const_cw(invader)]; + Point c = positions[invader]; + ComplexNumber cross_ratio = get_cross_ratio(invader); positions[invaded] = a; positions[const_ccw(invaded)] = c; - _Point d = fourth_point_from_cross_ratio(a, b, c, cross_ratio); + Point d = fourth_point_from_cross_ratio(a, b, c, cross_ratio); positions[const_cw(invaded)] = d; - _Complex_number za (a.x(), a.y()); - _Complex_number zc (c.x(), c.y()); + ComplexNumber za (a.x(), a.y()); + ComplexNumber zc (c.x(), c.y()); double invaded_distance_to_zero = CGAL::to_double(za.squared_modulus()); double invaded_ccw_distance_to_zero = CGAL::to_double(zc.squared_modulus()); - _Complex_number znew (positions[const_cw(invaded)].x(), positions[const_cw(invaded)].y()); + ComplexNumber znew (positions[const_cw(invaded)].x(), positions[const_cw(invaded)].y()); double invaded_cw_distance_to_zero = CGAL::to_double(znew.squared_modulus()); double invaded_ccw_weight = invaded_ccw_distance_to_zero + invaded_cw_distance_to_zero; @@ -432,7 +430,7 @@ std::vector::Co queue.push( std::make_pair(const_ccw(invaded), invaded_ccw_weight) ); queue.push( std::make_pair(const_cw(invaded), invaded_cw_weight) ); - value = std::make_tuple(invaded, _Point(a), _Point(c), _Point(d)); + value = std::make_tuple(invaded, Point(a), Point(c), Point(d)); realizations.push_back(value); } } @@ -444,8 +442,8 @@ std::vector::Co //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_surface_triangulation_2::is_valid() const{ +template +bool Hyperbolic_surface_triangulation_2::is_valid() const{ // 1. Check the combinatorial map // Check that the combinatorial map is valid @@ -470,7 +468,7 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ // Check that the three vertices of the anchor lie within the open unit disk for (int k=0; k<3; k++){ - if (_anchor.vertices[k].get_z().squared_modulus() >= _Number(1)){ + if (_anchor.vertices[k].get_z().squared_modulus() >= Number(1)){ return false; } } @@ -481,12 +479,12 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ +template +void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ // Give indices to the darts - std::map<_Dart_const_handle, int> darts_indices; + std::map darts_indices; int current_dart_index = 0; - for (typename _Dart_const_range::const_iterator it=_combinatorial_map.darts().begin(); it!=_combinatorial_map.darts().end(); ++it){ + for (typename Dart_const_range::const_iterator it=_combinatorial_map.darts().begin(); it!=_combinatorial_map.darts().end(); ++it){ darts_indices[it] = current_dart_index; current_dart_index++; } @@ -495,14 +493,14 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) co s << current_dart_index << std::endl; // Store the triangles - for (typename _Face_const_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<2>().begin(); it != _combinatorial_map.template one_dart_per_cell<2>().end(); ++it){ + for (typename Face_const_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<2>().begin(); it != _combinatorial_map.template one_dart_per_cell<2>().end(); ++it){ s << darts_indices[it] << std::endl; s << darts_indices[const_cw(it)] << std::endl; s << darts_indices[const_ccw(it)] << std::endl; } // Store the edges - for (typename _Edge_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<1>().begin(); it != _combinatorial_map.template one_dart_per_cell<1>().end(); ++it){ + for (typename Edge_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<1>().begin(); it != _combinatorial_map.template one_dart_per_cell<1>().end(); ++it){ s << darts_indices[it] << std::endl; s << darts_indices[const_opposite(it)] << std::endl; s << get_cross_ratio(it); @@ -517,18 +515,18 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) co s << _anchor.vertices[0] << _anchor.vertices[1] << _anchor.vertices[2]; } -template -void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ +template +void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ _combinatorial_map.clear(); std::string line; getline(s, line); int nb_darts = std::stoi(line); - std::vector<_Dart_handle> darts_by_id (nb_darts); + std::vector darts_by_id (nb_darts); int index1, index2, index3; for (int k=0; k::from_stream(std::istream& s){ // Load the edges - _Dart_handle dart_1, dart_2; - _Complex_number cross_ratio; + Dart_handle dart_1, dart_2; + ComplexNumber cross_ratio; for (int k=0; k::from_stream(std::istream& s){ //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.to_stream(s); return s; } -template -void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::ccw(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::ccw(Dart_handle dart){ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::cw(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::cw(Dart_handle dart){ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::opposite(_Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::opposite(Dart_handle dart){ return _combinatorial_map.opposite(dart); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::_Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(Dart_const_handle dart) const{ return _combinatorial_map.opposite(dart); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(_Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ - for (typename _Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ + for (typename Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ if ( is_delaunay_flippable(it) ){ return it; } @@ -638,32 +636,32 @@ typename Hyperbolic_surface_triangulation_2::_Dart_handle Hyperbolic_s //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ //_combinatorial_map.copy_from_const(cmap); _combinatorial_map.copy(cmap); _has_anchor = false; } -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ // Because of the anchor, we must operate the copy ourself _combinatorial_map.clear(); // Copy the triangles and fill the darts conversion table - std::map<_Dart_const_handle, _Dart_handle> darts_table; - for (typename _Face_const_range::const_iterator it=cmap.template one_dart_per_cell<2>().begin(); it!=cmap.template one_dart_per_cell<2>().end(); ++it){ - _Dart_handle new_dart = _combinatorial_map.make_combinatorial_polygon(3); + std::map darts_table; + for (typename Face_const_range::const_iterator it=cmap.template one_dart_per_cell<2>().begin(); it!=cmap.template one_dart_per_cell<2>().end(); ++it){ + Dart_handle new_dart = _combinatorial_map.make_combinatorial_polygon(3); darts_table[it] = new_dart; darts_table[cmap.beta(it,0)] = _combinatorial_map.beta(new_dart,0); darts_table[cmap.beta(it,1)] = _combinatorial_map.beta(new_dart,1); } // Sew the edges and set their cross-ratios - for (typename _Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it){ - _Dart_handle dart_1 = darts_table[it]; - _Dart_handle dart_2 = darts_table[cmap.opposite(it)]; - _Complex_number cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); + for (typename Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it){ + Dart_handle dart_1 = darts_table[it]; + Dart_handle dart_2 = darts_table[cmap.opposite(it)]; + ComplexNumber cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); _combinatorial_map.template sew<2>(dart_1, dart_2); _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cratio)); @@ -681,22 +679,22 @@ void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial //////////////////////////////////////////////////////////////////////////////// -template -typename Traits_2::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Point& d) const{ - _Complex_number za (a.x(), a.y()); - _Complex_number zb (b.x(), b.y()); - _Complex_number zc (c.x(), c.y()); - _Complex_number zd (d.x(), d.y()); +template +typename Traits::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const{ + ComplexNumber za (a.x(), a.y()); + ComplexNumber zb (b.x(), b.y()); + ComplexNumber zc (c.x(), c.y()); + ComplexNumber zd (d.x(), d.y()); return (zd-zb)*(zc-za) / ((zd-za)*(zc-zb)); } -template -typename Traits_2::Hyperbolic_point_2 Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const _Point& a, const _Point& b, const _Point& c, const _Complex_number& cratio) const{ - _Complex_number za (a.x(), a.y()); - _Complex_number zb (b.x(), b.y()); - _Complex_number zc (c.x(), c.y()); - _Complex_number result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); - return _Point(result.real(), result.imag()); +template +typename Hyperbolic_surface_triangulation_2::Point Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const{ + ComplexNumber za (a.x(), a.y()); + ComplexNumber zb (b.x(), b.y()); + ComplexNumber zc (c.x(), c.y()); + ComplexNumber result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); + return Point(result.real_part(), result.imaginary_part()); } } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index feeb70859899..23a802d9c6c1 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -36,14 +36,14 @@ int main() { z1_gmpq = -z1_gmpq; Complex_gmpq z2_gmpq; - z2_gmpq.set_real(Gmpq(-5,7)); - z2_gmpq.set_imag(Gmpq(11,13)); + z2_gmpq.set_real_part(Gmpq(-5,7)); + z2_gmpq.set_imaginary_part(Gmpq(11,13)); z2_gmpq = z2_gmpq.conjugate() + z1_gmpq - one_gmpq; assert( - z1_gmpq * z1_gmpq / z2_gmpq == -Complex_gmpq(Gmpq(855491,632146), Gmpq(844298,316073)) ); - assert( z1_gmpq.real() == Gmpq(-1,2) ); - assert( z1_gmpq.imag() == Gmpq(3) ); + assert( z1_gmpq.real_part() == Gmpq(-1,2) ); + assert( z1_gmpq.imaginary_part() == Gmpq(3) ); assert( z1_gmpq.squared_modulus() == Gmpq(37,4) ); assert( z1_gmpq != z2_gmpq); assert( z2_gmpq == z2_gmpq ); @@ -68,14 +68,14 @@ int main() { z1_integer = -z1_integer; Complex_integer z2_integer; - z2_integer.set_real(Exact_integer(-7)); - z2_integer.set_imag(Exact_integer(43)); + z2_integer.set_real_part(Exact_integer(-7)); + z2_integer.set_imaginary_part(Exact_integer(43)); z2_integer = z2_integer.conjugate() + z1_integer - one_integer; assert( z1_integer * z1_integer / z2_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); - assert( z1_integer.real() == Exact_integer(-17) ); - assert( z1_integer.imag() == Exact_integer(13) ); + assert( z1_integer.real_part() == Exact_integer(-17) ); + assert( z1_integer.imaginary_part() == Exact_integer(13) ); assert( z1_integer.squared_modulus() == 458 ); assert( z1_integer != z2_integer); assert( z2_integer == z2_integer ); From 263f7ea15ae64d82aff8b1be506eafb9566fc5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Mon, 29 Apr 2024 11:08:10 +0200 Subject: [PATCH 13/97] doc update --- Documentation/doc/biblio/cgal_manual.bib | 16 ++++++++++++++++ .../CGAL/Hyperbolic_fundamental_domain_2.h | 1 + .../Hyperbolic_surface_triangulation_2.txt | 17 ++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index f104cfb5c40b..2171576fb2c7 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -696,6 +696,22 @@ @inproceedings{despre2020flipping year={2020} } +@article{despre2022experimental, + title={Experimental analysis of Delaunay flip algorithms on genus two hyperbolic surfaces}, + author={Despr{\'e}, Vincent and Dubois, Lo{\"\i}c and Kolbe, Benedikt and Teillaud, Monique}, + year={2022} +} + +@article{aigon2005hyperbolic, + title={Hyperbolic octagons and Teichm{\"u}ller space in genus 2}, + author={Aigon-Dupuy, Aline and Buser, Peter and Cibils, Michel and K{\"u}nzle, Alfred F and Steiner, Frank}, + journal={Journal of mathematical physics}, + volume={46}, + number={3}, + year={2005}, + publisher={AIP Publishing} +} + @article{cgal:dl-cginc-19, author = {Despr\'{e}, Vincent and Lazarus, Francis}, diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 9d27c2be8cf8..6f901af0f447 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -85,6 +85,7 @@ class Hyperbolic_fundamental_domain_2 { template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /// @} + /// @{ /// \name Validity /*! Validity test. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 240d82cfce08..2deeaf141e49 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -52,11 +52,21 @@ The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ c \subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of convex fundamental domains +We aim at generating convex fundamental domains in a randomized way. +We represent every domain as a polygon in the Poincaré disk, given by the list of its vertices, and endowed with side pairings. +In order to perform fast and exact computations with the domains generated, every vertex must be a complex number whose type supports fast and exact computations. +Under this constraint, we do not know how to generate domains of surfaces of genus greater than two. +In genus two, this package can generate a convex fundamental domain \f$ P \f$, whose side pairings are \f$ A B C D A B C D \f$, and whose eight vertices \f$ z_0, \dots, z_7 \f$ belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). +Here the side pairings and the vertices are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is labeled \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is also labeled \f$ A \f$. +Those octagons are symmetric in the sense that \f$ z_i = z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. +Such octagons are described in \cgalCite{aigon2005hyperbolic} (without the constraint that the vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$). +The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. + \section Subsection_Hyperbolic_Surface_Triangulations_Representation Representation \subsection Subsection_Hyperbolic_Surface_Triangulations_Data_Structure Data structure -We represent convex fundamental domains by the list of their vertices in the Poincaré disk, and by the list of their sides pairings. +We represent domains by the list of their vertices in the Poincaré disk, and by the list of their sides pairings. Let \f$ T \f$ be a triangulation of a closed orientable hyperbolic surface. We represent \f$ T \f$ by an instance of CGAL::Combinatorial_map whose edges are attributed complex numbers. @@ -116,6 +126,11 @@ The example below randomly generates a convex fundamental domain of a surface of \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history +This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker, and Monique Teillaud in \cgalCite{despre2020flipping} (with a different data structure for representing triangulations). +It also implements the generation of domains described by Vincent Despré, Loïc Dubois, Benedikt Kolbe, and Monique Teillaud in \cgalCite{despre2022experimental}, based on results of Aline Aigon-Dupuy, Peter Buser, Michel Cibils, Alfred F Künzle, and Frank Steiner \cgalCite{aigon2005hyperbolic}. +The code and the documentation of the package were entirely written by Loïc Dubois, under regular discussions with Vincent Despré and Monique Teillaud. +The authors aknowledge support from the ANR SoS. + */ } /* namespace CGAL */ From d10f85d7066dfcf2c221d6de9bd2a29cee9ef6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 17 May 2024 16:18:05 +0200 Subject: [PATCH 14/97] doc update --- Documentation/doc/biblio/cgal_manual.bib | 15 +- .../CGAL/Complex_without_sqrt.h | 113 +--- .../CGAL/Hyperbolic_fundamental_domain_2.h | 24 +- .../Hyperbolic_fundamental_domain_factory_2.h | 10 +- .../CGAL/Hyperbolic_isometry_2.h | 14 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 39 +- .../CGAL/Hyperbolic_surfaces_traits_2.h | 17 +- .../Concepts/HyperbolicSurfacesTraits_2.h | 15 +- .../Hyperbolic_surface_triangulation_2.txt | 89 +-- .../PackageDescription.txt | 12 +- .../fig/crossratio.svg | 239 ++++++++ .../fig/octagon.svg | 526 ++++++++++++++++++ .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- 13 files changed, 887 insertions(+), 228 deletions(-) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/crossratio.svg create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/octagon.svg diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 2171576fb2c7..85ad418a9554 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -692,24 +692,27 @@ @article{cgal:dh-pifch-96 @inproceedings{despre2020flipping, title={Flipping geometric triangulations on hyperbolic surfaces}, author={Despr{\'e}, Vincent and Schlenker, Jean-Marc and Teillaud, Monique}, - booktitle={SoCG 2020-36th International Symposium on Computational Geometry}, - year={2020} + booktitle={36th International Symposium on Computational Geometry}, + year={2020}, + url={https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.SoCG.2020.35} } @article{despre2022experimental, - title={Experimental analysis of Delaunay flip algorithms on genus two hyperbolic surfaces}, + title={Experimental analysis of {Delaunay} flip algorithms on genus two hyperbolic surfaces}, author={Despr{\'e}, Vincent and Dubois, Lo{\"\i}c and Kolbe, Benedikt and Teillaud, Monique}, - year={2022} + year={2022}, + url={https://inria.hal.science/hal-03665888v1/document} } @article{aigon2005hyperbolic, - title={Hyperbolic octagons and Teichm{\"u}ller space in genus 2}, + title={Hyperbolic octagons and {Teichm{\"u}ller} space in genus 2}, author={Aigon-Dupuy, Aline and Buser, Peter and Cibils, Michel and K{\"u}nzle, Alfred F and Steiner, Frank}, journal={Journal of mathematical physics}, volume={46}, number={3}, year={2005}, - publisher={AIP Publishing} + publisher={AIP Publishing}, + url = {https://doi.org/10.1063/1.1850177} } diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h index 98f26b138fa9..eb7c5b7f22ab 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h @@ -1,124 +1,17 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a complex number over a field. - -\cgalModels{CGAL::ComplexWithoutSqrt} +\cgalModels{ComplexWithoutSqrt} \tparam FT is the field type and must be a model of `FieldNumberType`. */ template class Complex_without_sqrt { -public: - /// \name Creation - /// @{ - /*! - Default constructor, sets the complex number to 0 + 0 * i. - */ - Complex_without_sqrt(); - - /*! - Constructor from the real part, sets the complex number to 'real_part' + 0 * i. - */ - Complex_without_sqrt(const FT& real_part); - - /*! - Constructor from the real and imaginary parts, sets the complex number to 'real_part' + 'imaginary_part' * i. - */ - Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); - /// @} - - /// \name Access functions - /// @{ - /*! - Sets the real part to 'real_part' - */ - void set_real_part(const FT& real_part); - - /*! - Sets the imaginary part to 'imaginary_part' - */ - void set_imaginary_part(const FT& imaginary_part); - - /*! - Returns the real part - */ - FT real_part() const; - - /*! - Returns the imaginary part - */ - FT imaginary_part() const; - /// @} - - /// \name Operations - /// @{ - /*! - Returns the square of the modulus - */ - FT squared_modulus() const; - - /*! - Returns the conjugate - */ - Complex_without_sqrt conjugate() const; - - /*! - Returns the sum of itself and other - */ - Complex_without_sqrt operator+(const Complex_without_sqrt& other) const; - - /*! - Returns the difference of itself and other - */ - Complex_without_sqrt operator-(const Complex_without_sqrt& other) const; - - /*! - Returns the opposite of itself - */ - Complex_without_sqrt operator-() const; - - /*! - Returns the multiplication of itself and other - */ - Complex_without_sqrt operator*(const Complex_without_sqrt& other) const; - - /*! - Returns the division of itself by other - */ - Complex_without_sqrt operator/(const Complex_without_sqrt& other) const; - /// @} - - /// \name Equality test - /// @{ - /*! - Equality test operator. - */ - template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - /*! - Inequality test operator. - */ - template bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - /// @} - - /// \name Input/output - /// @{ - /*! - Outputs the complex number in a stream. - */ - templatestd::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); - - /*! - Reads the complex number from a stream. - */ - templatevoid operator>>(std::istream& s, Complex_without_sqrt& z); - /// @} }; - -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 6f901af0f447..d844c1e213c4 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -1,18 +1,18 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses Represents a fundamental domain of a closed orientable hyperbolic surface. -The domain is given as a polygon P represented by the list of its vertices in the Poincaré disk model, -together with a pairing of the sides of P. -The n-th side of P is the side between the n-th and the (n+1)-th vertex, where indices are modulo the number of vertices of P. -The sides pairing are represented by a list of integers, such that if the n-th integer of the list is m, then the n-th side is paired to the m-th side. +The domain is given as a polygon \f$ P \f$ represented by the list of its vertices in the Poincaré disk model, +together with a pairing of the sides of \f$ P \f$. +The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. +The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ template class Hyperbolic_fundamental_domain_2 { @@ -50,17 +50,17 @@ class Hyperbolic_fundamental_domain_2 { int size() const; /*! - Returns the index-th vertex + Returns the index-th vertex. */ Point vertex(int index) const; /*! - Returns the index of the side paired to side A, where A is the index-th side + Returns the index of the side paired to the index-th side. */ int paired_side(int index) const; /*! - Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + Returns the isometry that maps side \f$ A \f$ to side \f$ B \f$, where \f$ B \f$ is the index-th side, and \f$ A \f$ is the side paired to \f$ B \f$. */ Hyperbolic_isometry_2 side_pairing(int index) const; /// @} @@ -79,8 +79,8 @@ class Hyperbolic_fundamental_domain_2 { The format of the output is the following. The first line prints the number n of vertices of the domain. - For i=0 to n-1 the index of the side paired to side i is printed on a separate line. - For i=0 to n-1 the i-th vertex is printed on a separate line. + For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line. + For \f$ i=0 \f$ to \f$ n-1 \f$ the \f$ i \f$-th vertex is printed on a separate line. */ template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /// @} @@ -96,4 +96,4 @@ class Hyperbolic_fundamental_domain_2 { /// @} }; -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 589456063659..df46a338d556 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -1,14 +1,14 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Factory class, whose only purpose is to randomly generate some convex domains of surfaces of genus two. +Factory class, whose only purpose is to generate some convex domains of surfaces of genus two. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ template class Hyperbolic_fundamental_domain_factory_2{ @@ -16,7 +16,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /// \name Creation /// @{ /*! - Default constructor, the seed is used for random generation. + Default constructor, the seed is used for generation. */ Hyperbolic_fundamental_domain_factory_2(unsigned int seed); /// @} @@ -31,4 +31,4 @@ class Hyperbolic_fundamental_domain_factory_2{ }; -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 2ea13c07d59a..3634d96423eb 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -1,18 +1,18 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses Represents an isometry in the Poincaré disk model. -The isometry f is represented by a list (c0, c1, c2, c3) of complex numbers, -so that f(z) = (c0 z + c1) / (c2 z + c3) holds on every complex z in the open unit disk. +The isometry \f$ f \f$ is represented by a list \f$ (c_0, c_1, c_2, c_3) \f$ of complex numbers, +so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ z \f$ in the open unit disk. Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ template class Hyperbolic_isometry_2{ @@ -67,7 +67,7 @@ class Hyperbolic_isometry_2{ Point evaluate(const Point& point) const; /*! - Returns the composition of itself and other. + Returns the composition of other by itself . */ Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; /// @} @@ -79,8 +79,6 @@ class Hyperbolic_isometry_2{ */ template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); /// @} - - }; -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 88e3a46b529a..cd63c62e9d71 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -1,7 +1,7 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses @@ -11,7 +11,7 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. */ template class Hyperbolic_surface_triangulation_2{ @@ -19,7 +19,7 @@ class Hyperbolic_surface_triangulation_2{ /// \name Types /// @{ /*! - Type of combinatorial map whose edges are attributed complex numbers. + Type of combinatorial map whose edges are decorated with complex numbers. */ typedef Combinatorial_map<2,unspecified_type> Combinatorial_map_with_cross_ratios; /*! @@ -36,7 +36,7 @@ class Hyperbolic_surface_triangulation_2{ typedef typename Traits::Hyperbolic_point_2 Point; /*! - Stores a dart d of the combinatorial map, belonging to a triangle t, and stores the three vertices of a lift of t in the hyperbolic plane. + Stores a dart \f$ d \f$ of the combinatorial map, belonging to a triangle \f$ t \f$, and stores the three vertices of a lift of \f$ t \f$ in the hyperbolic plane. */ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; @@ -114,11 +114,12 @@ class Hyperbolic_surface_triangulation_2{ /// \name Lifting /// @{ /*! - Lifts the triangulation in the hyperbolic plane. Returns, for every triangle T of the triangulation, one of the darts of T in the combinatorial map of the triangulation, together with a triple A,B,C of points in the hyperbolic plane. - The points A,B,C are the vertices of a lift of T in the hyperbolic plane. - If the center parameter is set to true, then one of the lifted triangles admits the point 0 as a vertex. + Lifts the triangulation in the hyperbolic plane. + Returns, for every triangle \f$ t \f$ of the triangulation, one of the darts of \f$ t \f$ in the combinatorial map of the triangulation, together with a triple \f$ p,q,r \f$ of points in the hyperbolic plane. + The points \f$ p,q,r \f$ are the vertices of a lift of \f$ t \f$ in the hyperbolic plane. + If the center parameter is set to true, then one of the lifted triangles admits the origin \f$ 0 \f$ as a vertex. - This method is to be used only if the triangulation has an anchor. + \pre This method is to be used only if the triangulation has an anchor. */ std::vector> lift(bool center=true) const; /// @} @@ -128,8 +129,8 @@ class Hyperbolic_surface_triangulation_2{ /*! Validity test. - Checks that the combinatorial map has no 1,2-boundary and calls the is_valid method of the combinatorial map. - If there is an anchor, then checks that the dart handle of the anchor does indeed point to a dart of the combinatorial map, and checks that the three vertices of the anchor lie within the open unit disk. + Checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$. + If there is an anchor, then checks that the dart handle of the anchor does indeed point to a dart of \f$ M \f$, and checks that the three vertices of the anchor lie within the open unit disk. */ bool is_valid() const; /// @} @@ -140,22 +141,22 @@ class Hyperbolic_surface_triangulation_2{ Writes the triangulation in a stream. The format of the output is the following. - Each dart of the triangulation is given an index between 0 and n-1, where n is the number of darts of the triangulation. - The first line contains the number n of darts. - For every triangle t, the indices of the three darts of t are printed on three distinct lines. - For every edge e, the indices of the two darts of e are printed on two distinct lines, followed by a third line on which the cross ratio of e is printed. + Each dart of the triangulation is given an index between \f$ 0 \f$ and \f$ n-1 \f$, where \f$ n \f$ is the number of darts of the triangulation. + The first line contains the number \f$ n \f$ of darts. + For every triangle \f$ t \f$, the indices of the three darts of \f$ t \f$ are printed on three distinct lines. + For every edge \f$ e \f$, the indices of the two darts of \f$ e \f$ are printed on two distinct lines, followed by a third line on which the cross ratio of \f$ e \f$ is printed. The next line contains either 'yes' or 'no' and tells whether the triangulation has an anchor. - If the triangulation has anchor A, then the two next lines print respectively the index of the dart of A, and the three complex numbers of A. + If the triangulation has anchor, then the two next lines print respectively the index of the dart of the anchor, and the three vertices of the anchor. */ - template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); + std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); /*! Reads the triangulation from a stream. - The format of the input should be the same as the format of the output of the 'from_stream' method. + The format of the input should be the same as the format of the output of the '<<' operator. */ - template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); + void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); /// @} }; -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h index e3d8a33a5cef..ee5d01ef3729 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h @@ -1,30 +1,17 @@ // Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) // All rights reserved. -namespace CGAL { +namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2TraitsClasses -Traits class offered by \cgal as a default model for the traits concept `HyperbolicSurfacesTraits_2`. - \tparam HyperbolicTraitsClass must be a model of `HyperbolicDelaunayTriangulationTraits_2`. -The default value for `HyperbolicTraitsClass` is `CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>>`, - which provides exact constructions and predicates over rational numbers. - \cgalModels{HyperbolicSurfacesTraits_2} */ template class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { -public: - /// \name Types - /// @{ - typedef typename HyperbolicTraitsClass::FT FT; - typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2; - typedef Complex_without_sqrt Complex; - /// @} }; - -} //namespace CGAL +}; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index 9422b18d81ae..f425b47ac06e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -5,9 +5,6 @@ \ingroup PkgHyperbolicSurfaceTriangulation2Concepts \cgalConcept -The concept `HyperbolicSurfacesTraits_2` describes the set of requirements -to be fulfilled by any class instantiating the template parameter of the main classes of the package. - \cgalRefines{HyperbolicDelaunayTriangulationTraits_2} \cgalHasModelsBegin @@ -19,8 +16,16 @@ class HyperbolicSurfacesTraits_2 { /// \name Types /// @{ /*! - Represents a complex number over a field: must be a model of 'CGAL::ComplexWithoutSqrt'. + Field type. + */ + typedef unspecified_type FT; + /*! + Represents a point in the Poincaré disk model of the hyperbolic plane. + */ + typedef unspecified_type Hyperbolic_point_2; + /*! + Represents a complex number over a field: must be a model of ComplexWithoutSqrt. */ - typedef unspecified_type Complex; + typedef unspecified_type Complex; /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 2deeaf141e49..4306da7d0ee5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -14,63 +14,68 @@ namespace CGAL {
-This package enables handling and building triangulations of closed orientable hyperbolic surfaces. -Facilities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. -A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that randomly generates such domains in genus two. +This package enables building and handling triangulations of closed orientable hyperbolic surfaces. +Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. +A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that generates such domains in genus two. \section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic surfaces -\subsection Section_Hyperbolic_Surface_Triangulations_surfaces Hyperbolic surfaces - We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. -This package is concerned with the closed (compact, and without boundary) and orientable hyperbolic surfaces \f$ S \f$. +In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable : this is without further mention. The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi : \mathbb{D} \to S \f$ is a (local) isometry. The pre-image \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. +We usually denote by \f$ \widetilde x \f$ a lift of \f$ x \f$. +Paths, and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. \subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental domains and triangulations -Let \f$ S \f$ be a closed orientable hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. -A graph \f$ G \f$ embedded in \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) has genus zero; It is in that sense that the faces of \f$ G \f$ are "manageable". -In this document, it is implicit that if a graph \f$ G \f$ is embedded in a hyperbolic surface \f$ S \f$, then every edge of \f$ G \f$ is geodesic in \f$ S \f$. +Let \f$ S \f$ be a hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. +A graph \f$ G \f$ embedded on \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) is a topological disk. +In this document, every edge of a graph \f$ G \f$ embedded on \f$ S \f$ is a geodesic on \f$ S \f$. We consider two types of cellular decompositions of \f$ S \f$:
  • We consider cellular decompositions \f$ G \f$ of \f$ S \f$ that have only one face. -Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, that we call fundamental domain for \f$ S \f$. +Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, which is a fundamental domain for \f$ S \f$. The edges of \f$ P \f$ are paired, so that every edge of \f$ G \f$ is cut into two edges that are paired in \f$ P \f$. -Every closed orientable hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$. +Every hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$.
  • Also, we consider triangulations of \f$ S \f$. -A cellular decomposition \f$ T \f$ of \f$ S \f$ is a triangulation if every face of \f$ T \f$ is a "triangle", in the sense that it admits three incidences with edges of \f$ T \f$. +A cellular decomposition \f$ T \f$ of \f$ S \f$ is a triangulation if every face of \f$ T \f$ is a "triangle": it admits three incidences with edges of \f$ T \f$. Observe that this definition allows for triangulations with only one vertex.
-A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$. -The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of arbitrary arcs of \f$ P \f$. +A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior of \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$. +The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of any maximal set of pairwise-disjoint arcs of \f$ P \f$. \subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of convex fundamental domains -We aim at generating convex fundamental domains in a randomized way. -We represent every domain as a polygon in the Poincaré disk, given by the list of its vertices, and endowed with side pairings. -In order to perform fast and exact computations with the domains generated, every vertex must be a complex number whose type supports fast and exact computations. -Under this constraint, we do not know how to generate domains of surfaces of genus greater than two. -In genus two, this package can generate a convex fundamental domain \f$ P \f$, whose side pairings are \f$ A B C D A B C D \f$, and whose eight vertices \f$ z_0, \dots, z_7 \f$ belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). -Here the side pairings and the vertices are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is labeled \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is also labeled \f$ A \f$. -Those octagons are symmetric in the sense that \f$ z_i = z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. -Such octagons are described in \cgalCite{aigon2005hyperbolic} (without the constraint that the vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$). -The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. +This package can generate a convex fundamental domain \f$ P \f$ of a surface of genus two, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$, whose side pairings are \f$ A B C D \overline{A} \overline{B} \overline{C} \overline{D} \f$. +The vertices and the side pairings are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is \f$ \overline{A} \f$. +Those octagons are symmetric, .i.e \f$ z_i = z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. +Such octagons are described in \cgalCite{aigon2005hyperbolic}. + +
+ +
\section Subsection_Hyperbolic_Surface_Triangulations_Representation Representation -\subsection Subsection_Hyperbolic_Surface_Triangulations_Data_Structure Data structure +\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Domains Data structure for domains -We represent domains by the list of their vertices in the Poincaré disk, and by the list of their sides pairings. +We represent every domain as a polygon in the Poincaré disk, given by the list of its vertices, and by the list of its side pairings. +Concerning the generation of domains, in order to perform fast and exact computations with the domains generated, every vertex must be a complex number whose type supports fast and exact computations. +Under this constraint, it is not known how to generate domains of surfaces of genus greater than two. +In genus two, this package generates domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). +The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. -Let \f$ T \f$ be a triangulation of a closed orientable hyperbolic surface. -We represent \f$ T \f$ by an instance of CGAL::Combinatorial_map whose edges are attributed complex numbers. -The complex number \f$ R_T(e) \in \mathbb{C} \f$ attributed to an edge \f$ e \f$ of \f$ T \f$ is the cross ratio of \f$ e \f$ in \f$ T \f$, defined as follows. +\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Triangulations Data structure for triangulations + +Let \f$ T \f$ be a triangulation of a hyperbolic surface. +We represent \f$ T \f$ by an instance of CGAL::Combinatorial_map whose edges are decorated with complex numbers. +The complex number \f$ R_T(e) \in \mathbb{C} \f$ decorating an edge \f$ e \f$ of \f$ T \f$ is the cross ratio of \f$ e \f$ in \f$ T \f$, defined as follows. Consider the lift \f$ \widetilde T \f$ of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. In \f$ \widetilde T \f$, let \f$ \widetilde e \f$ be a lift of \f$ e \f$. Orient \f$ \widetilde e \f$ arbitrarily, and let \f$ z_0 \in \mathbb{D} \f$ and \f$ z_2 \in \mathbb{D} \f$ be respectively the first and second vertices of \f$ \widetilde e \f$. @@ -78,6 +83,11 @@ In \f$ \widetilde T \f$, consider the triangle on the right of \f$ \widetilde e Similarly, consider the triangle on the left of \f$ \widetilde e \f$, and let \f$ z_3 \in \mathbb{D} \f$ be the third vertex of this triangle. Then \f$ R_T(e) = (z_3-z_1)*(z_2-z_0) / ((z_3-z_0)*(z_2-z_1)) \f$. This definition does not depend on the choice of the lift \f$ \widetilde e \f$, nor on the orientation of \f$ \widetilde e \f$. +See \cgalCite{despre2022experimental} for details. + +
+ +
While the triangulation \f$ T \f$ is unambiguously determined by the combinatorial map and its cross ratios, the internal representation of \f$ T \f$ can contain some additional data: the anchor. The anchor is used when building a portion of the lift of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. @@ -86,11 +96,11 @@ It contains a lift \f$ t \f$ of a triangle of \f$ T \f$ in \f$ \mathbb{D} \f$: \ \subsection Subsection_Hyperbolic_Surface_Triangulations_Delaunay Delaunay flip algorithm -Let \f$ T \f$ be a triangulation of a closed orientable hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. -(This definition has an equivalent "empty disk" formulation in the package \ref PkgHyperbolicTriangulation2). +Let \f$ T \f$ be a triangulation of a hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. +This definition is equivalent to the usual "empty disk" formulation. Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. -This operation is called a flip. +This operation is called a Delaunay flip. When a flip occurs, the cross ratios of the edges involved are modified via simple formulas. The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cgalCite{despre2020flipping}. @@ -99,17 +109,16 @@ This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cg The package contains three main classes: -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. - -- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a closed orientable hyperbolic surface. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a hyperbolic surface. It offers functionalities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some convex fundamental domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a hyperbolic surface. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex fundamental domains of surfaces of genus two. The package also contains the secondary class `CGAL::Hyperbolic_isometry_2` to deal with isometries in the Poincaré disk. The concept `HyperbolicSurfacesTraits_2` is a refinement of `HyperbolicDelaunayTriangulationTraits_2`. -This concept describes the requirements for the template parameter of the classes of the package. +It describes the template parameter of most classes of the package. It is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. The concept `ComplexWithoutSqrt` describes a complex number type that does not use square root. It is modeled by the class `CGAL::Complex_without_sqrt`. @@ -120,16 +129,16 @@ The concept `ComplexWithoutSqrt` describes a complex number type that does not u \section Section_Hyperbolic_Surface_Triangulations_Example Example -The example below randomly generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. +The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. \cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history -This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker, and Monique Teillaud in \cgalCite{despre2020flipping} (with a different data structure for representing triangulations). +This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker, and Monique Teillaud in \cgalCite{despre2020flipping} (with a different data structure for representing triangulations, see \cgalCite{despre2022experimental}). It also implements the generation of domains described by Vincent Despré, Loïc Dubois, Benedikt Kolbe, and Monique Teillaud in \cgalCite{despre2022experimental}, based on results of Aline Aigon-Dupuy, Peter Buser, Michel Cibils, Alfred F Künzle, and Frank Steiner \cgalCite{aigon2005hyperbolic}. -The code and the documentation of the package were entirely written by Loïc Dubois, under regular discussions with Vincent Despré and Monique Teillaud. -The authors aknowledge support from the ANR SoS. +The code and the documentation of the package were written by Loïc Dubois, under regular discussions with Vincent Despré and Monique Teillaud. +The authors aknowledge support from the grants SoS and MIN-MAX of the French National Research Agency ANR. */ } /* namespace CGAL */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 7baaea478873..bc111179cfdf 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -19,7 +19,7 @@ \cgalPkgSummaryBegin \cgalPkgAuthors{Vincent Despré, Loïc Dubois, and Monique Teillaud} -\cgalPkgDesc{This package enables handling and building triangulations of closed orientable hyperbolic surfaces. Facilities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} +\cgalPkgDesc{This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} \cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} \cgalPkgSummaryEnd @@ -39,20 +39,18 @@ \cgalCRPSection{Concepts} - `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the template parameter of most classes of the package. +- `ComplexWithoutSqrt` describes a complex number type that does not use square root. \cgalCRPSection{Classes} -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. It offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. - `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to randomly generate some convex domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to generate some convex domains of surfaces of genus two. - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. -- `CGAL::Complex_without_sqrt` represents a complex number. - -A model for the concept `HyperbolicSurfacesTraits_2` is provided: -- `CGAL::Hyperbolic_surfaces_traits_2` inherits from its template parameter HyperbolicTraitsClass. HyperbolicTraitsClass must be a model of `CGAL::HyperbolicDelaunayTriangulationTraits_2`. +Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided : `CGAL::Hyperbolic_surfaces_traits_2` and `CGAL::Complex_without_sqrt`. */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/crossratio.svg b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/crossratio.svg new file mode 100644 index 000000000000..7532902b7ccb --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/crossratio.svg @@ -0,0 +1,239 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/octagon.svg b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/octagon.svg new file mode 100644 index 000000000000..903623a0421e --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/fig/octagon.svg @@ -0,0 +1,526 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 2689f0684950..83b1f90bcc13 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -151,7 +151,7 @@ typename Traits::FT Hyperbolic_fundamental_domain_factory_2::exact_numbe if (x< 0){ return _FT(0)-exact_number_from_float(-x); } - return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION, _DENOMINATOR_FOR_GENERATION); + return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION)/_FT( _DENOMINATOR_FOR_GENERATION); } template From dec801d022b48116e6161769ba57bbb33312bf86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Fri, 17 May 2024 17:43:51 +0200 Subject: [PATCH 15/97] update doc 2 --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 8 ++++---- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 4 ++-- .../CGAL/Hyperbolic_isometry_2.h | 4 ++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 10 +++------- .../PackageDescription.txt | 4 ++-- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index d844c1e213c4..c3569f84cda2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -12,7 +12,7 @@ together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). */ template class Hyperbolic_fundamental_domain_2 { @@ -60,7 +60,7 @@ class Hyperbolic_fundamental_domain_2 { int paired_side(int index) const; /*! - Returns the isometry that maps side \f$ A \f$ to side \f$ B \f$, where \f$ B \f$ is the index-th side, and \f$ A \f$ is the side paired to \f$ B \f$. + Returns the isometry that maps side \f$ \overline A \f$ to side \f$ A \f$, where \f$ A \f$ is the index-th side, and \f$ \overline A \f$ is the side paired to \f$ A \f$. */ Hyperbolic_isometry_2 side_pairing(int index) const; /// @} @@ -72,7 +72,7 @@ class Hyperbolic_fundamental_domain_2 { The format of the input should be the same as the format of the output of the 'from_stream' method. */ - template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); + void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); /*! Writes the domain in a stream. @@ -82,7 +82,7 @@ class Hyperbolic_fundamental_domain_2 { For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line. For \f$ i=0 \f$ to \f$ n-1 \f$ the \f$ i \f$-th vertex is printed on a separate line. */ - template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); + std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /// @} /// @{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index df46a338d556..86cbe4184a42 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -6,9 +6,9 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Factory class, whose only purpose is to generate some convex domains of surfaces of genus two. +Factory class, whose purpose is to generate some convex domains of surfaces of genus two. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). */ template class Hyperbolic_fundamental_domain_factory_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 3634d96423eb..a8c73af9764a 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -12,7 +12,7 @@ so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). */ template class Hyperbolic_isometry_2{ @@ -77,7 +77,7 @@ class Hyperbolic_isometry_2{ /*! Writes the isometry in a stream. */ - template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); + std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index cd63c62e9d71..a3eb2ebcbcb6 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -11,7 +11,7 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2`. +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). */ template class Hyperbolic_surface_triangulation_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 4306da7d0ee5..0da39d4ae3f9 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -115,14 +115,10 @@ The package contains three main classes: - `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex fundamental domains of surfaces of genus two. -The package also contains the secondary class `CGAL::Hyperbolic_isometry_2` to deal with isometries in the Poincaré disk. - -The concept `HyperbolicSurfacesTraits_2` is a refinement of `HyperbolicDelaunayTriangulationTraits_2`. -It describes the template parameter of most classes of the package. -It is modeled by the class `CGAL::Hyperbolic_surfaces_traits_2`. - -The concept `ComplexWithoutSqrt` describes a complex number type that does not use square root. It is modeled by the class `CGAL::Complex_without_sqrt`. +The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. +Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2` : it is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and is modeled by `CGAL::Hyperbolic_surfaces_traits_2`. +Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root : it is modeled by `CGAL::Complex_without_sqrt`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index bc111179cfdf..01c51dde3bfb 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -38,7 +38,7 @@ \cgalCRPSection{Concepts} -- `HyperbolicSurfacesTraits_2` describes the set of requirements to be fulfilled by any class instantiating the template parameter of most classes of the package. +- `HyperbolicSurfacesTraits_2` is the concept for the template parameter of most classes of the package. - `ComplexWithoutSqrt` describes a complex number type that does not use square root. \cgalCRPSection{Classes} @@ -47,7 +47,7 @@ - `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose only purpose is to generate some convex domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex domains of surfaces of genus two. - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. From 0eae2cf785298f6a3ed7d512a66399a0d7a23548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Mon, 20 May 2024 11:59:04 +0200 Subject: [PATCH 16/97] update --- .../demo.cpp | 25 ++++---- .../window.h | 12 ++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 9 +-- .../Hyperbolic_surface_triangulation_2.txt | 4 +- .../examples.txt | 1 + .../CMakeLists.txt | 7 +- .../example.cpp | 17 ++--- .../example_bis.cpp | 55 ++++++++++++++++ .../include/CGAL/Complex_without_sqrt.h | 4 +- .../CGAL/Hyperbolic_fundamental_domain_2.h | 6 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 64 +++++++++++-------- .../hs_test_domain.cpp | 13 ++-- .../hs_test_factory.cpp | 15 ++--- .../hs_test_isometry.cpp | 13 ++-- .../hs_test_triangulation.cpp | 48 +++++++------- 15 files changed, 171 insertions(+), 122 deletions(-) create mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp index 10a366680ecd..9197cd1ebe77 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp @@ -12,25 +12,22 @@ #include "window.h" -#include - +#include +#include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include +using namespace CGAL; -typedef CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>> ParentTraits; -typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; -typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; -typedef CGAL::Hyperbolic_fundamental_domain_factory_2 Factory; -typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h index 31b46da6b5e7..6a0c7587d249 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h @@ -9,18 +9,14 @@ // UI generated header #include "ui_drawing_window_description.h" -// CGAL headers -#include - #include #include -#include -#include -#include -#include +#include #include +#include -typedef CGAL::Hyperbolic_Delaunay_triangulation_CK_traits_2,CGAL::Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef CGAL::Cartesian Kernel; +typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; typedef Traits::Hyperbolic_point_2 Point; typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index a3eb2ebcbcb6..76c4eb40e4ab 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -128,7 +128,6 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Validity test. - Checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$. If there is an anchor, then checks that the dart handle of the anchor does indeed point to a dart of \f$ M \f$, and checks that the three vertices of the anchor lie within the open unit disk. */ @@ -139,20 +138,18 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Writes the triangulation in a stream. - The format of the output is the following. Each dart of the triangulation is given an index between \f$ 0 \f$ and \f$ n-1 \f$, where \f$ n \f$ is the number of darts of the triangulation. The first line contains the number \f$ n \f$ of darts. - For every triangle \f$ t \f$, the indices of the three darts of \f$ t \f$ are printed on three distinct lines. - For every edge \f$ e \f$, the indices of the two darts of \f$ e \f$ are printed on two distinct lines, followed by a third line on which the cross ratio of \f$ e \f$ is printed. The next line contains either 'yes' or 'no' and tells whether the triangulation has an anchor. - If the triangulation has anchor, then the two next lines print respectively the index of the dart of the anchor, and the three vertices of the anchor. + If the triangulation has an anchor, then the four next lines print the index of the dart of the anchor, and the three vertices of the anchor. + Then, for every triangle \f$ t \f$, the indices of the three darts of \f$ t \f$ are printed on three distinct lines. + Finally, for every edge \f$ e \f$, the indices of the two darts of \f$ e \f$ are printed on two distinct lines, followed by a third line on which the cross ratio of \f$ e \f$ is printed. */ std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); /*! Reads the triangulation from a stream. - The format of the input should be the same as the format of the output of the '<<' operator. */ void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 0da39d4ae3f9..fd068821b52e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -125,8 +125,10 @@ Also, the concept `ComplexWithoutSqrt` describes a complex number type that does \section Section_Hyperbolic_Surface_Triangulations_Example Example -The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, and saves and prints the Delaunay triangulation. +The two examples below generate a convex fundamental domain of a surface of genus two, triangulate the domain, apply the Delaunay flip algorithm to the resulting triangulation, and save and print the Delaunay triangulation. +They use different kernels. \cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} +\cgalExample{Hyperbolic_surface_triangulation_2_Example/example_bis.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index c7e5a40b9501..c48df030b1d1 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,3 +1,4 @@ /*! \example Hyperbolic_surface_triangulation_2_Example/example.cpp +\example Hyperbolic_surface_triangulation_2_Example/example_bis.cpp */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt index c586b284b32d..6e6b2ee17394 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.15) -project( example ) +project( examples ) # CGAL and its components find_package( CGAL QUIET COMPONENTS ) @@ -24,12 +24,15 @@ if ( NOT Boost_FOUND ) endif() add_executable( example example.cpp ) +add_executable( example_bis example_bis.cpp ) -add_to_cached_list( CGAL_EXECUTABLE_TARGETS example ) +add_to_cached_list( CGAL_EXECUTABLE_TARGETS example example_bis) target_link_libraries(example PRIVATE CGAL::CGAL ) +target_link_libraries(example_bis PRIVATE CGAL::CGAL ) set(CMAKE_BUILD_TYPE "Release") ######################################################################### target_include_directories(example PRIVATE ../../include/) +target_include_directories(example_bis PRIVATE ../../include/) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp index d53ec9b5cab2..7a19f063fbb6 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -10,26 +10,23 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include -#include -#include - #include #include -#include -#include -#include -#include +#include #include +#include +#include +#include #include using namespace CGAL; -typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; int main(){ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp new file mode 100644 index 000000000000..533fee88f95b --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp @@ -0,0 +1,55 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace CGAL; + +typedef Circular_kernel_2,Algebraic_kernel_for_circles_2_2> Kernel; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2 ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; + +int main(){ + // Generates the domain: + Factory factory = Factory(time(NULL)); + Domain domain = factory.generate_domain_g2(); + + // Triangulates the domain: + Triangulation triangulation = Triangulation(domain); + + // Applies the Delaunay flip algorithm to the triangulation: + triangulation.make_delaunay(); + + // Saves the triangulation: + std::ofstream output_file = std::ofstream ("OutputTriangulation.txt"); + output_file << triangulation; + output_file.close(); + + // Prints the triangulation: + std::cout << triangulation << std::endl; + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 808561131d47..0e12df5b7baf 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -162,9 +162,9 @@ std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z){ template void operator>>(std::istream& s, Complex_without_sqrt& z){ std::string line; - std::getline(s, line); + s >> line; z.set_real_part(FT(line)); - std::getline(s, line); + s >> line; z.set_imaginary_part(FT(line)); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 58610b7ad49e..638b998aee8f 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -125,7 +125,7 @@ void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ } for (int k=0; k::from_stream(std::istream& s){ _pairings.clear(); std::string line; - std::getline(s, line); + s >> line; int size = std::stoi(line); for (int k=0; k> line; _pairings.push_back(std::stoi(line)); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index d73c4f48f9ad..ccf9ea70e837 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -492,6 +492,17 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) cons // Store the number of darts s << current_dart_index << std::endl; + // Store the anchor, if any + if (_has_anchor){ + s << "yes" << std::endl; + s << darts_indices[_anchor.dart] << std::endl; + s << _anchor.vertices[0] << std::endl; + s << _anchor.vertices[1] << std::endl; + s << _anchor.vertices[2] << std::endl; + } else { + s << "no" << std::endl; + } + // Store the triangles for (typename Face_const_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<2>().begin(); it != _combinatorial_map.template one_dart_per_cell<2>().end(); ++it){ s << darts_indices[it] << std::endl; @@ -505,34 +516,44 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) cons s << darts_indices[const_opposite(it)] << std::endl; s << get_cross_ratio(it); } - - // Store the anchor, if any - if (!_has_anchor){ - s << "no" << std::endl; - } - s << "yes" << std::endl; - s << darts_indices[_anchor.dart] << std::endl; - s << _anchor.vertices[0] << _anchor.vertices[1] << _anchor.vertices[2]; } template void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ _combinatorial_map.clear(); + // Load the number of darts std::string line; - getline(s, line); + s >> line; int nb_darts = std::stoi(line); + // Load the anchor + int anchor_dart_id; + s >> line; + if (!line.compare("yes")){ + _has_anchor = true; + + s >> line; + anchor_dart_id = std::stoi(line); // (*) _anchor.dart_id is set at the end of the function + + s >> _anchor.vertices[0]; + s >> _anchor.vertices[1]; + s >> _anchor.vertices[2]; + } else { + _has_anchor = false; + } + + // Load the triangles std::vector darts_by_id (nb_darts); int index1, index2, index3; for (int k=0; k> line; index1 = std::stoi(line); - getline(s, line); + s >> line; index2 = std::stoi(line); - getline(s, line); + s >> line; index3 = std::stoi(line); darts_by_id[index1] = triangle_dart; @@ -540,15 +561,13 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ darts_by_id[index3] = ccw(triangle_dart); } - - // Load the edges Dart_handle dart_1, dart_2; ComplexNumber cross_ratio; for (int k=0; k> line; index1 = std::stoi(line); - getline(s, line); + s >> line; index2 = std::stoi(line); dart_1 = darts_by_id[index1]; dart_2 = darts_by_id[index2]; @@ -557,17 +576,10 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cross_ratio)); } - getline(s, line); - if (line.c_str() == "no"){ - _has_anchor = false; - return; + // (*) here + if (_has_anchor){ + _anchor.dart = darts_by_id[anchor_dart_id]; } - _has_anchor = true; - getline(s, line); - _anchor.dart = darts_by_id[std::stoi(line)]; - s >> _anchor.vertices[0]; - s >> _anchor.vertices[1]; - s >> _anchor.vertices[2]; } //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index 492e60f60c6d..a4cfe05a24d7 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -10,22 +10,19 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include -#include - #include #include #include -#include -#include -#include -#include +#include #include +#include +#include using namespace CGAL; -typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surfaces_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index 07836e76033e..30c0669e40de 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -10,23 +10,20 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include -#include -#include - #include #include #include -#include -#include -#include -#include +#include #include +#include +#include +#include using namespace CGAL; -typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surfaces_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index 4fd0ad41a615..d171ab599a9a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -10,22 +10,19 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include -#include - #include #include #include -#include -#include -#include -#include +#include #include +#include +#include using namespace CGAL; -typedef Hyperbolic_Delaunay_triangulation_CK_traits_2,Algebraic_kernel_for_circles_2_2>> ParentTraits; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surfaces_traits_2 Traits; typedef Hyperbolic_isometry_2 Isometry; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index 90f73da4b4a1..fef77c2b4414 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -10,42 +10,40 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include -#include -#include -#include - #include #include #include +#include +#include +#include +#include +#include +#include +#include using namespace CGAL; -typedef Gmpq FT; - -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_surface_triangulation_2 Triangulation; +typedef Cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; +typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; -typedef typename Traits::Point_2 Point; -typedef Complex_without_sqrt Complex; +typedef typename Traits::FT FT; +typedef typename Traits::Hyperbolic_point_2 Point; +typedef typename Traits::Complex Complex; Domain build_domain(){ - // std::vector vertices; - Complex z0 = Complex (FT(809,10000),FT(0)); - Complex z1 = Complex (FT(7359,10000),FT(1877,10000)); - Complex z2 = Complex (FT(-999,2500),FT(881,1000)); - Complex z3 = Complex (FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")); - vertices.push_back( Point(z0) ); - vertices.push_back( Point(z1) ); - vertices.push_back( Point(z2) ); - vertices.push_back( Point(z3) ); - vertices.push_back( Point(-z0) ); - vertices.push_back( Point(-z1) ); - vertices.push_back( Point(-z2) ); - vertices.push_back( Point(-z3) ); + vertices.push_back( Point(FT(809,10000),FT(0)) ); + vertices.push_back( Point(FT(7359,10000),FT(1877,10000)) ); + vertices.push_back( Point(FT(-999,2500),FT(881,1000)) ); + vertices.push_back( Point(FT("-22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")) ); + vertices.push_back( Point(FT(-809,10000),FT(0)) ); + vertices.push_back( Point(FT(-7359,10000),FT(-1877,10000)) ); + vertices.push_back( Point(FT(999,2500),FT(-881,1000)) ); + vertices.push_back( Point(FT("22088524601252853411192791001942853611410938513/24711029456888649611435724068315791591836010000"),FT("-9482675065452890527617859332378101016513362487/24711029456888649611435724068315791591836010000")) ); std::vector pairings; for (int k=0; k<8; k++){ From c4eea02eb713b07f47b378761a2259c7073be42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubois?= Date: Wed, 22 May 2024 18:10:13 +0200 Subject: [PATCH 17/97] minor patches --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 12 +++ .../CGAL/Hyperbolic_isometry_2.h | 4 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 27 +++++- .../Hyperbolic_surface_triangulation_2.txt | 5 +- .../examples.txt | 1 - .../CMakeLists.txt | 5 +- .../example.cpp | 1 + .../example_bis.cpp | 55 ------------ .../CGAL/Hyperbolic_surface_triangulation_2.h | 11 ++- .../hs_test_circular_kernel.cpp | 78 ++++++++++++++++++ .../hs_test_lazy_exact_nt | Bin 0 -> 742000 bytes .../hs_test_lazy_exact_nt.cpp | 76 +++++++++++++++++ .../hs_test_triangulation.cpp | 2 + 13 files changed, 207 insertions(+), 70 deletions(-) delete mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp create mode 100755 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt create mode 100644 Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index c3569f84cda2..7fa652be4225 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -46,21 +46,29 @@ class Hyperbolic_fundamental_domain_2 { /*! Returns the number of vertices (equivalently, the number of sides) of the domain. + + \pre is_valid() */ int size() const; /*! Returns the index-th vertex. + + \pre is_valid() */ Point vertex(int index) const; /*! Returns the index of the side paired to the index-th side. + + \pre is_valid() */ int paired_side(int index) const; /*! Returns the isometry that maps side \f$ \overline A \f$ to side \f$ A \f$, where \f$ A \f$ is the index-th side, and \f$ \overline A \f$ is the side paired to \f$ A \f$. + + \pre is_valid() */ Hyperbolic_isometry_2 side_pairing(int index) const; /// @} @@ -71,6 +79,8 @@ class Hyperbolic_fundamental_domain_2 { Reads the domain from a stream. The format of the input should be the same as the format of the output of the 'from_stream' method. + + \pre is_valid() */ void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); @@ -81,6 +91,8 @@ class Hyperbolic_fundamental_domain_2 { The first line prints the number n of vertices of the domain. For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line. For \f$ i=0 \f$ to \f$ n-1 \f$ the \f$ i \f$-th vertex is printed on a separate line. + + \pre is_valid() */ std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index a8c73af9764a..b88e9e359b5b 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -44,12 +44,12 @@ class Hyperbolic_isometry_2{ void set_to_identity(); /*! - Can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + Can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. */ void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! - Can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + Can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. */ void set_coefficient(int index, const ComplexNumber& coefficient); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 76c4eb40e4ab..eba59c50aa83 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -71,6 +71,8 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Copy constructor. + + \pre other.is_valid() */ Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); /// @} @@ -79,16 +81,22 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Returns the decorated combinatorial map. + + \pre is_valid() */ Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); /*! Tells if the triangulation has an anchor. + + \pre is_valid() */ bool has_anchor() const; /*! - Returns the anchor (if there is one). + Returns the anchor. + + \pre is_valid() && has_anchor() */ Anchor& get_anchor_ref(); /// @} @@ -97,16 +105,27 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! Tells if if the edge supported by the dart is Delaunay flippable. + + \pre is_valid() */ bool is_delaunay_flippable(Dart_handle dart) const; /*! Flips the edge supported by the dart. + + \pre is_valid() */ void flip(Dart_handle dart); + /*! + Determines if the triangulation is a valid Delaunay triangulation. + */ + bool is_delaunay() const; + /*! Applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. + + \pre is_valid() */ int make_delaunay(); /// @} @@ -119,7 +138,7 @@ class Hyperbolic_surface_triangulation_2{ The points \f$ p,q,r \f$ are the vertices of a lift of \f$ t \f$ in the hyperbolic plane. If the center parameter is set to true, then one of the lifted triangles admits the origin \f$ 0 \f$ as a vertex. - \pre This method is to be used only if the triangulation has an anchor. + \pre is_valid() && has_anchor() */ std::vector> lift(bool center=true) const; /// @} @@ -145,12 +164,16 @@ class Hyperbolic_surface_triangulation_2{ If the triangulation has an anchor, then the four next lines print the index of the dart of the anchor, and the three vertices of the anchor. Then, for every triangle \f$ t \f$, the indices of the three darts of \f$ t \f$ are printed on three distinct lines. Finally, for every edge \f$ e \f$, the indices of the two darts of \f$ e \f$ are printed on two distinct lines, followed by a third line on which the cross ratio of \f$ e \f$ is printed. + + \pre is_valid() */ std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); /*! Reads the triangulation from a stream. The format of the input should be the same as the format of the output of the '<<' operator. + + \pre is_valid() */ void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index fd068821b52e..bc2765772210 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -125,11 +125,8 @@ Also, the concept `ComplexWithoutSqrt` describes a complex number type that does \section Section_Hyperbolic_Surface_Triangulations_Example Example -The two examples below generate a convex fundamental domain of a surface of genus two, triangulate the domain, apply the Delaunay flip algorithm to the resulting triangulation, and save and print the Delaunay triangulation. -They use different kernels. +The examples below generates a convex fundamental domain of a surface of genus two, triangulate the domain, apply the Delaunay flip algorithm to the resulting triangulation, and save and print the Delaunay triangulation. \cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} -\cgalExample{Hyperbolic_surface_triangulation_2_Example/example_bis.cpp} - \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index c48df030b1d1..c7e5a40b9501 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,4 +1,3 @@ /*! \example Hyperbolic_surface_triangulation_2_Example/example.cpp -\example Hyperbolic_surface_triangulation_2_Example/example_bis.cpp */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt index 6e6b2ee17394..52eca3058053 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt @@ -24,15 +24,12 @@ if ( NOT Boost_FOUND ) endif() add_executable( example example.cpp ) -add_executable( example_bis example_bis.cpp ) -add_to_cached_list( CGAL_EXECUTABLE_TARGETS example example_bis) +add_to_cached_list( CGAL_EXECUTABLE_TARGETS example) target_link_libraries(example PRIVATE CGAL::CGAL ) -target_link_libraries(example_bis PRIVATE CGAL::CGAL ) set(CMAKE_BUILD_TYPE "Release") ######################################################################### target_include_directories(example PRIVATE ../../include/) -target_include_directories(example_bis PRIVATE ../../include/) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp index 7a19f063fbb6..56048e584208 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp @@ -29,6 +29,7 @@ typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; + int main(){ // Generates the domain: Factory factory = Factory(time(NULL)); diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp deleted file mode 100644 index 533fee88f95b..000000000000 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example_bis.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace CGAL; - -typedef Circular_kernel_2,Algebraic_kernel_for_circles_2_2> Kernel; -typedef Hyperbolic_Delaunay_triangulation_CK_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; -typedef Hyperbolic_surface_triangulation_2 Triangulation; - -int main(){ - // Generates the domain: - Factory factory = Factory(time(NULL)); - Domain domain = factory.generate_domain_g2(); - - // Triangulates the domain: - Triangulation triangulation = Triangulation(domain); - - // Applies the Delaunay flip algorithm to the triangulation: - triangulation.make_delaunay(); - - // Saves the triangulation: - std::ofstream output_file = std::ofstream ("OutputTriangulation.txt"); - output_file << triangulation; - output_file.close(); - - // Prints the triangulation: - std::cout << triangulation << std::endl; - - return 0; -} diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index ccf9ea70e837..4e05a2758077 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -86,9 +86,8 @@ class Hyperbolic_surface_triangulation_2{ bool is_delaunay_flippable(Dart_handle dart) const; void flip(Dart_handle dart); - // Flips Delaunay flippable edges as long as possible + bool is_delaunay() const; int make_delaunay(); - // Returns, for every triangle T of the triangulation, one of the darts of T together with a triple A,B,C of points in the hyperbolic plane. The points A,B,C are the vertices of a a lift of T in the hyperbolic plane. This method is to be used only if the triangulation has an anchor. std::vector> lift(bool center=true) const; bool is_valid() const; @@ -331,6 +330,14 @@ void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ } } +template +bool Hyperbolic_surface_triangulation_2::is_delaunay() const{ + if (! is_valid()){ + return false; + } + return (pick_edge_to_flip() == nullptr); +} + template int Hyperbolic_surface_triangulation_2::make_delaunay(){ int number_of_flips_done = 0; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp new file mode 100644 index 000000000000..876b723b48ec --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -0,0 +1,78 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace CGAL; + +typedef Circular_kernel_2,Algebraic_kernel_for_circles_2_2> Kernel; +typedef Hyperbolic_Delaunay_triangulation_CK_traits_2 ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; + +typedef typename Traits::Hyperbolic_point_2 Point; + +int main() { + Factory factory (3459); + Domain domain = factory.generate_domain_g2(); + Triangulation triangulation0 = Triangulation(domain); + + assert( triangulation0.is_valid() ); + + Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + assert( ! triangulation1.has_anchor() ); + + Triangulation triangulation (triangulation0); + assert( triangulation.has_anchor() ); + + std::stringstream buffer; + buffer << triangulation; + buffer >> triangulation; + + std::vector> input_not_centered; + std::vector> input_centered; + + input_not_centered = triangulation.lift(false); + input_centered = triangulation.lift(); + + triangulation.make_delaunay(); + + assert( triangulation.is_delaunay() ); + + std::vector> output_not_centered; + std::vector> output_centered; + + output_not_centered = triangulation.lift(false); + output_centered = triangulation.lift(); + + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); + Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + assert( cmap.is_dart_used(anchor.dart) ); + + std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt new file mode 100755 index 0000000000000000000000000000000000000000..3d9801056ce293dbd14545721f6fbd32ce2a6bb0 GIT binary patch literal 742000 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½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
Bn_ie~#Wtg`hF}fS6rv^*;js93!l?t^Tk)sebE( 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 Date: Fri, 26 Jul 2024 15:47:12 +0200 Subject: [PATCH 47/97] =?UTF-8?q?Changment=20mineur=20de=20port=C3=A9e=20p?= =?UTF-8?q?our=20des=20usages=20futurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CGAL/Hyperbolic_surface_triangulation_2.h | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index c2469fa9dcd7..860cd27b99b9 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -95,31 +95,33 @@ class Hyperbolic_surface_triangulation_2{ std::vector> lift(bool center=true) const; bool is_valid() const; - -private: - Combinatorial_map_with_cross_ratios _combinatorial_map; - bool _has_anchor = false; - Anchor _anchor; - + + //The following methods are not documented but they are non private for internal future use. + Dart_handle ccw(Dart_handle dart); Dart_handle cw(Dart_handle dart); Dart_handle opposite(Dart_handle dart); Dart_const_handle const_ccw(Dart_const_handle dart) const; Dart_const_handle const_cw(Dart_const_handle dart) const; Dart_const_handle const_opposite(Dart_const_handle dart) const; - + ComplexNumber get_cross_ratio(Dart_const_handle dart) const; + + // Returns the cross ratio of the points a,b,c,d + ComplexNumber cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; + // Returns the point d such that the cross ratio of a,b,c,d is cratio + Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const; + +protected: + Combinatorial_map_with_cross_ratios _combinatorial_map; + bool _has_anchor = false; + Anchor _anchor; Dart_handle pick_edge_to_flip(); Dart_const_handle pick_edge_to_flip() const; void copy_from(Combinatorial_map_with_cross_ratios& cmap); void copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); - - // Returns the cross ratio of the points a,b,c,d - ComplexNumber cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; - // Returns the point d such that the cross ratio of a,b,c,d is cratio - Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const; }; template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); From 572a31b51cb69c96ce732a85c11c16331b2d3776 Mon Sep 17 00:00:00 2001 From: Marc Pouget Date: Wed, 4 Sep 2024 17:01:12 +0200 Subject: [PATCH 48/97] Update Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h Co-authored-by: Andreas Fabri --- .../include/CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index f3a0dbf2b5e4..c6ecb0130f37 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 #define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 -#include "Complex_without_sqrt.h" +#include #include "Hyperbolic_isometry_2.h" #include From 25a42c825e25a1051fa5f8cd6dd22cd6578c5680 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 4 Sep 2024 17:07:22 +0200 Subject: [PATCH 49/97] corrected #include with -#include "Hyperbolic_isometry_2.h" +#include #include #include diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 054719c23f0c..2a9b418cca07 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -15,12 +15,10 @@ #ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 #define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 -#include "Complex_without_sqrt.h" -#include "Hyperbolic_isometry_2.h" -#include "Hyperbolic_fundamental_domain_2.h" - +#include +#include +#include #include - #include namespace CGAL { diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index cc61a323dd6e..b3bc7ad65acc 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_ISOMETRY_2 #define CGAL_HYPERBOLIC_ISOMETRY_2 -#include "Complex_without_sqrt.h" +#include namespace CGAL { diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h index 67081a188d1d..dd90e09935f7 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_Hyperbolic_surface_traits_2 #define CGAL_Hyperbolic_surface_traits_2 -#include "Complex_without_sqrt.h" +#include #include namespace CGAL { diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 860cd27b99b9..74eed291d97c 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -15,10 +15,9 @@ #ifndef CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 #define CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 -#include "Complex_without_sqrt.h" -#include "Hyperbolic_isometry_2.h" -#include "Hyperbolic_fundamental_domain_2.h" - +#include +#include +#include #include #include From 3317a915a5bf74725bb5d762fb8760dd6b7623c4 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 4 Sep 2024 18:12:20 +0200 Subject: [PATCH 50/97] solved Andreas issues in github comments --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 7 +- .../include/CGAL/Hyperbolic_isometry_2.h | 30 ++++---- .../CGAL/Hyperbolic_surface_triangulation_2.h | 68 +++++++++---------- .../hs_test_circular_kernel.cpp | 11 ++- .../hs_test_complex.cpp | 2 +- .../hs_test_domain.cpp | 10 +-- .../hs_test_factory.cpp | 10 +-- .../hs_test_isometry.cpp | 10 +-- .../hs_test_lazy_exact_nt.cpp | 12 ++-- .../hs_test_triangulation.cpp | 12 ++-- 10 files changed, 87 insertions(+), 85 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 31285d07607a..8628de8376ef 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -87,7 +87,7 @@ int Hyperbolic_fundamental_domain_2::size() const{ } template -typename Hyperbolic_fundamental_domain_2::Point Hyperbolic_fundamental_domain_2::vertex(int index) const{ +typename const Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(int index) const{ return _vertices[index]; } @@ -101,7 +101,7 @@ Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pair int n = size(); int paired_index = paired_side(index); - Point p1,p2,q1,q2; + const Point& p1,p2,q1,q2; q1 = vertex(index); q2 = vertex((index+1)%n); p2 = vertex(paired_index); @@ -136,6 +136,9 @@ void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ std::string line; s >> line; int size = std::stoi(line); + _vertices.reserve(size); + _pairings.reserve(size); + for (int k=0; k> line; _pairings.push_back(std::stoi(line)); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index b3bc7ad65acc..096a61447562 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -28,7 +28,7 @@ class Hyperbolic_isometry_2{ public: typedef Hyperbolic_isometry_2 Self; typedef typename Traits::FT FT; - typedef typename Traits::Complex ComplexNumber; + typedef typename Traits::Complex Complex_number; typedef typename Traits::Hyperbolic_point_2 Point; Hyperbolic_isometry_2(); @@ -36,17 +36,17 @@ class Hyperbolic_isometry_2{ void set_to_identity(); // Can be used to set the coefficients manually. Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. - void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); - void set_coefficient(int index, const ComplexNumber& coefficient); + void set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); + void set_coefficient(int index, const Complex_number& coefficient); // Returns the index-th coefficient - ComplexNumber get_coefficient(int index) const; + Complex_number get_coefficient(int index) const; // Evaluates the isometry at point Point evaluate(const Point& point) const; private: - ComplexNumber _coefficients[4]; + Complex_number _coefficients[4]; }; // returns the composition of two isometries. @@ -80,14 +80,14 @@ Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ template void Hyperbolic_isometry_2::set_to_identity(){ - set_coefficients(ComplexNumber(FT(1)), - ComplexNumber(FT(0)), - ComplexNumber(FT(0)), - ComplexNumber(FT(1))); + set_coefficients(Complex_number(FT(1)), + Complex_number(FT(0)), + Complex_number(FT(0)), + Complex_number(FT(1))); } template -void Hyperbolic_isometry_2::set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3){ +void Hyperbolic_isometry_2::set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3){ set_coefficient(0, c0); set_coefficient(1, c1); set_coefficient(2, c2); @@ -95,7 +95,7 @@ void Hyperbolic_isometry_2::set_coefficients(const ComplexNumber& c0, co } template -void Hyperbolic_isometry_2::set_coefficient(int index, const ComplexNumber& coefficient){ +void Hyperbolic_isometry_2::set_coefficient(int index, const Complex_number& coefficient){ _coefficients[index] = coefficient; } @@ -110,10 +110,10 @@ typename Traits::Complex Hyperbolic_isometry_2::get_coefficient(int inde template typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(const Point& point) const{ - ComplexNumber z (point.x(), point.y()); - ComplexNumber numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; - ComplexNumber denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; - ComplexNumber result = numerator_of_the_result / denominator_of_the_result; + Complex_number z (point.x(), point.y()); + Complex_number numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; + Complex_number denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; + Complex_number result = numerator_of_the_result / denominator_of_the_result; return Point(result.real_part(), result.imaginary_part()); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 74eed291d97c..3f16e32a6f96 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -67,7 +67,7 @@ class Hyperbolic_surface_triangulation_2{ typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range; typedef typename Traits::FT Number; - typedef typename Traits::Complex ComplexNumber; + typedef typename Traits::Complex Complex_number; typedef typename Traits::Hyperbolic_point_2 Point; typedef Hyperbolic_isometry_2 Isometry; typedef Hyperbolic_fundamental_domain_2 Domain; @@ -104,12 +104,12 @@ class Hyperbolic_surface_triangulation_2{ Dart_const_handle const_cw(Dart_const_handle dart) const; Dart_const_handle const_opposite(Dart_const_handle dart) const; - ComplexNumber get_cross_ratio(Dart_const_handle dart) const; + Complex_number get_cross_ratio(Dart_const_handle dart) const; // Returns the cross ratio of the points a,b,c,d - ComplexNumber cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; + Complex_number cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; // Returns the point d such that the cross ratio of a,b,c,d is cratio - Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const; + Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const Complex_number& cratio) const; protected: Combinatorial_map_with_cross_ratios _combinatorial_map; @@ -266,11 +266,11 @@ void Hyperbolic_surface_triangulation_2::flip(Dart_handle da Dart_handle e = ccw(d); Dart_handle f = cw(d); - ComplexNumber cross_ratio_AB = get_cross_ratio(e); - ComplexNumber cross_ratio_BC = get_cross_ratio(f); - ComplexNumber cross_ratio_CD = get_cross_ratio(b); - ComplexNumber cross_ratio_DA = get_cross_ratio(c); - ComplexNumber cross_ratio_AC = get_cross_ratio(a); + Complex_number cross_ratio_AB = get_cross_ratio(e); + Complex_number cross_ratio_BC = get_cross_ratio(f); + Complex_number cross_ratio_CD = get_cross_ratio(b); + Complex_number cross_ratio_DA = get_cross_ratio(c); + Complex_number cross_ratio_AC = get_cross_ratio(a); // Modify the anchor @@ -292,12 +292,12 @@ void Hyperbolic_surface_triangulation_2::flip(Dart_handle da // Compute the new cross ratios - ComplexNumber one (Number(1), Number(0)); - ComplexNumber cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one) ; - ComplexNumber cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC) ; - ComplexNumber cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD) ; - ComplexNumber cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC) ; - ComplexNumber cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD) ; + Complex_number one (Number(1), Number(0)); + Complex_number cross_ratio_BD = (cross_ratio_AC) / ((cross_ratio_AC) - one) ; + Complex_number cross_ratio_AB_2 = one - (one - (cross_ratio_AB)) * (cross_ratio_AC) ; + Complex_number cross_ratio_BC_2 = one - (one - (cross_ratio_BC)) / (cross_ratio_BD) ; + Complex_number cross_ratio_CD_2 = one - (one - (cross_ratio_CD)) * (cross_ratio_AC) ; + Complex_number cross_ratio_DA_2 = one - (one - (cross_ratio_DA)) / (cross_ratio_BD) ; // Make the topological flip @@ -396,9 +396,9 @@ std::vector value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); realizations.push_back(value); - ComplexNumber anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); - ComplexNumber anchor_z1 (_anchor.vertices[1].x(), _anchor.vertices[1].y()); - ComplexNumber anchor_z2 (_anchor.vertices[2].x(), _anchor.vertices[2].y()); + Complex_number anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); + Complex_number anchor_z1 (_anchor.vertices[1].x(), _anchor.vertices[1].y()); + Complex_number anchor_z2 (_anchor.vertices[2].x(), _anchor.vertices[2].y()); double weight_of_anchor_dart = CGAL::to_double(anchor_z0.squared_modulus() + anchor_z1.squared_modulus()); double weight_of_ccw_anchor_dart = CGAL::to_double(anchor_z1.squared_modulus() + anchor_z2.squared_modulus()); @@ -424,18 +424,18 @@ std::vector::from_stream(std::is // Load the edges Dart_handle dart_1, dart_2; - ComplexNumber cross_ratio; + Complex_number cross_ratio; for (int k=0; k> line; index1 = std::stoi(line); @@ -644,7 +644,7 @@ typename Hyperbolic_surface_triangulation_2::Dart_const_hand //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ +typename Hyperbolic_surface_triangulation_2::Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } @@ -700,7 +700,7 @@ void Hyperbolic_surface_triangulation_2::copy_from(Combinato for (typename Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it){ Dart_handle dart_1 = darts_table[it]; Dart_handle dart_2 = darts_table[cmap.opposite(it)]; - ComplexNumber cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); + Complex_number cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); _combinatorial_map.template sew<2>(dart_1, dart_2); _combinatorial_map.template set_attribute<1>(dart_1, _combinatorial_map.template create_attribute<1>(cratio)); @@ -720,19 +720,19 @@ void Hyperbolic_surface_triangulation_2::copy_from(Combinato template typename Traits::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const{ - ComplexNumber za (a.x(), a.y()); - ComplexNumber zb (b.x(), b.y()); - ComplexNumber zc (c.x(), c.y()); - ComplexNumber zd (d.x(), d.y()); + Complex_number za (a.x(), a.y()); + Complex_number zb (b.x(), b.y()); + Complex_number zc (c.x(), c.y()); + Complex_number zd (d.x(), d.y()); return (zd-zb)*(zc-za) / ((zd-za)*(zc-zb)); } template -typename Hyperbolic_surface_triangulation_2::Point Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const{ - ComplexNumber za (a.x(), a.y()); - ComplexNumber zb (b.x(), b.y()); - ComplexNumber zc (c.x(), c.y()); - ComplexNumber result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); +typename Hyperbolic_surface_triangulation_2::Point Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const Complex_number& cratio) const{ + Complex_number za (a.x(), a.y()); + Complex_number zb (b.x(), b.y()); + Complex_number zc (c.x(), c.y()); + Complex_number result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); return Point(result.real_part(), result.imaginary_part()); } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index ac182687f71e..da5ab42e2e49 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -1,17 +1,16 @@ +#include +#include +#include +#include #include #include - -#include +#include #include #include #include #include #include -#include -#include -#include -#include using namespace CGAL; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index 4e05b88d0f57..3a78a2016f1e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index 60aecdd76226..bc88953a8d40 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -1,12 +1,12 @@ -#include - -#include -#include -#include #include #include #include +#include +#include +#include +#include + using namespace CGAL; typedef Cartesian Kernel; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index 0bafc0d99671..c38b32e872f3 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -1,13 +1,13 @@ -#include - -#include -#include -#include #include #include #include #include +#include +#include +#include +#include + using namespace CGAL; typedef Cartesian Kernel; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index f22dcfd23073..8d1b31db0d69 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -1,12 +1,12 @@ -#include - -#include -#include -#include #include #include #include +#include +#include +#include +#include + using namespace CGAL; typedef Cartesian Kernel; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index 182c8880f0ca..20d76d79128a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -1,14 +1,14 @@ +#include +#include +#include +#include + #include #include - -#include +#include #include #include #include -#include -#include -#include -#include using namespace CGAL; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index d191c01f2c00..13950bd7727e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -1,15 +1,15 @@ -#include -#include - -#include -#include -#include #include #include #include #include #include +#include +#include +#include +#include +#include + using namespace CGAL; typedef Cartesian Kernel; From 68813dce38e5ee948dfc04f6cd028586a662f8bf Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 4 Sep 2024 18:30:55 +0200 Subject: [PATCH 51/97] corrected last commit after compiling test --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_fundamental_domain_2.h | 14 +++++++------- .../hs_test_lazy_exact_nt | Bin 406128 -> 216832 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 42f8a9fddfc2..fd0d541c88f0 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -51,7 +51,7 @@ class Hyperbolic_fundamental_domain_2 { \pre is_valid() */ - Point vertex(int i) const; + const Point& vertex(int i) const; /*! returns the index of the side paired to the \f$ i \f$-th side. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 8628de8376ef..43929bcc8380 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -44,7 +44,7 @@ class Hyperbolic_fundamental_domain_2 { typename std::vector::iterator plast); int size() const; // Returns the number of vertices (equivalently, the number of sides) - Point vertex(int index) const; // Returns the index-th vertex + const Point& vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B @@ -87,7 +87,7 @@ int Hyperbolic_fundamental_domain_2::size() const{ } template -typename const Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(int index) const{ +const typename Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(int index) const{ return _vertices[index]; } @@ -101,11 +101,11 @@ Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pair int n = size(); int paired_index = paired_side(index); - const Point& p1,p2,q1,q2; - q1 = vertex(index); - q2 = vertex((index+1)%n); - p2 = vertex(paired_index); - p1 = vertex((paired_index+1)%n); + //const Point& p1,p2,q1,q2; + const Point& q1 = vertex(index); + const Point& q2 = vertex((index+1)%n); + const Point& p2 = vertex(paired_index); + const Point& p1 = vertex((paired_index+1)%n); Hyperbolic_isometry_2 isom = isometry_pairing_the_sides(p1,p2,q1,q2); return isom; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 1ff5ce9a778469010a03ca030abe2eb9cd3473ec..1df550c6251df09bb50f012c22d396f4ecb8f502 100755 GIT binary patch literal 216832 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 literal 406128 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
@@ -66,7 +66,8 @@ Such octagons are described in \cgalCite{aigon2005hyperbolic}. \subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Domains Data structure for domains We represent every domain as a polygon in the Poincaré disk, given by the list of its vertices, and by the list of its side pairings. -Concerning the generation of domains, in order to perform fast and exact computations with the domains generated, every vertex must be a complex number whose type supports fast and exact computations. +Concerning the generation of domains, in order to perform fast and exact +computations with the generated domains, every vertex must be a complex number whose type supports fast and exact computations. Under this constraint, it is not known how to generate domains of surfaces of genus greater than two. In genus two, this package generates domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. @@ -101,7 +102,7 @@ This definition is equivalent to the usual "empty disk" formulation. Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. This operation is called a Delaunay flip. -When a flip occurs, the cross ratios of the edges involved are modified via simple formulas. +When a flip occurs, the cross ratios of the involved edges are modified via simple formulas. The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cgalCite{despre2020flipping}. @@ -109,7 +110,7 @@ This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cg The package contains three main classes: -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a hyperbolic surface. It offers functionalities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a hyperbolic surface. It offers functionalities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm and the construction of a portion of the lift of the triangulation in the Poincaré disk. - `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a hyperbolic surface. @@ -117,23 +118,23 @@ The package contains three main classes: The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. -Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2` : it is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and is modeled by `CGAL::Hyperbolic_surface_traits_2`. -Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root : it is modeled by `CGAL::Complex_without_sqrt`. +Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2`, it is a refinement of `HyperbolicDelaunayTriangulationTraits_2` and is modeled by `CGAL::Hyperbolic_surface_traits_2`. +Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root: it is modeled by `CGAL::Complex_without_sqrt`. \section Section_Hyperbolic_Surface_Triangulations_Example Example -The examples below generates a convex fundamental domain of a surface of genus two, triangulate the domain, apply the Delaunay flip algorithm to the resulting triangulation, and save and print the Delaunay triangulation. -\cgalExample{Hyperbolic_surface_triangulation_2/example.cpp} +The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation. +\cgalExample{Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker, and Monique Teillaud in \cgalCite{despre2020flipping} (with a different data structure for representing triangulations, see \cgalCite{despre2022experimental}). It also implements the generation of domains described by Vincent Despré, Loïc Dubois, Benedikt Kolbe, and Monique Teillaud in \cgalCite{despre2022experimental}, based on results of Aline Aigon-Dupuy, Peter Buser, Michel Cibils, Alfred F Künzle, and Frank Steiner \cgalCite{aigon2005hyperbolic}. The code and the documentation of the package were written by Loïc Dubois, under regular discussions with Vincent Despré and Monique Teillaud. -The authors aknowledge support from the grants SoS and MIN-MAX of the French National Research Agency ANR. +The authors acknowledge support from the grants SoS and MIN-MAX of the French National Research Agency ANR. */ } /* namespace CGAL */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index 91f2dba7f06b..dc5d0c13a1c6 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,3 +1,3 @@ /*! -\example Hyperbolic_surface_triangulation_2/example.cpp +\example Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation.cpp */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain deleted file mode 100644 index 1e215f909937..000000000000 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain +++ /dev/null @@ -1,10 +0,0 @@ -8 -4 -5 -6 -7 -0 -1 -2 -3 -8699/10000 0/11861/10000 1733/2500-3377/10000 9003/10000-6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 5223442426846244308918986056775777360051/9940656140785426707445141474848966485000-8699/10000 0/1-1861/10000 -1733/25003377/10000 -9003/100006620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/9940656140785426707445141474848966485000 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation deleted file mode 100644 index 78b05054ac81..000000000000 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation +++ /dev/null @@ -1,58 +0,0 @@ -18 -0 -2 -1 -3 -5 -4 -6 -8 -7 -9 -11 -10 -12 -14 -13 -15 -17 -16 -0 -10 -31506456736405903020370389752002223618739050934773356476494603930661888400247155106521882837735915590914302367561251569996069054771/19666908619024398748661111194680998812161200490089420512800226939763143826288426638968195633548351364196902255728000484168455372921 --10942036471875720789661373633987476000278817326569744001031482740881162495813282774078651622772378927112795054222078631808380976570/19666908619024398748661111194680998812161200490089420512800226939763143826288426638968195633548351364196902255728000484168455372921 -1 -13 -781495798070627006240716806122025726923037870049911391732354523001194837454202883145862222364700736/518959061964181593065228471522802585455159787087527619446826772869615047041589398927831625454753875 --189371139005493597405801850741198856424898333894357777815345725964528561388869334334384331324813952/518959061964181593065228471522802585455159787087527619446826772869615047041589398927831625454753875 -2 -3 -33170177440464786037472229658217437089162532200904069/28653081009409190506186758645478542974247822783293428 --2881683164465598049360620044098315562600796282921627/28653081009409190506186758645478542974247822783293428 -4 -16 -4968299124723638747470108984820672788583954090330933476742557608662529252342845259348637207946588/1092723322016120716697135186936420972199720229313106050600294971658808361779690253357358402590801 --3710777211174814069803263597089707253605910565291672515132945250011055487415185079146286040277016/1092723322016120716697135186936420972199720229313106050600294971658808361779690253357358402590801 -5 -6 -6868196145384959604496666901710238377850723465006792196291575673905052618260753468991653/4512179813278917894620980641174220845204410724290139615197173368381108374974869947312900 -992966786892819982858568422190986341410307226998576345153711088722823043609105491013523/2256089906639458947310490320587110422602205362145069807598586684190554187487434973656450 -7 -17 -3838745443937089205797672579622610574940724000512580094354841231935859013368227074455133372479862872729051776/2792774644075839789079825641406262199694380590959140310513183122642864419113366392739524183043200248176025425 --419917553322016960246338861059632699136082144146026079734688609648112002646459230291767354514634912767695018/2792774644075839789079825641406262199694380590959140310513183122642864419113366392739524183043200248176025425 -8 -9 -3114766427122699665246846787487231099217947976229375660284921270902534685298858968767852/1436580578422650900222988739384048912302018101193137102559185467556416740710493104427325 --480178213698279712120970016846476821429655020078205232858939611692290690401563240567064/1436580578422650900222988739384048912302018101193137102559185467556416740710493104427325 -11 -12 -3653219555667964529773235938987407912652506426196655912731639432265479411967/862105622530160440533988544608093897509008327675550103459967993437704876759 -821928388597754697723656111158999167770322913806691357525165361068978224664/862105622530160440533988544608093897509008327675550103459967993437704876759 -14 -15 -367972160625745498381781337885902553624408780293807/155993853182239792548992915927181900401134875092556 --203686408962208932751841465532884383690422013015937/155993853182239792548992915927181900401134875092556 -yes -0 -6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/99406561407854267074451414748489664850008699/10000 0/11861/10000 1733/2500 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation deleted file mode 100644 index b770eeab7fb3..000000000000 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation +++ /dev/null @@ -1,58 +0,0 @@ -18 -0 -2 -1 -3 -14 -11 -4 -6 -7 -5 -12 -9 -8 -13 -10 -15 -17 -16 -0 -10 -1410000724299332371389937532179569909345394144843007514025660414206229132158133286943374347183749/943206938456426848032579404146903758988585847142955614923216948450820533926886687932406897458693 --378203855070776132981855592240576514546653804754149596779405444218184870104170008110986172602592/943206938456426848032579404146903758988585847142955614923216948450820533926886687932406897458693 -1 -13 -19887196285155362006559791529168511521878079992153762798320374740982268112117465118536/5695659538440479945688231745469228747738456347456028770029769144745558792211768848325 --2020047788855743957716975831845108354598311318683179072501379587874312874979490668184/1898553179480159981896077248489742915912818782485342923343256381581852930737256282775 -2 -3 -6952553306127437081538854938783858191628119902512172/3553986791555825582432866732054454794023091951404233 --117683685598659097344156110122051960107612839281662/3553986791555825582432866732054454794023091951404233 -4 -16 -69055447624598675510761206497378089755596880628450190282835993738602955377822671504/23082064347185302307994922894443016398172531426943122529923903901597058083720283433 --16510233578563126183381484406110441677273046112784347381826830384078313894030637328/23082064347185302307994922894443016398172531426943122529923903901597058083720283433 -5 -6 -1049144868836174810155855532588462544991770341294219/565066778411545262213703803259792733610830505412100 --973666829727979576537068308912339823765071013691099/1695200335234635786641111409779378200832491516236300 -7 -17 -9594373718491727209904832762705261976898972860619142190311548079277408483/5863591293207692876668472708486555803276952920809286612220352693895622500 --93858350255859857801320495515080557659316462466407550282076592733768086/1465897823301923219167118177121638950819238230202321653055088173473905625 -8 -9 -6952553306127437081538854938783858191628119902512172/3553986791555825582432866732054454794023091951404233 --117683685598659097344156110122051960107612839281662/3553986791555825582432866732054454794023091951404233 -11 -12 -164145601358763061887064511271541162016808441468505801711118339937019152090722212948967560/116314153246275137925667195759016871345997882528619966514696077675729394736390029357319321 --18086731335787069646367071980123057612042140519705630245572530376682480852944621571599400/116314153246275137925667195759016871345997882528619966514696077675729394736390029357319321 -14 -15 -1049144868836174810155855532588462544991770341294219/565066778411545262213703803259792733610830505412100 --973666829727979576537068308912339823765071013691099/1695200335234635786641111409779378200832491516236300 -yes -0 -6620276339844812256389212388959426672663/9940656140785426707445141474848966485000 -5223442426846244308918986056775777360051/99406561407854267074451414748489664850008699/10000 0/11861/10000 1733/2500 \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 976238af9292..84de9bde3036 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -10,25 +10,22 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -#include +#include #include #include #include #include #include #include - #include using namespace CGAL; - -typedef Simple_cartesian Kernel; -typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surface_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; -typedef Hyperbolic_surface_triangulation_2 Triangulation; - +typedef Simple_cartesian Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; +typedef Hyperbolic_surface_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; int main(){ // Generates the domain: From 9b8db60880b0f699ebd7c18fbac7365c4d9b545c Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 6 Sep 2024 13:39:56 +0200 Subject: [PATCH 54/97] doc detail bug --- .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../doc/Hyperbolic_surface_triangulation_2/examples.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 8c7a1a5385ba..17a0021af6d5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -127,7 +127,7 @@ Also, the concept `ComplexWithoutSqrt` describes a complex number type that does \section Section_Hyperbolic_Surface_Triangulations_Example Example The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation. -\cgalExample{Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation.cpp} +\cgalExample{Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index dc5d0c13a1c6..1b3c6c47dbc5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,3 +1,3 @@ /*! -\example Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation.cpp +\example Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp */ From 66c9872978c4c3bec5c2e551452014cf32203ec7 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 6 Sep 2024 14:38:32 +0200 Subject: [PATCH 55/97] doc details 2 --- .../Concepts/ComplexWithoutSqrt.h | 18 +++++++++--------- .../Concepts/HyperbolicSurfacesTraits_2.h | 4 ++-- .../hyperbolic_surface_triangulation.cpp | 12 ------------ 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h index c67826057021..0b52c080712f 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h @@ -40,22 +40,22 @@ class ComplexWithoutSqrt { /// \name Get and set /// @{ /*! - Sets the real part to real_part . + sets the real part to real_part . */ void set_real_part(const FT& real_part); /*! - Sets the imaginary part to imaginary_part . + sets the imaginary part to imaginary_part . */ void set_imaginary_part(const FT& imaginary_part); /*! - Returns the real part. + returns the real part. */ FT real_part() const; /*! - Returns the imaginary part. + returns the imaginary part. */ FT imaginary_part() const; /// @} @@ -63,12 +63,12 @@ class ComplexWithoutSqrt { /// \name Operations /// @{ /*! - Returns the square of the modulus. + returns the square of the modulus. */ FT squared_modulus() const; /*! - Returns the conjugate. + returns the conjugate. */ ComplexWithoutSqrt conjugate() const; @@ -83,7 +83,7 @@ class ComplexWithoutSqrt { ComplexWithoutSqrt operator-(const ComplexWithoutSqrt& other) const; /*! - Returns the opposite. + returns the opposite. */ ComplexWithoutSqrt operator-() const; @@ -106,11 +106,11 @@ class ComplexWithoutSqrt { */ bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); /*! - Writes the complex in a stream. + writes the complex in a stream. */ std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); /*! - Reads the complex from a stream. + reads the complex from a stream. */ void operator>>(std::istream& s, Complex_without_sqrt& z); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index 773dd4270fe3..99491024c6d7 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -17,11 +17,11 @@ class HyperbolicSurfacesTraits_2 { */ typedef unspecified_type FT; /*! - Represents a point in the Poincaré disk model of the hyperbolic plane. + represents a point in the Poincaré disk model of the hyperbolic plane. */ typedef unspecified_type Hyperbolic_point_2; /*! - Represents a complex number over a field: must be a model of ComplexWithoutSqrt. + represents a complex number over a field: must be a model of ComplexWithoutSqrt. */ typedef unspecified_type Complex; /// @} diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 84de9bde3036..211858dabaa7 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include #include From 9f68df9a3236fa4b0132674cb8ede87958b6b7c0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 13:38:02 +0100 Subject: [PATCH 56/97] Fix for CI ? --- .../demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt index e0d9a639e31a..d40f18d832df 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.15) -project( Hyperbolic_surface_triangulation_2_demo ) +project( Hyperbolic_surface_triangulation_2_Demo ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) From fe0e6e2fbf7f0754685f47b6a80e64a34ab5ae36 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 14:05:26 +0100 Subject: [PATCH 57/97] Fix example --- .../hyperbolic_surface_triangulation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 211858dabaa7..ff4c1ccd228f 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -8,7 +8,7 @@ #include using namespace CGAL; -typedef Simple_cartesian Kernel; +typedef Simple_cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; From d6d576fa5afffaf61f208c50129775f691a96c79 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 14:24:51 +0100 Subject: [PATCH 58/97] No blank before : --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_isometry_2.h | 10 +++++----- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../PackageDescription.txt | 2 +- .../hyperbolic_surface_triangulation.cpp | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index fc2b2d9ee77d..12db7d96e6b3 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -9,7 +9,7 @@ together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_2 { diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 0eb2756c7dfd..de01c9779c46 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -5,7 +5,7 @@ namespace CGAL{ Factory class, whose purpose is to generate some convex domains of surfaces of genus two. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_factory_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 33cfa4e54bdc..d477058634e6 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -9,7 +9,7 @@ so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_isometry_2{ @@ -40,16 +40,16 @@ class Hyperbolic_isometry_2{ /*! can be used to set the coefficients of the isometry manually. \note Be - careful when doing so : the implementation does not check that the - resulting Möbius transform fixes the unit circle. + careful when doing so: the implementation does not check that the + resulting Möbius transform fixes the unit circle. */ void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! can be used to set one coefficient of the isometry manually. \note Be - careful when doing so : the implementation does not check that the - resulting Möbius transform fixes the unit circle. + careful when doing so: the implementation does not check that the + resulting Möbius transform fixes the unit circle. */ void set_coefficient(int index, const ComplexNumber& coefficient); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 93ff5107ad82..4744e709ede1 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -7,7 +7,7 @@ namespace CGAL{ This item defines attributes of edges that are `Complex_without_sqrt` reprensenting cross-ratios. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). \cgalModels{GenericMapItems} */ @@ -29,9 +29,9 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). -\tparam Attributes must be a model of `GenericMapItems` (default model : `Combinatorial_map_with_cross_ratios_item`). +\tparam Attributes must be a model of `GenericMapItems` (default model: `Combinatorial_map_with_cross_ratios_item`). */ template> class Hyperbolic_surface_triangulation_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 17a0021af6d5..4671d62f2677 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -24,7 +24,7 @@ A triangulation of a surface can be generated from a convex fundamental domain o We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable: this is without further mention. -The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi : \mathbb{D} \to S \f$ is a (local) isometry. +The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi: \mathbb{D} \to S \f$ is a (local) isometry. The pre-image set \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. We usually denote by \f$ \widetilde x \f$ a lift of \f$ x \f$. Paths and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 4e8b43fa38fd..c0dabb130300 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -51,6 +51,6 @@ - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. -Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided : `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_without_sqrt`. +Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided: `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_without_sqrt`. */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index ff4c1ccd228f..d2e4043909d7 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -8,7 +8,7 @@ #include using namespace CGAL; -typedef Simple_cartesian Kernel; +typedef Simple_cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; From 81147219e2cf3ec8e5f885e3b5e427593c6716a0 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 14:32:57 +0100 Subject: [PATCH 59/97] untabify --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 6 +++--- .../CGAL/Hyperbolic_fundamental_domain_2.h | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 12db7d96e6b3..d4beed007381 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -32,9 +32,9 @@ class Hyperbolic_fundamental_domain_2 { Constructor from vertices and side pairings interators. */ Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast); + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast); /// @} /// \name Access functions diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index e35e31bbe332..17c87b1d4e8d 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -39,10 +39,10 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast); - + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast); + int size() const; // Returns the number of vertices (equivalently, the number of sides) const Point& vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side @@ -72,9 +72,9 @@ template template Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast){ + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast){ _vertices = std::vector(vfirst, vlast); _pairings = std::vector(pfirst, plast); } @@ -139,7 +139,7 @@ std::istream& Hyperbolic_fundamental_domain_2::from_stream(std::istream& int size = std::stoi(line); _vertices.reserve(size); _pairings.reserve(size); - + for (int k=0; k> line; _pairings.push_back(std::stoi(line)); From 0901049cbf6a4becc83d648ab173728c2ff95d6b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 14:44:45 +0100 Subject: [PATCH 60/97] trailing whitespace --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../include/CGAL/Hyperbolic_surface_triangulation_2.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 7bd988718225..be3d3c3dc95a 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -68,7 +68,7 @@ Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_f template Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ - + bool is_domain_generated = false; _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 860027ff1fba..eb93cc8867ed 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -94,18 +94,18 @@ class Hyperbolic_surface_triangulation_2{ std::vector> lift(bool center=true) const; bool is_valid() const; - + //The following methods are not documented but they are non private for internal future use. - + Dart_handle ccw(Dart_handle dart); Dart_handle cw(Dart_handle dart); Dart_handle opposite(Dart_handle dart); Dart_const_handle const_ccw(Dart_const_handle dart) const; Dart_const_handle const_cw(Dart_const_handle dart) const; Dart_const_handle const_opposite(Dart_const_handle dart) const; - + Complex_number get_cross_ratio(Dart_const_handle dart) const; - + // Returns the cross ratio of the points a,b,c,d Complex_number cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; // Returns the point d such that the cross ratio of a,b,c,d is cratio From b74681e1e5adba1083cae44ee1f697b3caa4aa5d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Sun, 8 Sep 2024 15:12:12 +0100 Subject: [PATCH 61/97] Fix file name --- ...perbolic_surfaces_traits_2.h => Hyperbolic_surface_traits_2.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/{Hyperbolic_surfaces_traits_2.h => Hyperbolic_surface_traits_2.h} (100%) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h similarity index 100% rename from Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h rename to Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h From 94fc57335a011058a6ecd85ade57a526cc8ff901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 9 Sep 2024 09:14:26 +0200 Subject: [PATCH 62/97] fix deps --- .../package_info/Hyperbolic_surface_triangulation_2/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies index 0902e1798f1a..2a2367b57104 100644 --- a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -10,6 +10,7 @@ Distance_3 Filtered_kernel Hash_map Homogeneous_kernel +Hyperbolic_surface_triangulation_2 Installation Intersections_2 Intersections_3 From ef6056fb7f0f350bcd00225bfcdbdf5d23ea142d Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 9 Sep 2024 11:15:55 +0100 Subject: [PATCH 63/97] delaunay -> Delaunay --- .../Hyperbolic_surface_triangulation_2_demo.cpp | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- .../hyperbolic_surface_triangulation.cpp | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 16 ++++++++-------- .../dependencies | 1 + .../hs_test_circular_kernel.cpp | 4 ++-- .../hs_test_lazy_exact_nt.cpp | 4 ++-- .../hs_test_triangulation.cpp | 4 ++-- 8 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp index f2a745131208..57a8e8c47cf6 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp @@ -38,7 +38,7 @@ int main(int argc, char** argv){ Factory factory = Factory(time(NULL)); Domain domain = factory.generate_domain_g2(); Triangulation triangulation = Triangulation(domain); - triangulation.make_delaunay(); + triangulation.make_Delaunay(); // 2. Draw the triangulation QApplication app(argc, argv); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 4744e709ede1..bd468cd10853 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -126,7 +126,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() */ - bool is_delaunay_flippable(Dart_handle dart) const; + bool is_Delaunay_flippable(Dart_handle dart) const; /*! flips the edge supported by the dart. @@ -138,14 +138,14 @@ class Hyperbolic_surface_triangulation_2{ /*! determines if the triangulation is a valid Delaunay triangulation. */ - bool is_delaunay() const; + bool is_Delaunay() const; /*! applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. \pre is_valid() */ - int make_delaunay(); + int make_Delaunay(); /// @} /// \name Lifting diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index d2e4043909d7..8bcdbdae4cfd 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -24,7 +24,7 @@ int main(){ Triangulation triangulation = Triangulation(domain); // Applies the Delaunay flip algorithm to the triangulation: - triangulation.make_delaunay(); + triangulation.make_Delaunay(); // Saves the triangulation: std::ofstream output_file = std::ofstream ("OutputTriangulation.txt"); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index eb93cc8867ed..2f7cb5b97f60 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -87,10 +87,10 @@ class Hyperbolic_surface_triangulation_2{ void to_stream(std::ostream& s) const; void from_stream(std::istream& s); - bool is_delaunay_flippable(Dart_const_handle dart) const; + bool is_Delaunay_flippable(Dart_const_handle dart) const; void flip(Dart_handle dart); - bool is_delaunay() const; - int make_delaunay(); + bool is_Delaunay() const; + int make_Delaunay(); std::vector> lift(bool center=true) const; bool is_valid() const; @@ -248,7 +248,7 @@ Hyperbolic_surface_triangulation_2::anchor(){ //////////////////////////////////////////////////////////////////////////////// template -bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_const_handle dart) const{ +bool Hyperbolic_surface_triangulation_2::is_Delaunay_flippable(Dart_const_handle dart) const{ return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); } @@ -337,7 +337,7 @@ void Hyperbolic_surface_triangulation_2::flip(Dart_handle da } template -bool Hyperbolic_surface_triangulation_2::is_delaunay() const{ +bool Hyperbolic_surface_triangulation_2::is_Delaunay() const{ if (! is_valid()){ return false; } @@ -345,7 +345,7 @@ bool Hyperbolic_surface_triangulation_2::is_delaunay() const } template -int Hyperbolic_surface_triangulation_2::make_delaunay(){ +int Hyperbolic_surface_triangulation_2::make_Delaunay(){ int number_of_flips_done = 0; Dart_handle edge_to_flip = pick_edge_to_flip(); @@ -652,7 +652,7 @@ template typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ - if ( is_delaunay_flippable(it) ){ + if ( is_Delaunay_flippable(it) ){ return it; } } @@ -665,7 +665,7 @@ template typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ const auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ - if ( is_delaunay_flippable(it) ){ + if ( is_Delaunay_flippable(it) ){ return it; } } diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies index 2a2367b57104..27d3af53e19c 100644 --- a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -24,3 +24,4 @@ Property_map Random_numbers STL_Extension Stream_support +Hyperbolic_triangulation_2 diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index da5ab42e2e49..377a541130f9 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -46,9 +46,9 @@ int main() { input_not_centered = triangulation.lift(false); input_centered = triangulation.lift(); - triangulation.make_delaunay(); + triangulation.make_Delaunay(); - assert( triangulation.is_delaunay() ); + assert( triangulation.is_Delaunay() ); std::vector> output_not_centered; std::vector> output_centered; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index 20d76d79128a..bd115e5b24e0 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -44,9 +44,9 @@ int main() { input_not_centered = triangulation.lift(false); input_centered = triangulation.lift(); - triangulation.make_delaunay(); + triangulation.make_Delaunay(); - assert( triangulation.is_delaunay() ); + assert( triangulation.is_Delaunay() ); std::vector> output_not_centered; std::vector> output_centered; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index 13950bd7727e..3cf06670d67e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -63,9 +63,9 @@ int main() { input_not_centered = triangulation.lift(false); input_centered = triangulation.lift(); - triangulation.make_delaunay(); + triangulation.make_Delaunay(); - assert( triangulation.is_delaunay() ); + assert( triangulation.is_Delaunay() ); std::vector> output_not_centered; std::vector> output_centered; From cb258c8c502d924a7d7546241932bbf64ce5c1c4 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 9 Sep 2024 11:28:25 +0100 Subject: [PATCH 64/97] Remove 'can be used' --- .../CGAL/Hyperbolic_isometry_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index d477058634e6..8de3f15ea0d7 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -39,7 +39,7 @@ class Hyperbolic_isometry_2{ void set_to_identity(); /*! - can be used to set the coefficients of the isometry manually. \note Be + sets the coefficients of the isometry manually. \note Be careful when doing so: the implementation does not check that the resulting Möbius transform fixes the unit circle. @@ -47,7 +47,7 @@ class Hyperbolic_isometry_2{ void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! - can be used to set one coefficient of the isometry manually. \note Be + sets a particular coefficient of the isometry manually. \note Be careful when doing so: the implementation does not check that the resulting Möbius transform fixes the unit circle. From 6557673d67c258913e0b405061e60dc27d56eb46 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 9 Sep 2024 11:31:11 +0100 Subject: [PATCH 65/97] Remove using namespace CGAL --- .../hyperbolic_surface_triangulation.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 8bcdbdae4cfd..61babd60268b 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -7,13 +7,13 @@ #include #include -using namespace CGAL; -typedef Simple_cartesian Kernel; -typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surface_traits_2 Traits; -typedef Hyperbolic_fundamental_domain_2 Domain; -typedef Hyperbolic_fundamental_domain_factory_2 Factory; -typedef Hyperbolic_surface_triangulation_2 Triangulation; +typedef CGAL::Exact_rational Rational; +typedef CGAL::Simple_cartesian Kernel; +typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; +typedef CGAL::Hyperbolic_surface_traits_2 Traits; +typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; +typedef CGAL::Hyperbolic_fundamental_domain_factory_2 Factory; +typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; int main(){ // Generates the domain: From 009dbcaa6ebe3a993f66147272d29bef3c1e89cb Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 9 Sep 2024 11:38:33 +0100 Subject: [PATCH 66/97] HyperbolicSurfaces -> HyperbolicSurface --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_traits_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 4 ++-- ...perbolicSurfacesTraits_2.h => HyperbolicSurfaceTraits_2.h} | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../Hyperbolic_surface_triangulation_2/PackageDescription.txt | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) rename Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/{HyperbolicSurfacesTraits_2.h => HyperbolicSurfaceTraits_2.h} (95%) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index d4beed007381..630fc4736c81 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -9,7 +9,7 @@ together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_2 { diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index de01c9779c46..8d0eb869a787 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -5,7 +5,7 @@ namespace CGAL{ Factory class, whose purpose is to generate some convex domains of surfaces of genus two. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_factory_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 8de3f15ea0d7..56750a72e8b0 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -9,7 +9,7 @@ so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_isometry_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h index 26e33717bb04..05324186776e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h @@ -5,7 +5,7 @@ namespace CGAL{ \tparam HyperbolicTraitsClass must be a model of `HyperbolicDelaunayTriangulationTraits_2`. -\cgalModels{HyperbolicSurfacesTraits_2} +\cgalModels{HyperbolicSurfaceTraits_2} */ template class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index bd468cd10853..c95b200fdc1c 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -7,7 +7,7 @@ namespace CGAL{ This item defines attributes of edges that are `Complex_without_sqrt` reprensenting cross-ratios. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). \cgalModels{GenericMapItems} */ @@ -29,7 +29,7 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). \tparam Attributes must be a model of `GenericMapItems` (default model: `Combinatorial_map_with_cross_ratios_item`). */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h similarity index 95% rename from Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h rename to Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h index 99491024c6d7..7a7ebad6b89e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h @@ -8,7 +8,7 @@ \cgalHasModels{CGAL::Hyperbolic_surface_traits_2} \cgalHasModelsEnd */ -class HyperbolicSurfacesTraits_2 { +class HyperbolicSurfaceTraits_2 { public: /// \name Types /// @{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 4671d62f2677..cf7a22527106 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -118,7 +118,7 @@ The package contains three main classes: The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. -Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2`, it is a refinement of `HyperbolicDelaunayTriangulationTraits_2` and is modeled by `CGAL::Hyperbolic_surface_traits_2`. +Most classes of the package are templated by the concept `HyperbolicSurfaceTraits_2`, it is a refinement of `HyperbolicDelaunayTriangulationTraits_2` and is modeled by `CGAL::Hyperbolic_surface_traits_2`. Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root: it is modeled by `CGAL::Complex_without_sqrt`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index c0dabb130300..d5cb2c2b2f3a 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -38,7 +38,7 @@ \cgalCRPSection{Concepts} -- `HyperbolicSurfacesTraits_2` is the concept for the template parameter of most classes of the package. +- `HyperbolicSurfaceTraits_2` is the concept for the template parameter of most classes of the package. - `ComplexWithoutSqrt` describes a complex number type that does not use square root. \cgalCRPSection{Classes} @@ -51,6 +51,6 @@ - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. -Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided: `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_without_sqrt`. +Models for `HyperbolicSurfaceTraits_2` and `ComplexWithoutSqrt` are provided: `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_without_sqrt`. */ From b4264b5ba4464e3a5e832f42e0a7cd72920e1165 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Mon, 9 Sep 2024 15:13:45 +0200 Subject: [PATCH 67/97] Corrections of Andreas review --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 12 ++++---- .../Concepts/HyperbolicSurfacesTraits_2.h | 8 ------ .../CGAL/Hyperbolic_fundamental_domain_2.h | 27 +++++++++--------- .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- .../hs_test_domain.cpp | 4 +-- .../hs_test_lazy_exact_nt | Bin 216832 -> 216856 bytes .../hs_test_triangulation.cpp | 2 +- 8 files changed, 25 insertions(+), 32 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index d4beed007381..bfdf77fd8fae 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -7,7 +7,7 @@ Represents a fundamental domain of a closed orientable hyperbolic surface. The domain is given as a polygon \f$ P \f$ represented by the list of its vertices in the Poincaré disk model, together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. -The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. +The side pairings are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. \tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ @@ -29,12 +29,12 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); /*! - Constructor from vertices and side pairings interators. + Constructor from vertices and pairings ranges. + @tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is Point. + @tparam PairingRange a model of the concepts `RandomAccessContainer` whose `value_type` is int. */ - Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast); + template + Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings); /// @} /// \name Access functions diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index 99491024c6d7..6789d0711aba 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -12,14 +12,6 @@ class HyperbolicSurfacesTraits_2 { public: /// \name Types /// @{ - /*! - Field type. - */ - typedef unspecified_type FT; - /*! - represents a point in the Poincaré disk model of the hyperbolic plane. - */ - typedef unspecified_type Hyperbolic_point_2; /*! represents a complex number over a field: must be a model of ComplexWithoutSqrt. */ diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 17c87b1d4e8d..c37c1a006804 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -38,11 +38,15 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); - Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast); - + /* template */ + /* Hyperbolic_fundamental_domain_2(PointRange vertices, */ + /* PairingRange pairings); */ + template + Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings){ + _vertices = std::vector(vertices.begin(), vertices.end()); + _pairings = std::vector(pairings.begin(), pairings.end()); + } + int size() const; // Returns the number of vertices (equivalently, the number of sides) const Point& vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side @@ -70,14 +74,11 @@ template std::istream& operator>>(std::istream& s, Hyperbolic_fund template Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(){} -template - Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast){ - _vertices = std::vector(vfirst, vlast); - _pairings = std::vector(pfirst, plast); - } +/* template */ +/* Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings){ */ +/* _vertices = std::vector(vertices.begin(), vertices.end()); */ +/* _pairings = std::vector(pairings.begin(), pairings.end()); */ +/* } */ //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index be3d3c3dc95a..6e5441e8f66d 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -114,7 +114,7 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2< pairings.push_back((k+4)%8); } - Hyperbolic_fundamental_domain_2 domain(vertices.begin(), vertices.end(), pairings.begin(), pairings.end()); + Hyperbolic_fundamental_domain_2 domain(vertices, pairings); return domain; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index eb93cc8867ed..b345602a89de 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -83,7 +83,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; Anchor& anchor(); - + void to_stream(std::ostream& s) const; void from_stream(std::istream& s); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index bc88953a8d40..3cbf0ecabb79 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -43,7 +43,7 @@ int main() { pairings.push_back((k+4)%8); } - Domain domain = Domain(vertices.begin(),vertices.end(),pairings.begin(),pairings.end()); + Domain domain = Domain(vertices, pairings); assert( domain.size()==8 ); for (int k=0; k<8; k++){ assert( domain.vertex(k)==vertices[k] ); @@ -55,7 +55,7 @@ int main() { assert( domain.is_valid() ); - Domain domain_prime = Domain(vertices.begin(),vertices.end(),pairings.begin(),pairings.end());; + Domain domain_prime = Domain(vertices, pairings); assert( domain_prime.size()==8 ); for (int k=0; k<8; k++){ assert( domain_prime.vertex(k)==vertices[k]); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 1df550c6251df09bb50f012c22d396f4ecb8f502..99514d0aa9fc96d659d64f84a1080cdb06628c39 100755 GIT binary patch delta 18931 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 delta 18989 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 Date: Mon, 9 Sep 2024 18:07:11 +0200 Subject: [PATCH 68/97] hopefully last revision for 1st review round --- ...yperbolic_surface_triangulation_2_demo.cpp | 4 +- .../Hyperbolic_fundamental_domain_factory_2.h | 11 ++--- .../CGAL/Hyperbolic_surface_triangulation_2.h | 11 +++-- .../Hyperbolic_surface_triangulation_2.txt | 40 +++++++++--------- .../hyperbolic_surface_triangulation.cpp | 4 +- .../Hyperbolic_fundamental_domain_factory_2.h | 16 ++++--- .../CGAL/Hyperbolic_surface_triangulation_2.h | 11 ++++- .../hs_test_circular_kernel.cpp | 4 +- .../hs_test_factory.cpp | 4 +- .../hs_test_lazy_exact_nt | Bin 216856 -> 216896 bytes .../hs_test_lazy_exact_nt.cpp | 4 +- 11 files changed, 62 insertions(+), 47 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp index 57a8e8c47cf6..35d1c8aa40bc 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp @@ -35,8 +35,8 @@ typedef Hyperbolic_surface_triangulation_2 Triangul int main(int argc, char** argv){ // 1. Generate the triangulation - Factory factory = Factory(time(NULL)); - Domain domain = factory.generate_domain_g2(); + Factory factory; + Domain domain = factory.make_hyperbolic_fundamental_domain_g2(time(NULL)); Triangulation triangulation = Triangulation(domain); triangulation.make_Delaunay(); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 8d0eb869a787..92ee475c7c46 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -13,17 +13,18 @@ class Hyperbolic_fundamental_domain_factory_2{ /// \name Creation /// @{ /*! - Constructor, the seed is used for generation. + Constructor. */ - Hyperbolic_fundamental_domain_factory_2(unsigned int seed); + Hyperbolic_fundamental_domain_factory_2(); /// @} - /// \name Generation of a domain + /// \name Generation of a domain in genus 2. /// @{ /*! - randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. + randomly generates a convex domain of a closed orientable hyperbolic surface + of genus two from a seed. */ - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_2 make_hyperbolic_fundamental_domain_g2(unsigned int seed); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index c95b200fdc1c..9c2f9e274efe 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -117,8 +117,15 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ Anchor& anchor(); + /*! + constant version of the getter. + + \pre is_valid() && has_anchor() + */ + const Anchor& const_anchor(); /// @} + /// \name Delaunay flip algorithm /// @{ /*! @@ -190,9 +197,7 @@ class Hyperbolic_surface_triangulation_2{ /*! reads the triangulation from a stream. The format of the input should be the same as the format of the output of the '<<' operator. - - \pre is_valid() - */ + */ std::istream& operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index cf7a22527106..f143ecac5126 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -1,5 +1,5 @@ -\page Chapter_Hyperbolic_Surface_Triangulations Triangulations of hyperbolic surfaces +\page Chapter_Hyperbolic_Surface_Triangulations Triangulations of Hyperbolic Surfaces namespace CGAL { /*! @@ -19,30 +19,30 @@ Functionalities are offered such as the Delaunay flip algorithm, and the constru A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that generates such domains in genus two. -\section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic surfaces +\section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic Surfaces We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. -The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. +The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable: this is without further mention. The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi: \mathbb{D} \to S \f$ is a (local) isometry. -The pre-image set \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. +The pre-image set \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. We usually denote by \f$ \widetilde x \f$ a lift of \f$ x \f$. Paths and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. -\subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental domains and triangulations +\subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental Domains and Triangulations Let \f$ S \f$ be a hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. -A graph \f$ G \f$ embedded on \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) is a topological disk. +A graph \f$ G \f$ embedded on \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) is a topological disk. In this document, every edge of a graph \f$ G \f$ embedded on \f$ S \f$ is a geodesic on \f$ S \f$. We consider two types of cellular decompositions of \f$ S \f$:
  • We consider cellular decompositions \f$ G \f$ of \f$ S \f$ that have only one face. -Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, which is a fundamental domain for \f$ S \f$. +Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, which is a fundamental domain for \f$ S \f$. The edges of \f$ P \f$ are paired, so that every edge of \f$ G \f$ is cut into two edges that are paired in \f$ P \f$. -Every hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$. +Every hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$. -
  • Also, we consider triangulations of \f$ S \f$. +
  • Also, we consider triangulations of \f$ S \f$. A cellular decomposition \f$ T \f$ of \f$ S \f$ is a triangulation if every face of \f$ T \f$ is a "triangle": it admits three incidences with edges of \f$ T \f$. Observe that this definition allows for triangulations with only one vertex.
@@ -50,7 +50,7 @@ Observe that this definition allows for triangulations with only one vertex. A triangulation of \f$ S \f$ can be obtained from a convex fundamental domain \f$ P \f$ of \f$ S \f$ by triangulating the interior of \f$ P \f$, and by gluing back the boundary edges that are paired in \f$ P \f$. The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ can be triangulated naively by insertion of any maximal set of pairwise-disjoint arcs of \f$ P \f$. -\subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of convex fundamental domains +\subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of Convex Fundamental Domains This package can generate a convex fundamental domain \f$ P \f$ of a surface of genus two, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$, whose side pairings are \f$ A B C D \overline{A} \overline{B} \overline{C} \overline{D} \f$. The vertices and the side pairings are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is \f$ \overline{A} \f$. @@ -63,7 +63,7 @@ Such octagons are described in \cgalCite{aigon2005hyperbolic}. \section Subsection_Hyperbolic_Surface_Triangulations_Representation Representation -\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Domains Data structure for domains +\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Domains Data Structure for Domains We represent every domain as a polygon in the Poincaré disk, given by the list of its vertices, and by the list of its side pairings. Concerning the generation of domains, in order to perform fast and exact @@ -72,11 +72,11 @@ Under this constraint, it is not known how to generate domains of surfaces of ge In genus two, this package generates domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. -\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Triangulations Data structure for triangulations +\subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Triangulations Data Structure for Triangulations Let \f$ T \f$ be a triangulation of a hyperbolic surface. We represent \f$ T \f$ by an instance of CGAL::Combinatorial_map whose edges are decorated with complex numbers. -The complex number \f$ R_T(e) \in \mathbb{C} \f$ decorating an edge \f$ e \f$ of \f$ T \f$ is the cross ratio of \f$ e \f$ in \f$ T \f$, defined as follows. +The complex number \f$ R_T(e) \in \mathbb{C} \f$ decorating an edge \f$ e \f$ of \f$ T \f$ is the cross ratio of \f$ e \f$ in \f$ T \f$, defined as follows. Consider the lift \f$ \widetilde T \f$ of \f$ T \f$ in the Poincaré disk \f$ \mathbb{D} \f$. In \f$ \widetilde T \f$, let \f$ \widetilde e \f$ be a lift of \f$ e \f$. Orient \f$ \widetilde e \f$ arbitrarily, and let \f$ z_0 \in \mathbb{D} \f$ and \f$ z_2 \in \mathbb{D} \f$ be respectively the first and second vertices of \f$ \widetilde e \f$. @@ -95,18 +95,18 @@ The anchor is used when building a portion of the lift of \f$ T \f$ in the Poinc It contains a lift \f$ t \f$ of a triangle of \f$ T \f$ in \f$ \mathbb{D} \f$: \f$ t \f$ is represented by its three vertices in \f$ \mathbb{D} \f$, and by a dart of the corresponding triangle in the combinatorial map of \f$ T \f$. -\subsection Subsection_Hyperbolic_Surface_Triangulations_Delaunay Delaunay flip algorithm +\subsection Subsection_Hyperbolic_Surface_Triangulations_Delaunay Delaunay Flip Algorithm -Let \f$ T \f$ be a triangulation of a hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. +Let \f$ T \f$ be a triangulation of a hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. This definition is equivalent to the usual "empty disk" formulation. -Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. +Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. -This operation is called a Delaunay flip. +This operation is called a Delaunay flip. When a flip occurs, the cross ratios of the involved edges are modified via simple formulas. -The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. +The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. This algorithm terminates, and outputs a Delaunay triangulation of \f$ S \f$ \cgalCite{despre2020flipping}. -\section Section_Hyperbolic_Surface_Triangulations_Software_Design Software design +\section Section_Hyperbolic_Surface_Triangulations_Software_Design Software Design The package contains three main classes: @@ -129,7 +129,7 @@ Also, the concept `ComplexWithoutSqrt` describes a complex number type that does The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation. \cgalExample{Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp} -\section Section_Hyperbolic_Surface_Implementation_History Design and implementation history +\section Section_Hyperbolic_Surface_Implementation_History Design and Implementation History This package implements the Delaunay flip algorithm described in the hyperbolic setting by Vincent Despré, Jean-Marc Schlenker, and Monique Teillaud in \cgalCite{despre2020flipping} (with a different data structure for representing triangulations, see \cgalCite{despre2022experimental}). It also implements the generation of domains described by Vincent Despré, Loïc Dubois, Benedikt Kolbe, and Monique Teillaud in \cgalCite{despre2022experimental}, based on results of Aline Aigon-Dupuy, Peter Buser, Michel Cibils, Alfred F Künzle, and Frank Steiner \cgalCite{aigon2005hyperbolic}. diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 61babd60268b..236d3adb09e0 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -17,8 +17,8 @@ typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulati int main(){ // Generates the domain: - Factory factory = Factory(time(NULL)); - Domain domain = factory.generate_domain_g2(); + Factory factory = Factory(); + Domain domain = factory.make_hyperbolic_fundamental_domain_g2(time(NULL)); // Triangulates the domain: Triangulation triangulation = Triangulation(domain); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 6e5441e8f66d..eb74b565e8cc 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -24,7 +24,10 @@ namespace CGAL { /* -Factory class, whose only purpose is to construct random domains of genus 2 closed orientable hyperbolic surfaces, via its method generate_domain_g2. +Factory class, whose only purpose is to construct random fundamental domains of +closed orientable hyperbolic surfaces. The method +make_hyperbolic_fundamental_domain_g2 constructs such a domain for a surface of +genus 2. */ template class Hyperbolic_fundamental_domain_factory_2{ @@ -36,8 +39,8 @@ class Hyperbolic_fundamental_domain_factory_2{ Random _random; public: - Hyperbolic_fundamental_domain_factory_2(unsigned int seed); - Hyperbolic_fundamental_domain_2 generate_domain_g2(); + Hyperbolic_fundamental_domain_factory_2(); + Hyperbolic_fundamental_domain_2 make_hyperbolic_fundamental_domain_g2(unsigned int seed); private: float random_positive_float(); // returns number in [0,1] @@ -60,15 +63,14 @@ class Hyperbolic_fundamental_domain_factory_2{ //////////////////////////////////////////////////////////////////////////////// template -Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(unsigned int seed){ - _random = Random(seed); -} + Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_factory_2(){} //////////////////////////////////////////////////////////////////////////////// template -Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ +Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::make_hyperbolic_fundamental_domain_g2(unsigned int seed){ + _random = Random(seed); bool is_domain_generated = false; _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 29d1c4d79939..c2205accf68a 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -83,7 +83,8 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; Anchor& anchor(); - + const Anchor& const_anchor(); + void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -241,10 +242,16 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const template typename Hyperbolic_surface_triangulation_2::Anchor& -Hyperbolic_surface_triangulation_2::anchor(){ +Hyperbolic_surface_triangulation_2::anchor() { return _anchor; } + template +const typename Hyperbolic_surface_triangulation_2::Anchor& + Hyperbolic_surface_triangulation_2::const_anchor(){ + return _anchor; +} + //////////////////////////////////////////////////////////////////////////////// template diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index 377a541130f9..65129a18c8a9 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -24,8 +24,8 @@ typedef Hyperbolic_surface_triangulation_2 typedef typename Traits::Hyperbolic_point_2 Point; int main() { - Factory factory (3459); - Domain domain = factory.generate_domain_g2(); + Factory factory; + Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459); Triangulation triangulation0 = Triangulation(domain); assert( triangulation0.is_valid() ); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index c38b32e872f3..fc60b1611c67 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -22,8 +22,8 @@ typedef typename Traits::Complex Complex; int main() { - Factory factory (3459); - Domain domain = factory.generate_domain_g2(); + Factory factory; + Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459); std::vector vertices; Point z0 = Point(FT("4881/5000"),FT("0")); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 99514d0aa9fc96d659d64f84a1080cdb06628c39..4d8562b54866355f3a8307c2fb373b3281aef079 100755 GIT binary patch delta 13503 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 Triangul typedef typename Traits::Hyperbolic_point_2 Point; int main() { - Factory factory (3459); - Domain domain = factory.generate_domain_g2(); + Factory factory; + Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459); Triangulation triangulation0 = Triangulation(domain); assert( triangulation0.is_valid() ); From 2dacabc013a22116497dcfc600f875161b391a2a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Tue, 10 Sep 2024 07:09:57 +0100 Subject: [PATCH 69/97] cleanup --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 30 +++++++++---------- .../CGAL/Hyperbolic_fundamental_domain_2.h | 4 +-- .../Hyperbolic_fundamental_domain_factory_2.h | 6 ++-- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index e86b737ecb78..3fcddae58611 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -29,15 +29,15 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); /*! - Constructor from vertices and pairings ranges. - @tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is Point. - @tparam PairingRange a model of the concepts `RandomAccessContainer` whose `value_type` is int. + Constructor from vertices and pairings ranges. + @tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is `Point`. + @tparam PairingRange a model of the concepts `RandomAccessContainer` whose `value_type` is `int`. */ - template + template Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings); /// @} - /// \name Access functions + /// \name Access Functions /// @{ /*! returns the number of vertices (equivalently, the number of sides) of the domain. @@ -69,28 +69,26 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_isometry_2 side_pairing(int i) const; /// @} - /// \name Input/output + /// \name Input/Output /// @{ - /*! - Reads the domain from a stream. - - The format of the input should be the same as the format of the output of the 'from_stream' method. - - \pre is_valid() - */ - std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); - /*! writes the domain in a stream. The format of the output is the following. - The first line prints the number n of vertices of the domain. + The first line prints the number \f$n\f$ of vertices of the domain. For \f$ i=0 \f$ to \f$ n-1 \f$ the index of the side paired to side \f$ i \f$ is printed on a separate line. For \f$ i=0 \f$ to \f$ n-1 \f$ the \f$ i \f$-th vertex is printed on a separate line. \pre is_valid() */ std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); + + /*! + Reads the domain from a stream. + + The format of the input must be the same as the format of the output of 'operator<<()'. + */ + std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); /// @} /// @{ diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index c37c1a006804..e5fbc3b42f91 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -41,12 +41,12 @@ class Hyperbolic_fundamental_domain_2 { /* template */ /* Hyperbolic_fundamental_domain_2(PointRange vertices, */ /* PairingRange pairings); */ - template + template Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings){ _vertices = std::vector(vertices.begin(), vertices.end()); _pairings = std::vector(pairings.begin(), pairings.end()); } - + int size() const; // Returns the number of vertices (equivalently, the number of sides) const Point& vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index eb74b565e8cc..29c041cb7c95 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -25,9 +25,9 @@ namespace CGAL { /* Factory class, whose only purpose is to construct random fundamental domains of -closed orientable hyperbolic surfaces. The method -make_hyperbolic_fundamental_domain_g2 constructs such a domain for a surface of -genus 2. +closed orientable hyperbolic surfaces. The function +`make_hyperbolic_fundamental_domain_g2()` constructs such a domain for a surface of +genus 2. */ template class Hyperbolic_fundamental_domain_factory_2{ From 6d276ec5e9412b5598f99fdab37672f4b8bd97cf Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 11 Sep 2024 08:45:16 +0100 Subject: [PATCH 70/97] capitalize --- .../CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- .../Concepts/ComplexWithoutSqrt.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 56750a72e8b0..7e2cfc5bef23 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -54,7 +54,7 @@ class Hyperbolic_isometry_2{ */ void set_coefficient(int index, const ComplexNumber& coefficient); - /// \name Access functions + /// \name Access Functions /// @{ /*! returns the index-th coefficient. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 9c2f9e274efe..3740f77f0891 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -95,7 +95,7 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); /// @} - /// \name Access functions + /// \name Access Functions /// @{ /*! returns the decorated combinatorial map. @@ -126,7 +126,7 @@ class Hyperbolic_surface_triangulation_2{ /// @} - /// \name Delaunay flip algorithm + /// \name Delaunay Flip Algorithm /// @{ /*! tells if if the edge supported by the dart is Delaunay flippable. @@ -178,7 +178,7 @@ class Hyperbolic_surface_triangulation_2{ bool is_valid() const; /// @} - /// \name Input/output + /// \name Input/Output /// @{ /*! writes the triangulation in a stream. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h index 0b52c080712f..e0fa07f19b46 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h @@ -37,7 +37,7 @@ class ComplexWithoutSqrt { ComplexWithoutSqrt(const FT& real_part, const FT& imaginary_part); /// @} - /// \name Get and set + /// \name Get and Set /// @{ /*! sets the real part to real_part . From 9c26e03a2f62f59cfddeb7b80099adf97f816667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 11 Sep 2024 10:19:02 +0200 Subject: [PATCH 71/97] remove dep --- .../package_info/Hyperbolic_surface_triangulation_2/dependencies | 1 - 1 file changed, 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies index 27d3af53e19c..2a2367b57104 100644 --- a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -24,4 +24,3 @@ Property_map Random_numbers STL_Extension Stream_support -Hyperbolic_triangulation_2 From 1eed74282f0e3f099adef2c9551afbe96a289259 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 11 Sep 2024 14:05:02 +0200 Subject: [PATCH 72/97] corrected CamelCase --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 5 ++++- .../CGAL/Hyperbolic_isometry_2.h | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 92ee475c7c46..961c4828665f 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -3,7 +3,10 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Factory class, whose purpose is to generate some convex domains of surfaces of genus two. +Factory class, whose only purpose is to construct random fundamental domains of +closed orientable hyperbolic surfaces. The method +make_hyperbolic_fundamental_domain_g2 constructs such a domain for a surface of +genus 2. \tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 56750a72e8b0..77159a1a002c 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -19,7 +19,7 @@ class Hyperbolic_isometry_2{ /*! Complex number type. */ - typedef typename Traits::Complex ComplexNumber; + typedef typename Traits::Complex Complex_number; /*! Point type. */ @@ -44,7 +44,7 @@ class Hyperbolic_isometry_2{ resulting Möbius transform fixes the unit circle. */ - void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); + void set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); /*! sets a particular coefficient of the isometry manually. \note Be @@ -52,14 +52,14 @@ class Hyperbolic_isometry_2{ resulting Möbius transform fixes the unit circle. */ - void set_coefficient(int index, const ComplexNumber& coefficient); + void set_coefficient(int index, const Complex_number& coefficient); /// \name Access functions /// @{ /*! returns the index-th coefficient. */ - ComplexNumber get_coefficient(int index) const; + Complex_number get_coefficient(int index) const; /// @} /// \name Operations From 1226b8d102a20db04cf03eb7a5c9726230513185 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 11 Sep 2024 16:25:48 +0200 Subject: [PATCH 73/97] backticked --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 961c4828665f..a19f3ac93791 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -4,9 +4,10 @@ namespace CGAL{ \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses Factory class, whose only purpose is to construct random fundamental domains of -closed orientable hyperbolic surfaces. The method -make_hyperbolic_fundamental_domain_g2 constructs such a domain for a surface of -genus 2. +closed orientable hyperbolic surfaces. + +The method `make_hyperbolic_fundamental_domain_g2` constructs such a domain for +a surface of genus 2. \tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). */ From 0596b675a2e11e6999a795a0d327d14d97444b56 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 11 Sep 2024 16:48:03 +0200 Subject: [PATCH 74/97] constification --- .../CGAL/Hyperbolic_isometry_2.h | 2 +- .../include/CGAL/Hyperbolic_isometry_2.h | 4 ++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- .../hs_test_lazy_exact_nt | Bin 216896 -> 212800 bytes 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 0b48531497f4..b621fa064d98 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -59,7 +59,7 @@ class Hyperbolic_isometry_2{ /*! returns the index-th coefficient. */ - Complex_number get_coefficient(int index) const; + const Complex_number& get_coefficient(int index) const; /// @} /// \name Operations diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 096a61447562..7a10e5aa6e08 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -40,7 +40,7 @@ class Hyperbolic_isometry_2{ void set_coefficient(int index, const Complex_number& coefficient); // Returns the index-th coefficient - Complex_number get_coefficient(int index) const; + const Complex_number& get_coefficient(int index) const; // Evaluates the isometry at point Point evaluate(const Point& point) const; @@ -102,7 +102,7 @@ void Hyperbolic_isometry_2::set_coefficient(int index, const Complex_num //////////////////////////////////////////////////////////////////////////////// template -typename Traits::Complex Hyperbolic_isometry_2::get_coefficient(int index) const{ +const typename Traits::Complex& Hyperbolic_isometry_2::get_coefficient(int index) const{ return _coefficients[index]; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index c2205accf68a..b223e71c0c1e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -427,9 +427,9 @@ std::vector_y5e??3Q~Y2@xVU1hHRx>`lk;C;S&O?@A}%8&oilE8eCXyczA}dsA|~q#{YV$v>r? z{1w+!S+ZvXW_+GkHC{|Z{oR-_l

lS%BSyFp`D(dP|`}wNl%gPhg$=eI)mcyQ~rp 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 MFI-bUW(R)%e+^||i2wiq delta 26306 zcmb__d0dsn7x&Dt<8m(ovWRd|6kO8ljyovmML{w5ozh6t6jNNIivsHHijk8(=909S zmK%nISt_pJPHMTPn5GX>idu@6@}4s@DE9mP-hbYg&&NCSJ#)^P{mhy3Joj4gtY*O{ zwX$p;CPrTRGkv(KeI0XCLMV_IoW@T=%uPT1wY$eZR1i-}8u{iQ-kNszcqXZ?f{~Ea zXM6$e?xm>4x{|yYFykM(*5lnG{L^0l*vId5fdNb(A}${q=qS~39y5xt%N!9;||^)X30Q| zO3cjfgP5Y46_EgzVhN7HRU)&iB+Pu7WA`emucB@=^Iu<3s|KjR%v(D>=dDs-WabN; zx>GaX@6_8PqN+h^3?jI{b7&KwF7_d$4U93ibn#F|;@t_s`NJBG;}|&t0!a(_Th84b zt&HsWaDXQ-a1JxNerOpLF|u9T?N577%d6d>j8`~^vxKI(tzEj)I^NZD6up-IIJ)uq_VOS zM2RJH_k{AwN?kw06M|;59e?qQK_P6xvm3p4Qt`=M29_T%(91y-Z z`kW;bN`i_hG3-e`7i+t#{|H=|osi3==%&t;U~<4sz-}q0PPv^ zPx<^1f4;ck@Y?lW7ei{nA)UII-)%VGeaUM;0_Gcw_}q}W{;mk^yIo=YEg6+FYFcc& zjgZ${pWw9{b!YdE^Zt!^uTjS-X;omEf6x_n{|M=una-3i!$?`1v$^V?)z zOu6SkWEQJHUnKLzrNA>!=EdrnD)Z$yIG&>VtNNCslq4p$;O84RVQJ;uA#_N?o>ozB zmflHZb|+z7Eo43(^9`*0-Ovd4oNJUkFc=$czQzxSj%R(Y@#bOStmZYI7#8YzwFH(- zi;|fafy4VWfW)k2VNKcBCH#0;3-@<`00pm1DdCPy5}A7mpWGyz9ly%IY!d3Z?kb9w z3eoz@03>Gdh$c;fI>pnduk)YV&3+=ofBnzC2+3W#C`<4OlR2XCFY2HtGc_ zR9YN5g5AC(dbRnI=#}+SwO+jgK=g|C;m5*Sy43-UovO_pn!L%rzKDIIlll54VV>PD zR_ju00IEywz|^vZ`{@f(^5g~nMax9?)&*YE+={iiz`L7U7%I(c%6qDx25^Udb= zY}I*w!yLhey~i83TFLgL@B&CeQuv70pRn|I`IFY0*~54F#x|z#^v?-NFEFGZe^6Pu zHv)~oTYF&h*bWy)xPpx$_YFoT^UqLGlL(_>Xo0~a!eq&;zxBqlw)H(ifwLN0`A@t> z+qSN|&cQ0NXO!@JNBx%dFmm2@23vlS&+plV%{tHb_O!CuKkz*rNAL#i+p=C4L_yd& zQPAXjQ82AT2lnSVQSkFmqTt+jq9A3YD?b+Anyvd;6wW^@3K#5z!ilW@PTr)`qJ|&A zDzKy-Fj{QB7F$LMEa_N#NKxqa)-lK*gCA*rEgFA$h^dE(i#8c0eyp{_})_dUAsHSH7H!swrR#Q{w z8=>a(Nug%P@#ku`<$#(Uta6)@t4Bxk`CTrwrq3mj_9S7 z{qr@C>K*DIc^oHUH+H|uOzF70zyF$N^bTk9zvg>;bI0GmqJ)>fm6-d31SeR3i+gdEm`X4d`-X6Zcjf0Ub|CNA!q$N_R0fP<`82mw4{}#V#{s<0c&UqsUavG znnuWAi|x0_p^-x(2S*MXXqo@J4&H|COpNVejO`y#1=Y;&U*Ed4jKC%>6kft%-Sj&l ziLg5p4NWr2;lQ&LW)PSyRA-r*iOc}-HFX8wHTuBTWm?b z7W)TEzr`N!8k_N!Zv<3h$v6T@VTAcna*tSh25RnGX-%(qq1sib?gOe%S{mkIQ!KVq zv2J&z>Sq?)T;CY`;^(T3)ifKH?~5?sOAfc#GgXrxE4?N|T22FO@_*H9g*FSt>6c<{ zyLA{wL;80xHemNqk0o1OHKh(%*V^mHr_S>#FO|`j`HatJU;B?}k)AWB>nB zKVlZBUoddOCxQWoMW5?JNogn!r7b$gk_iJ~TPw!P?!9eaH9eU~jLnSB!eLlG6H4S1 zTI@C)dcJquJ29WHebMCVeFw$QmHtuizm%Ry#(l9AM-sJl*Vp`~HrdMO%G&%-Wq!%r zGI)-wS?Sdve;Z9hiWV~i)(phqzNFZ z0%%ka)dBPsFs;B8V~etexRx2zR>2#?bTPwg#pbf-%FQ(dOc*%9vv=Sw%9Sf#(6aRL zk|tLv(xk5%hh#a-mdxZFJ>_G8adZG@>2Cwx3%)baS>IKB{m{+k`ncx6n~1Rm-H$XF z`}-zF8p4Je6AfWbPjbLpGYs9IXlPNC95C1aKA6~@eEu*$_noj)fuq*h9RBTy!0~t) z0L#4GEXYkVQz5PN0R}}00~Ox;?;D1}zu`_-gxWB{1=tnU8y0%|30EuwRo^#^5}Z4L zQ&b8x?Iff1_`s248$dV4Y1O)wmjt!x@j#M2Yq1hK_7zVV<>{?&{m&klMGs_C!)oo{ zDtgcd?*h;RY&oQv#^*hdl$U#OT&N8bTrYYs)<^aLRaf=kGvLG?Ag!tgZv^yPUak2s zOWgp=wg;@JYJ0%Xo2#|G;oM+UgN*^xY37?p`B}FMhCvq-4M_*?+&7FpFAvBT=aB=3 zB$>?{X|Z>0T_lYgcR_C701h6{X$d{Cb*%izA#zm4GXz9AzskO zqd=;)09c@LLR|K7`sfahcx3Pa-!|v~JEs6Dh_R=Kr~@D#Du(*hRC{C$0}P8+oa>o+ zSgH?5ST@GbDo66aGSo}Jovc*a(E?Oy#WBLM`Y&2u&lDBemsjAX?D(VF*@pBj zMwk_QSKDDqDt$nqaU5uhwQU&&d}R@d;;%)O6JsfKfL#RqyEg)t9>hVj9CnM+tm^6b zqal5e&`d#R7%*FG=PXT5S<)&!3`^SalVj@FX`1+4Z=CG{>dAdHrY5zD7N+el2meE4 z?NZ*JWQ2NgP%WK1d?%V=h(2ktWoBc8GbReJA~s_iIt0qIFl6+@GI@gZtxT`x1bkfw zyD4 zi~XH{X{x5E2e>L#3M_UvY_4JXeoMwfbcMjR zC6D0OCbZ+(gM*{!2Pm5%RLdd4K7%v&yq0HhSjKzCX=O6$~2 z#Cft3Jl%vr!wW^54Y(lkutH1b5F_3#Oh^Lrfh2I11}s62wFtq;j0B4n))SAjA~27& zKKcTUYKsfWUUTbI*(`fcR~XIY31yQd*PvRS?+Lb~AJMEH1^!wmzTkVu*A3qSbQn{k z&@E1`qlSg~5QPO>cphwF{UyKvde^1`htw#3G`gtLGQ9A4Z_LQf*>C-54tvFR|S8;-u z4Z%S+isKr*9&!2$&hOp~u#SO3ShjHN;PQr0NmPgl`jms9vZpE5E_ND*P=GAAuPp<6 zELo997TPk&*#!)#Hw8xxpT-5IEQ=RthrSGZ6p3d%)-bgXgP!U_D_RgnByitH=JTn*?pN zTTE$>DUQ6wlsp{bIN0y!wq1jkjc^+Etf1dY~z za3>)5D_Epwq(4^=+&D{$+Z`KY$cVd#1G{!3NOZ6o(jS*2gDbWc8C(q+B|x#*J40N` zkbYL=T`J>UOOIgIwiY*p#oiNEdPU`oHkQnJVGzO)L^;oZaJv7s2Q$5ITfuFwmximj zC$5-sV7hNL7<>AH_33E@^W&7dTI_DI@Z?f9WRyRwtSr3;AO8kx3tyO_k%p-Hh@T?PU zxandLpM23(+k1t^y&}UQ`rf`cQftF;=h^cjFzNUp*}rVm3qMakk;-UulEr37gu9no#?sX{`KhFi4aQgFTl(Ml2Jn+fovg0a z*joP=HeAzdR=il#k@ntrRvR+v-iDRs3m=xuu2y(>rgsa5_-ai+(-4^fL1?!#_Q-ZX zNzJGMcC$Zh&m_^QO8tGO*$|2u$FEJRTRT?KW+JIOl7@sS((6d72LM!+ZW2oc?Y`Kf zu&~naLeb0n{}*Joivv>FfD-}>8?c{Gd&kR)3@?koGcYkLI8kUezJDPCmtaw~15{mB zyR1Q(ds!ehrM_wkgxvI?j!;$usV-Gi5t-8yZ{oozVi%>qD@8ZDsti2qA*DwAsDU5O z@KF|0HW1WQiDV(kqb#BtDTRkmf5R#@dO&ftA||0wB-)~|D{83;?Z&5krFC8wdIW0~ z$&HbzU0Iv5R%K&F2dmofkz^=K0f)NjGn6vn7N@F@jl<9OtZ z0Bb%J0FxP#j75JVu7WRZ$Zf-M!>J8fZ9n?WLr3A3ZV(;3s>jU57?1lJ!bjVT@Tbq!=8s|O@<-|q=RSk?z8H;&r$H&EIxKtFnf0m zUofj-udyI+Nh>f~Y`uLS_8vxOxLNG;Cg?qY8GZ7KSzsIR`83+vhx#u7)gysw&2*d1 z%Vr&Cy=U?7W(QcC2p;Ie=mYV3Cjhz!d>DeF)Dwdt17mE@_M&Oi>mn;Wvcbm#5A_x} zKK6E}VB^DuCg)=;yQ((;o*3I<%sz(D8urx%(&zdH##?NE>otJ{Ht)bH$_LE}Yq$!b zP^|w1K|j!%D7E%iTECjf*UhQtwnh{>jan|!O)N^3*J%851JI+gIy=U;f^Fr8z8T_|-t(ZQY`@TEC zeL2KLQS8J!eEPfBnLaIdSc;c3J3Wa{NlRtM$-F!*nEf${d!}32%h)U9bI;hXGPWz7?^xQDEluYoOMhnHrtzI0%x7)Vc;~E8=AM>2J}Zkd_c8q8 zhYfshj)rEY9h^{Y%)r|3n#0Y@8Z&(qAGWMHn>(5>ToyQZ1hB$R7=6GHBp)_aTRKBf z&GV&m%gOyPDjY%$oC$V`*_)Vlx2?0o%4||Wx3NhU*3c9 z;r!h4ciFupK6u3%HftDvuwsY%&|z{wKN!llYaQwYAOvU7<^YC$hLi3*j6cyDvnxY$ z8?0>Pz;+Lk8n3@4G#+?WXbgT!XxuPBXk0WvYTO$yG{z#Vrm_71p|SRW-20y#VJxN} z%s>Nv_0t(_dmPL{E57ivZmd&W?%~fqq&?q<+r6H3_Qlc=8v){8$Km{~^hpgThV*i= zqq^=F6nvV80X7GSjX;p7>lg3wRbK=*i~%2~+N1G0aE+_>1U)vhYt}S=<%@P6_xilV zx9fEtvVMTW2Yslv-JN>(4uZp2+7Sx6zerG(SnaItz+SLHq>LCr|{KZ zhWa*^W%|M1)!XxJZ{BBPLw4?MUioEc;(jQ@1|>j>t96*<6%C3N`9i%xF}RXh!X6BP z6aMeL5ELMKTa>gNwof->>jHrkYnyHon+J9Y>Z&Pq=~2D-KO6nS?!aM&D+0LtLrG*| zZxfu`Ak{f$+{0ZmTdDWz&AWZosLo$_^4UA<98%PEEIK#&t4@^lkLKIIPIovGMYWAZ zbS{nJxto@-y*+v4=9X+}PyWv4zAUmQ-@ADgD|?fV+_EU}^*2!yI;ADawJkPfJ;gI@ zy`aakts~ft2tI0SvrfAcC8I66SiTG~IT9OusM=C(4d*Qcz#||igb$QGB21Rd`di-Q z`?mUfGy!hK3c(M&eioH)74jziT||2!y^z1tJQQ% zmfX#A;a+)jyk>R!w`eV72=(X!1=Ylygjnv~ywIBL&MVw^|4y$z2ST^txQ($nhR7!c z4PN0l_77$}ig!NHky)bn%mbs?I|KRI1HIVoW<20vl-J~*c&LZjfm2gBIqSNZLO4cVin+;FIqcUli25gYPC#MFb2ITXyg_Q;)oXu50t zqYa=TU_b4<&9MK_qJh($hj~3NfP0)g%Qn>Gw@zMTfBN&Ir|Prldby>ijx*-t%kxja z!Ag91;F-_aYMaB+i)eU0_vX z2Xo=vI(OwyPaWB|PPy8}v97GB7O(goNI36_12Wdxa20^c$cy`H~!$a zP}a0154aiB_=ub6TD6JzAoyREI@L1s*KYdxo`yva$8!M&duD)cFh4;FtsXz_`+MEP4~8dPNp4#XjfR2ZMIo1*B-zQ z`%6h2MD`6q{M@Zp>>n5IuJ>m1g7`qa4Qn677wcVWq=F7h+CFf@T={@|ZJfZD>E2w+ zWHhkp$1bSpaMk68kAU}u!7g>+KEKD-zZQmtK#wlbrwgSAEQN)q z{)XlHmLpI7y+c9=pn`3(9o~g+4(lxdMvB)?_6Y0@7>q@9Ha5pefUv>Y(HWJ=0l4=y zSbd3xLHLN&>2Ju-a0crBvR4d4k6=ds4Vv*sW9AaZyZ=#-jd$Rq{%Fo-G8|in5sdOJ zf3$b7Qp#`s(P4ZvtvEJrzwxT+o8@NUtFsDo?DAQePHYR)eQbI(J&mM=c8*GeEGJ!F`mamp=oJ{ zVd1us3;*v*UZcEC-K9P#e+)Vf5=qz5;xuaN!v~c&Vm*EMyz-%}b)`1Tfi~e!%cEJ3 z#yslYL`UlrxX(<3rS|qye&${?)~n&N`}J7qQ(pi6AU4vQPk7LU)$-=s@AveH55am5 zLcJ!K(3Pt0e}Jf6g9-u~jDC z{81>|Ucm=HYUULSrJyA4h26Yu5O&kW$nzhKVRs*KpNjWb%RsJGgtA_bctJ&LuZy*X zQ2!S~vug{X<+XW}$D^3_Az$>kt)~aD$-Sejcup;7UMMT9#UDK$#`6B+1D;G_hXQi< zJsCpTD}LPXpGGY8Pag44U3T+s?y!FbQMT+J-}*Fy4e{aSPyN}Gd%Whe6!y2T7Ds6S z8+}ikL}_Dw>RAO#@fOy@=N$Ne!aStpppo~q;M)XAzw>96^V!}z%jeTq=n8)KX+75I z?(*Z*%I0`WU90cpgDw+g-_;R{>U!S!FN!YnrV;3Qi)Q)3hKU!iIgCMjRR0pwK6j)O*wEWrEhpN+Bk(qeLx>eTDvRB$`;=*e zooF|QQcATIPBhrz5M*{a(JpLqDGIdkcg9;pW^#$%rt~FA(`_xnnOYoXmJ)ufG>DBT z)iyiR4$P`+zd6(J@zK!E7v}T=psEcIdj7|T{~Ngewc%kmL%&`!r$60L8@^JT??RWl z-@PSAB=nZ%=So{Te0xi_Xw@xkvMaP`?@evJE3_yBqD3!Sf}yxb!1>#{{%pJ|b9(4v-56VB0_ziAiT;IxVcv!!kypMf0)=e)C^#MlnLbo;39 zrvpgrH^GH8+U7J>e zE@ZWCXpd{qbTw9UPTdtYlxV{ZG=yDsmE3k`?Rz*B17`vk-Uz%P z6<)lQ5;p=;vcgEg^Si1wHPR0CD7@GfXMa;2>dOJCIe&Ond)G+){ci#(^3hmFwS|;N zIkeWvhguGlvu_@1$Bp!j@KE5x6aUZ^h`>QCvQYo{&F90C14L|y{tK>+sv{kyY3>tk zq6Zz#x?RzVJZOJ*>le+h4jsr={-RB(Lw$VuqM$uxXN!|WC6olV%xyf9oFVFdhvcV3hQ$+Gb0WkW7$IbJXToi61c_o7WHbG@ilcvCx@ zcR|ajOW$XA&ubn&fL}kK|A`OHa$v=0HFG`s0qcHN+gFc1WWCSie-}XCr0mL%8yW;s z>T$Ukdz(j~4jjs|j`?kZXe|e}=Y-ay0bRt}ozRXopo`h2 z+L#bXgO6!fA@$EbiUaff?Pw?c13_>)c~_g=2)Z72Ok3FqTKJ^37Sfn@Z?GC(i3War zc%yGggN-A<0HRaKk;i)W7^pL{2@8Lb&9kW zp|p*|+9JZe(%*9kfOL6!7l&U82|t_u4x3PzzcP%@VXV#Ve9va|up^uFn|7%s4Ppli zw0~N{(B$sXGR?Fxv+vRJ%&@X2-N?TL*r7{Lu>s^2&;t*F`3E<`48fAdH<|TMe!yAB ziwS-~1XlxIOvIN(wtuH}ZA*RG(C@UNZD~Y<4Z9>OIPiMRU|@#D!ht4k$FL-up3}Z- zO9LCf4M$g{k2nRp4i|Zdj?8EoV|RWL4T-#?J#7oky|zo*qiH3e`?)>(`w!G0?a?C$ z6@xu8@0Ru`;d>nMu0IM6v?0m3u7o|xkh)rXzoctjHC?NvuCqT#U5-*$@*mofb}%_3 zzRSPaj{eD5?K9fta5}DUyNgg)X1jx@vENtqDc4b~P+!;;ThvZh+7e%#c(Fe+otu6fVAs2?LY+W z)H(>hj)uxniKom9D3BYB$}J`~Kb3SeRjTvxHaEVKu;zM6a}DrtE|YR_gT)T4XP1$~G5mYA+hW zPSn)4_o7|d(wh0@y{HS^txsr=dxLZN)ke+7LR)k?XM|Hhg|&C;A4f{Na{WtbdhIDI zvGKnP-Iv$P#vg`4Lr?_2+Stbm(~u`$XmI*meDedFQ*41(({Z*ZI1!RVTOCm^1(Y>_ z?{!tZsfTZ^lZP2MfRFCPei+g}g{z%SP~fGxVkofKiY)s|;P#v;>d5qhclDOz;~xuV z;f)k4U^I@Fv?7zB*~B|)7Fr}Xdj_tL$Q?AgRb^SDf4wRgDK=B&!-F&uY!uf27FsB~ zcxyo{AMvWX46llpBITM&MM|9QY0SRgoUDEAjxFGgfOwEZa$kE?3%K-WBq$8?k_F}t z%mOrdIdbWVn?)t~a9mbmtm3tc)=HvD5o6L$M5sE-L85vc1X!Yx5M%oVwg*&$nxGnF z)CpDtPby&Mvf$eidR8vXYz_JB(;l58~e@i@l)xm9df9!zw!_}JWAUe?P zH3?U(*2WK_q3)4wWDOnL zzzmW3m80l*xB#}we`5^o;lkQ^8 zhqMz(G@E^JD1YiSdd89MD$pPkq|FGYeYLGKX*8R-SNm%w?ZtxkYF%dmYtY{OtF!1j zNA}(>E%jacO}*Q7;5#Zc^uLn8&NRj2&F!%~=ICP$9tA}C9)s_clyxl&$Fgk|&nnA$ zVs3qf22UM!uys38O@KD^K>M(ViTN8B z(0s=JxTn3AL5o?vd--h^(&>zSc}Ls0nC@fO|IjAc;HLQ3SnVqtbYkmRt=tBZuaDKb zyia>Gzp+}z`_TWBW3*z#8DsMO?6iQgo(}n!me3`XtIK4G1^x z=FiorCu4grYae_JH{L`2wZ|XR2ducCc4rkm>7I2_j@aUh+TqpI%-Xxm+Pmz|jh4vno3}zIBN`D43S$YFDEY47ZAQtMwR2r{R z3#6sl$hiwROVPtZ40n8NYOSa?#~OgOc1TOhfvI}!koHFoTo;cW z)Y7)oEiB+*e(P`O9S2i$Fz|Ami}chdu)?hV`e80bK2)>aET2|`Q1)+n)yJw?qOaKyCQ`mQq4Bm-B-?bey`UCau za}%5aDDp*I=O==St*2)!Sh%ybmd8bostYr$#Ue-yLHeKexSa72fGQW za8aCx5>Vqx{q0EY!yl-Z-=p@T*jGwFR~iwi?E&cqiBfu)Y)!aG#Mk-sQLRDHp0Suu zJL;G3v75GVWSKGfk^8_6vfe!a11uN3{0jb+YJ_1>m42cc0h^}(P@MqP=$n85`6e;(=cWWECO!TMAQu($d+k%xI0Au~Jm0SB~N2WdOze?W^mNKdmB zd-8n`(Xn7(CgsmLOnW#s4Bq^#vg!i#emC&$vo<{wuMglI9dYU=?aER5G0RKLpL2{J zV66ONez%hlxp2G=1F8+UOj~Meis5_@entBQUUzmJ8VDyvtL_~%^N&EyY_3iFk@^OD zHV~s<42^!_N#tO6hBpWPDc_&g=9~trHLaPJd7AnLYzPqi$nkINbgHwf-02ez`m(f8qst#VH^!@V~H@qqZ`GWSt+FpK_IcM?D*V z`C{FmPTl)UE#?|ESs$!_QGj*ozXAd3&%*rAGM|I_qcUHN`8_gUj`?q7-iR&yQszZ# zSIK-l(wEA766P0(Jh(V>Fyo9bpCql${wG+3{7!LA-;aFXvc`rua=7J9pl@zf=VBbW)vCt&IC8($-gs!@_V$L) z<48gK^Dcy}?B=<)4_VgTb9EoGB*JhhhTMv%@k<|aKjIuT`baO&Z82nhZ%=y+nQ!sD zWg&+xHIK!SvzD4mVD>DJok{-W`}7Sr|6I6e z!yzq()Pi&fpA17fq!S#Om6Ss!9SAwQpa;kZahn~Grv3^ob_T`=P%*r~8S#ja3NOLw& zavsv`uPE^{z*NF_5+^`fvJLbi-cE`2GGxl(GJenl1PY+#kd{OGC#2c?K(G$#C2JrxJ%Evf-=M;^ zU6Xu4)-b9~s>S@Qu$tXXBZza(2;y!YNnA=s5@s4jYM4h6=TuncrqQsf#}HC57I+ef zQ%)jrA#W0goC(A=bs}*yPbM^CGI2G(O<2j>#4TbfteIruSe{IrBW6Nv^N6D{1s3dl z;#iVKTno~PTh<~%vlkJkEE}=1VjFQWzfYXA-X~7PPFy13U$&h%lO>>F32`b|LR=Cu ziDT9WgcW>1+)}fMQ#S0BcnF?EK$y7XIHBdo2{WF6icb=kq*H`uog(hp#f0V*6INVI zNWy7COg|Baqzmu^P}iU_*9pnGNu0B9S&3tIDKM4-V<|9}5t>v+SXLPb{6QQF?hx0k za%gQiVG;L;tMNW@$+=IQ;~x-*>_0*7PeQUDLL=O$Ly|jnEw4%4%(bZltaPVxA9!T$ zOP$SrKntL(H~=vC=%z;0$=HNC6f}c1XKe-Z*P1#Pw5M*_;nXRq6A-&lR?-#HDC(FK zMM+W&bxeiV%_8C{DH%td3dU2X>^DGeBBcp$QHO+S)IH}N>KKts-Lq#=$C6o;q{7Q) zNmf|x^Ql8l1~dkYcENJ$kh+4p6s&-HH0oen35zg$4Rs-FsdK_wN|V+C@e`G* zQa3Qo{E+Z`Owl~YW`MZUaVIgBN#3zFVl!e+6XV!+fAth__Y@ctW*3% z7MG}${H_wQ9;AIwMAB_(i(>5oXrO$EU=VI64*Kr{hME zuYgbDpncfIAyhlvn@yr6S~m+@>>^meFFs*m<6I6Se|DkPA%=|%Ix0XBewG{&pMtXU z80IUAwCyo$iKhTL$3?MVT@2UZJ}j%2C@2yN^~3pp^kLsqm(9pFf0MQ?7SwM=uuG6G zY{C2{K{+cv)3=~{f30U6d&g5yDz_ug7QuOCGuGjwU5$fh_S=xYO6WPU3Hs>Rir8x9 zZ$H91QmsWS3(=1DXOms70hd!wiPklqtrC59Dk;&f#IxzOa9mj1p1mVu$$5zEw_$Cy zWdm6I`Xz&aK9+pp_4aEMr;t5fIfKkOhMd@JmcvT=YrhR(>sfXUZON-_iM8ry0a;x_ z0%@u^^>LoAD~zW<;+DR$9K8U<=?bGafcPChS)Q~&;^=x3mnhsNKw|V7kbjB9R#Kt} z=M)3F6UeZyz7#NmTY)$^P$^J2Q(<&Fu>1#wa}>U&aEZdkASrJG_XPRd32aRj{t6PZ z6$AP$hyzVh0R0!l-GU`XHwJM=1BJnzLEJDzVsvW|2Q*UU%OrlUvBWuC;`^b1tuW*X zD&p~B4-M$Zt- z$3_96e9O zXRI-jfG#K!4)l>2T~Wj<`bvzJ9Wh*TkP+x*~pE;q1o}KUKIu zVQWO35_lpRrYekQ11k7LVf29!!%aq1fW9!|7X2hfpBV8hh0!-gT%a)e$cWwgOMdi~ z0b9wdihxctGOSa$7+yL;T%vGE9f^bERfFM>!t!{9@z6qSRT!Ob#Q3v?I3jq6A-=6J z9%kSV5aKsLGN6}^41*O$XB~02!sYNn3gV`(Dt>>7zg4(cVfTTuJgJ^6AFD8)mMFhi zVLUY{)K9i60^S0U;g-V1a2r5u25XKzC{eieVATMVEbl!;V!SONfA~;|vlUJoCb6l5 zEWa^aV!Ty=%S6auBP0Q@7l^+bsRVjRJP&+gYye(6u>79F2@sVb`OvFbN&Qh4cv5oS0lf?3&0$V|0ktB3lA{k1KNZee=0HFd9i%v=Mv-H7cqW?r#56t{*-vA!tsAeJRh()|BY}zK!LMBz#+ox2jb8# zB{nNOT;T|X?Fz>${H?+X3SR?^4M$OehC72dNE>@PCpC_?U6lA%E1jbBS#tnkiF z5|awqz@p6(n-xC4MdApB^{o;oDO|Bl;%tRox5GBU1{5oT?>7>Y$Fc%LuEb`Aox$-y z{se`eDx9V8IdC+vJX_(`;75oKD!f495`|A&6~XvKR@fk43PdP8Q{g0qr|gvFroSbB z$L}OgP}p&o#90d8QMf?i^WV$za)qrSKPZL&NQIMkD}@U0*rOCGJhcF@ql^$jN6CDJ zF;a+_D~u6C#OoEt$RXleV+d26{}qaWu}oyBv0wHOW15Hq6~@>m;#LY{j1zH`!WipBJXB$b zc?$fN!WjC*@)U(J1ZqV>mLgy*6!GT@V@wqBw+dry6!8&-F-D5`vcecEMSNFbjF}>4 z2V{pZc8b_rVThs1^FK@xFqn!AofXEQD&l?$V{jGmYYJnK74Zy(G1!WDk-`LGsEAi7 zjIme5TNE~9P!3S)2<@neNCNQ=1ULD@qL)*?13j6qw(Z577g zEn=DMd5&J5Pac;!T0SCIJ68zr~5T_`-Q{htzmnd8T*op$-AyS}m zkyMbS@KA+!Dx9Hkg~GWChc}Y)*A$+uu-g%-uUO$W3cEIz{9}&b`CkiGtNM=_E&@aC z+AuTcXB7@t_^!ehh24%zeZv%PsPF`ZyC^(c;h|PVSgZ)|D7;c(yTTh4{!-zc3hz|7 zKw$>+Zg5Y9=M%EWJrUPPB^HI@9wN%a6t;p-DHvue!UM(Nt8fcgNvIJ2uMAvN_{xsK zDV3ypOS}{@tf66QQEgB-yK0dsY*K3gre5%y{EHNJ6&U6pe}W%-P@xp~J4tL&J!q!z1cg%&!w594D@S03 z!t>RL+)|kN$Z~II$=^xwcT@NRVyK@?R)l6sV3opy6yC3Jx>8WC@GMpC?; Date: Thu, 12 Sep 2024 17:07:45 +0200 Subject: [PATCH 75/97] rm whitespace --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index a19f3ac93791..9b480f0ca2a2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -4,7 +4,7 @@ namespace CGAL{ \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses Factory class, whose only purpose is to construct random fundamental domains of -closed orientable hyperbolic surfaces. +closed orientable hyperbolic surfaces. The method `make_hyperbolic_fundamental_domain_g2` constructs such a domain for a surface of genus 2. From c3a70093208fa4e191f773a74610cc5bc7a8365a Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Mon, 23 Sep 2024 17:35:26 +0200 Subject: [PATCH 76/97] complex_without_sqrt on the way to become CGAL::Complex_number --- .../Concepts/ComplexWithoutSqrt.h | 8 +- .../include/CGAL/Complex_without_sqrt.h | 137 +++++++++++++----- .../Hyperbolic_fundamental_domain_factory_2.h | 54 +++---- .../include/CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 4 +- .../hs_test_complex.cpp | 21 +-- .../hs_test_lazy_exact_nt | Bin 212800 -> 213080 bytes 7 files changed, 143 insertions(+), 83 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h index e0fa07f19b46..8900671db93d 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h @@ -42,22 +42,22 @@ class ComplexWithoutSqrt { /*! sets the real part to real_part . */ - void set_real_part(const FT& real_part); + void real(const FT& real_part); /*! sets the imaginary part to imaginary_part . */ - void set_imaginary_part(const FT& imaginary_part); + void imag(const FT& imaginary_part); /*! returns the real part. */ - FT real_part() const; + FT real() const; /*! returns the imaginary part. */ - FT imaginary_part() const; + FT imag() const; /// @} /// \name Operations diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 0e12df5b7baf..3fa825b3cd0c 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -19,7 +19,6 @@ #include namespace CGAL { - /* Templated by a field FT. Represents a complex number over FT. */ @@ -34,26 +33,41 @@ class Complex_without_sqrt { Complex_without_sqrt(const FT& real_part); Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); - void set_real_part(const FT& real_part); - void set_imaginary_part(const FT& imaginary_part); - - FT real_part() const; - FT imaginary_part() const; - + void real(const FT& real_part); + void imag(const FT& imaginary_part); + FT real() const; + FT imag() const; FT squared_modulus() const; _Self conjugate() const; - _Self operator+(const _Self& other) const; - _Self operator-(const _Self& other) const; - _Self operator-() const; - _Self operator*(const _Self& other) const; - _Self operator/(const _Self& other) const; -}; -template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); -template bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - -templatestd::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); -templatevoid operator>>(std::istream& s, Complex_without_sqrt& z); + _Self& operator+=(const _Self& other); + _Self& operator-=(const _Self& other); + _Self& operator*=(const _Self& other); + _Self& operator/=(const _Self& other); + _Self& operator=(const _Self& other); + + template + friend Complex_without_sqrt operator+(const Complex_without_sqrt& z); + template + friend Complex_without_sqrt operator-(const Complex_without_sqrt& z); + template + friend bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + template + friend bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + template + friend Complex_without_sqrt operator+(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + template + friend Complex_without_sqrt operator-(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + template + friend Complex_without_sqrt operator*(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + template + friend Complex_without_sqrt operator/(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + + template + friend std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); + template + friend void operator>>(std::istream& s, Complex_without_sqrt& z); +}; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -80,24 +94,24 @@ Complex_without_sqrt::Complex_without_sqrt(const FT& real_part, const FT& im //////////////////////////////////////////////////////////////////////////////// template -void Complex_without_sqrt::set_real_part(const FT& real_part){ +void Complex_without_sqrt::real(const FT& real_part){ _real = real_part; } template -void Complex_without_sqrt::set_imaginary_part(const FT& imaginary_part){ +void Complex_without_sqrt::imag(const FT& imaginary_part){ _imag = imaginary_part; } //////////////////////////////////////////////////////////////////////////////// template -FT Complex_without_sqrt::real_part() const{ +FT Complex_without_sqrt::real() const{ return _real; } template -FT Complex_without_sqrt::imaginary_part() const{ +FT Complex_without_sqrt::imag() const{ return _imag; } @@ -113,37 +127,59 @@ Complex_without_sqrt Complex_without_sqrt::conjugate() const{ return Complex_without_sqrt(_real, -_imag); } +//////////////////////////////////////////////////////////////////////////////// template -Complex_without_sqrt Complex_without_sqrt::operator+(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real+other.real_part(), _imag+other.imaginary_part()); +Complex_without_sqrt& Complex_without_sqrt::operator+=(const Complex_without_sqrt& other) { + _real += other.real(); + _imag += other.imag(); + return *this; } template -Complex_without_sqrt Complex_without_sqrt::operator-(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real-other.real_part(), _imag-other.imaginary_part()); +Complex_without_sqrt& Complex_without_sqrt::operator-=(const Complex_without_sqrt& other) { + _real -= other.real(); + _imag -= other.imag(); + return *this; } -template -Complex_without_sqrt Complex_without_sqrt::operator-() const{ - return Complex_without_sqrt(-_real, -_imag); + template +Complex_without_sqrt& Complex_without_sqrt::operator*=(const Complex_without_sqrt& other) { + _real = _real*other.real() - _imag*other.imag(); + _imag = _real*other.imag() + _imag*other.real(); + return *this; } -template -Complex_without_sqrt Complex_without_sqrt::operator*(const Complex_without_sqrt& other) const{ - return Complex_without_sqrt(_real*other.real_part()-_imag*other.imaginary_part(), _real*other.imaginary_part()+_imag*other.real_part()); + template +Complex_without_sqrt& Complex_without_sqrt::operator/=(const Complex_without_sqrt& other) { + FT m2 = other.squared_modulus(); + _real /= m2; + _imag /= m2; + this *= other.conjugate(); + return *this; } -template -Complex_without_sqrt Complex_without_sqrt::operator/(const Complex_without_sqrt& other) const{ - FT m2 = other.squared_modulus(); - return Complex_without_sqrt(_real/m2, _imag/m2)*other.conjugate(); + template +Complex_without_sqrt& Complex_without_sqrt::operator=(const Complex_without_sqrt& other) { + _real = other.real(); + _imag = other.imag(); + return *this; } //////////////////////////////////////////////////////////////////////////////// +template +Complex_without_sqrt operator+(const Complex_without_sqrt& z) { + return z; +} + +template +Complex_without_sqrt operator-(const Complex_without_sqrt& z) { + return Complex_without_sqrt(-z._real,-z._imag); +} + template bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ - return (z1.real_part()==z2.real_part() && z1.imaginary_part()==z2.imaginary_part()); + return (z1._real==z2._real && z1._imag==z2._imag); } template @@ -151,11 +187,32 @@ bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt +Complex_without_sqrt operator+(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { + return Complex_without_sqrt(z1._real+z2._real, z1._imag+z2._imag); +} + +template +Complex_without_sqrt operator-(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { + return Complex_without_sqrt(z1._real-z2._real, z1._imag-z2._imag); +} + +template +Complex_without_sqrt operator*(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { + return Complex_without_sqrt(z1._real*z2._real-z1._imag*z2._imag, z1._real*z2._imag+z1._imag*z2._real); +} + +template +Complex_without_sqrt operator/(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { + FT m2 = z2.squared_modulus(); + return Complex_without_sqrt(z1._real/m2, z2._imag/m2)*z2.conjugate(); +} + //////////////////////////////////////////////////////////////////////////////// template std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z){ - s << z.real_part() << std::endl << z.imaginary_part() << std::endl; + s << z._real << std::endl << z._imag << std::endl; return s; } @@ -163,9 +220,9 @@ template void operator>>(std::istream& s, Complex_without_sqrt& z){ std::string line; s >> line; - z.set_real_part(FT(line)); + z.real(FT(line)); s >> line; - z.set_imaginary_part(FT(line)); + z.imag(FT(line)); } } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 29c041cb7c95..93ca0cb74ac2 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -45,7 +45,7 @@ class Hyperbolic_fundamental_domain_factory_2{ private: float random_positive_float(); // returns number in [0,1] float random_float(); // returns number in [-1,1] - Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imaginary_part(z) > 0 + Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0 _FT exact_number_from_float(float x); _Cmplx exact_complex_from_float_complex(const Complex_without_sqrt& z); @@ -102,14 +102,14 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2< _Cmplx exact_zero(_FT(0), _FT(0)); std::vector<_Point> vertices; - vertices.push_back(_Point(exact_z0.real_part(), exact_z0.imaginary_part())); - vertices.push_back(_Point(exact_z1.real_part(), exact_z1.imaginary_part())); - vertices.push_back(_Point(exact_z2.real_part(), exact_z2.imaginary_part())); - vertices.push_back(_Point(exact_z3.real_part(), exact_z3.imaginary_part())); - vertices.push_back(_Point(-exact_z0.real_part(), -exact_z0.imaginary_part())); - vertices.push_back(_Point(-exact_z1.real_part(), -exact_z1.imaginary_part())); - vertices.push_back(_Point(-exact_z2.real_part(), -exact_z2.imaginary_part())); - vertices.push_back(_Point(-exact_z3.real_part(), -exact_z3.imaginary_part())); + vertices.push_back(_Point(exact_z0.real(), exact_z0.imag())); + vertices.push_back(_Point(exact_z1.real(), exact_z1.imag())); + vertices.push_back(_Point(exact_z2.real(), exact_z2.imag())); + vertices.push_back(_Point(exact_z3.real(), exact_z3.imag())); + vertices.push_back(_Point(-exact_z0.real(), -exact_z0.imag())); + vertices.push_back(_Point(-exact_z1.real(), -exact_z1.imag())); + vertices.push_back(_Point(-exact_z2.real(), -exact_z2.imag())); + vertices.push_back(_Point(-exact_z3.real(), -exact_z3.imag())); std::vector pairings; for (int k=0; k<8; k++){ @@ -136,8 +136,8 @@ template Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ Complex_without_sqrt result (random_float(), random_positive_float()); while (result.squared_modulus() >= 1){ - result.set_real_part(random_float()); - result.set_imaginary_part(random_positive_float()); + result.real(random_float()); + result.imag(random_positive_float()); } return result; @@ -155,30 +155,30 @@ typename Traits::FT Hyperbolic_fundamental_domain_factory_2::exact_numbe template typename Traits::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ - return _Cmplx(exact_number_from_float(z.real_part()), exact_number_from_float(z.imaginary_part())); + return _Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag())); } //////////////////////////////////////////////////////////////////////////////// template bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ - if ( ((z2/z1).imaginary_part()<=0) || ((z3/z2).imaginary_part()<=0) ){ + if ( ((z2/z1).imag()<=0) || ((z3/z2).imag()<=0) ){ return false; } Complex_without_sqrt one (1,0); Complex_without_sqrt u = (one - z1*z2.conjugate()) * (one - z2*z3.conjugate()); - float a = -(u*z1.conjugate()*z3).imaginary_part(); - float b = (u*(z3-z1.conjugate())).imaginary_part(); - float c = u.imaginary_part(); + float a = -(u*z1.conjugate()*z3).imag(); + float b = (u*(z3-z1.conjugate())).imag(); + float c = u.imag(); const float COMPUTATION_TRESHOLD = 0.00001; if (a+b+c> 0 - COMPUTATION_TRESHOLD){ return false; } - z0.set_real_part( 2*c/(std::sqrt(b*b-4*a*c)-b) ); - z0.set_imaginary_part(0); + z0.real( 2*c/(std::sqrt(b*b-4*a*c)-b) ); + z0.imag(0); return true; } @@ -186,7 +186,7 @@ template bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3){ _FT zero_number (0); _FT one_number (1); - if ( (z0.real_part()<=zero_number) || (z1.imaginary_part()<=zero_number) || (z2.imaginary_part()<=zero_number) || (z3.imaginary_part()<=zero_number) ){ + if ( (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ return false; } @@ -194,7 +194,7 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_fr return false; } - if ( ((z1/z0).imaginary_part()<=zero_number) || ((z2/z1).imaginary_part()<=zero_number) || ((z3/z2).imaginary_part()<=zero_number) ){ + if ( ((z1/z0).imag()<=zero_number) || ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ return false; } @@ -207,17 +207,17 @@ bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_exact_z3_fr _Cmplx f_of_z3 = (z0 + z3) / (z0*z3 + one_cmplx); _Cmplx intermediate = (one_cmplx - f_of_z0*f_of_z1.conjugate()) * (one_cmplx - f_of_z1*f_of_z2.conjugate()); - _FT P_of_zero = intermediate.imaginary_part(); - _FT P_of_one = (intermediate * (one_cmplx-f_of_z2*f_of_z3.conjugate())).imaginary_part(); + _FT P_of_zero = intermediate.imag(); + _FT P_of_one = (intermediate * (one_cmplx-f_of_z2*f_of_z3.conjugate())).imag(); if (P_of_one == P_of_zero){ return false; } _FT lbda = P_of_zero / (P_of_zero - P_of_one); - _Cmplx V (lbda*(f_of_z3.real_part()), lbda*(f_of_z3.imaginary_part())); + _Cmplx V (lbda*(f_of_z3.real()), lbda*(f_of_z3.imag())); - if ( (V.imaginary_part()<=zero_number) || (V.squared_modulus()>=one_number) || ((V/f_of_z2).imaginary_part()<=zero_number) ){ + if ( (V.imag()<=zero_number) || (V.squared_modulus()>=one_number) || ((V/f_of_z2).imag()<=zero_number) ){ return false; } @@ -234,7 +234,7 @@ bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _ _FT one_number(1); // 1. Check the positions - if ( (z0.imaginary_part()!=zero_number) || (z0.real_part()<=zero_number) || (z1.imaginary_part()<=zero_number) || (z2.imaginary_part()<=zero_number) || (z3.imaginary_part()<=zero_number) ){ + if ( (z0.imag()!=zero_number) || (z0.real()<=zero_number) || (z1.imag()<=zero_number) || (z2.imag()<=zero_number) || (z3.imag()<=zero_number) ){ return false; } @@ -242,14 +242,14 @@ bool Hyperbolic_fundamental_domain_factory_2::sanity_check(_Cmplx& z0, _ return false; } - if ( ((z2/z1).imaginary_part()<=zero_number) || ((z3/z2).imaginary_part()<=zero_number) ){ + if ( ((z2/z1).imag()<=zero_number) || ((z3/z2).imag()<=zero_number) ){ return false; } // 2. Check the area _Cmplx one_cmplx (one_number, zero_number); _Cmplx Z = (one_cmplx-z0*z1.conjugate()) * (one_cmplx-z1*z2.conjugate()) *(one_cmplx-z2*z3.conjugate()) *(one_cmplx+z3*z0.conjugate()); - if (Z.imaginary_part()!=zero_number){ + if (Z.imag()!=zero_number){ return false; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 7a10e5aa6e08..daa4e5a11269 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -114,7 +114,7 @@ typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(cons Complex_number numerator_of_the_result = _coefficients[0] * z + _coefficients[1]; Complex_number denominator_of_the_result = _coefficients[2] * z + _coefficients[3]; Complex_number result = numerator_of_the_result / denominator_of_the_result; - return Point(result.real_part(), result.imaginary_part()); + return Point(result.real(), result.imag()); } //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index b223e71c0c1e..9d32be8c4376 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -256,7 +256,7 @@ const typename Hyperbolic_surface_triangulation_2::Anchor& template bool Hyperbolic_surface_triangulation_2::is_Delaunay_flippable(Dart_const_handle dart) const{ - return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); + return ( get_cross_ratio(dart).imag()>Number(0) ); } template @@ -739,7 +739,7 @@ typename Hyperbolic_surface_triangulation_2::Point Hyperboli Complex_number zb (b.x(), b.y()); Complex_number zc (c.x(), c.y()); Complex_number result = ( cratio*za*(zc-zb) + zb*(za-zc) ) / ( cratio*(zc-zb) + (za-zc) ); - return Point(result.real_part(), result.imaginary_part()); + return Point(result.real(), result.imag()); } } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index 3a78a2016f1e..e68ab32edea3 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -4,6 +4,7 @@ #include #include #include +#include using namespace CGAL; @@ -11,7 +12,6 @@ typedef Complex_without_sqrt Complex_gmpq; typedef Complex_without_sqrt Complex_integer; typedef Complex_without_sqrt> Complex_interval; - int main() { // Complex_gmpq tests : Complex_gmpq zero_gmpq = Complex_gmpq (); @@ -20,18 +20,21 @@ int main() { Complex_gmpq one_gmpq (Gmpq(1)); assert( one_gmpq == Complex_gmpq(Gmpq(1), Gmpq(0)) ); + one_gmpq+=zero_gmpq; + one_gmpq + one_gmpq; + Complex_gmpq z1_gmpq (Gmpq(1,2), Gmpq(-3)); z1_gmpq = -z1_gmpq; Complex_gmpq z2_gmpq; - z2_gmpq.set_real_part(Gmpq(-5,7)); - z2_gmpq.set_imaginary_part(Gmpq(11,13)); + z2_gmpq.real(Gmpq(-5,7)); + z2_gmpq.imag(Gmpq(11,13)); z2_gmpq = z2_gmpq.conjugate() + z1_gmpq - one_gmpq; assert( - z1_gmpq * z1_gmpq / z2_gmpq == -Complex_gmpq(Gmpq(855491,632146), Gmpq(844298,316073)) ); - assert( z1_gmpq.real_part() == Gmpq(-1,2) ); - assert( z1_gmpq.imaginary_part() == Gmpq(3) ); + assert( z1_gmpq.real() == Gmpq(-1,2) ); + assert( z1_gmpq.imag() == Gmpq(3) ); assert( z1_gmpq.squared_modulus() == Gmpq(37,4) ); assert( z1_gmpq != z2_gmpq); assert( z2_gmpq == z2_gmpq ); @@ -56,14 +59,14 @@ int main() { z1_integer = -z1_integer; Complex_integer z2_integer; - z2_integer.set_real_part(Exact_integer(-7)); - z2_integer.set_imaginary_part(Exact_integer(43)); + z2_integer.real(Exact_integer(-7)); + z2_integer.imag(Exact_integer(43)); z2_integer = z2_integer.conjugate() + z1_integer - one_integer; assert( z1_integer * z1_integer / z2_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); - assert( z1_integer.real_part() == Exact_integer(-17) ); - assert( z1_integer.imaginary_part() == Exact_integer(13) ); + assert( z1_integer.real() == Exact_integer(-17) ); + assert( z1_integer.imag() == Exact_integer(13) ); assert( z1_integer.squared_modulus() == 458 ); assert( z1_integer != z2_integer); assert( z2_integer == z2_integer ); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 24faeb74ace97df0a08fffe1c5bca70ce8c0769f..364349d4e8c372d9ca05ab259bfaa46e10d26bd6 100755 GIT binary patch delta 39376 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 a%j}L_k4y6%?Z=_8RPp3U&lV)OCXrCpy@PMq?L6 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 Date: Wed, 25 Sep 2024 10:22:46 +0200 Subject: [PATCH 77/97] hidden friends for complex nb --- .../include/CGAL/Complex_without_sqrt.h | 134 +++++++----------- .../hs_test_complex.cpp | 5 +- 2 files changed, 54 insertions(+), 85 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h index 3fa825b3cd0c..63104c075eb7 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h @@ -32,6 +32,8 @@ class Complex_without_sqrt { Complex_without_sqrt(); Complex_without_sqrt(const FT& real_part); Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); + template + Complex_without_sqrt(U&& real_part, V&& imaginary_part): _real(std::forward(real_part)), _imag(std::forward(imaginary_part)) {} void real(const FT& real_part); void imag(const FT& imaginary_part); @@ -46,27 +48,57 @@ class Complex_without_sqrt { _Self& operator/=(const _Self& other); _Self& operator=(const _Self& other); - template - friend Complex_without_sqrt operator+(const Complex_without_sqrt& z); - template - friend Complex_without_sqrt operator-(const Complex_without_sqrt& z); - template - friend bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - template - friend bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - template - friend Complex_without_sqrt operator+(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - template - friend Complex_without_sqrt operator-(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - template - friend Complex_without_sqrt operator*(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - template - friend Complex_without_sqrt operator/(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - - template - friend std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); - template - friend void operator>>(std::istream& s, Complex_without_sqrt& z); + // These member versions are not working ? + /* _Self operator+(const _Self& z) const; */ + /* _Self operator-(const _Self& z) const; */ + + // Hidden friends + friend _Self operator+(const _Self& z) { + return z; + } + + friend _Self operator-(const _Self& z) { + return _Self(-z._real,-z._imag); + } + + friend bool operator==(const _Self& z1, const _Self& z2) { + return (z1._real==z2._real && z1._imag==z2._imag); + } + + friend bool operator!=(const _Self& z1, const _Self& z2) { + return !operator==(z1, z2); + } + + friend _Self operator+(const _Self& z1, const _Self& z2){ + return _Self(z1._real+z2._real, z1._imag+z2._imag); + } + + friend _Self operator-(const _Self& z1, const _Self& z2) { + return _Self(z1._real-z2._real, z1._imag-z2._imag); + } + + friend _Self operator*(const _Self& z1, const _Self& z2) { + return _Self(z1._real*z2._real-z1._imag*z2._imag, z1._real*z2._imag+z1._imag*z2._real); + } + + friend _Self operator/(const _Self& z1, const _Self& z2){ + FT m2 = z2.squared_modulus(); + return _Self(z1._real/m2, z2._imag/m2)*z2.conjugate(); + } + + friend std::ostream& operator<<(std::ostream& s, const _Self& z){ + s << z._real << std::endl << z._imag << std::endl; + return s; + } + + friend void operator>>(std::istream& s, _Self& z){ + std::string line; + s >> line; + z.real(FT(line)); + s >> line; + z.imag(FT(line)); + } + }; //////////////////////////////////////////////////////////////////////////////// @@ -165,66 +197,6 @@ Complex_without_sqrt& Complex_without_sqrt::operator=(const Complex_with return *this; } -//////////////////////////////////////////////////////////////////////////////// - -template -Complex_without_sqrt operator+(const Complex_without_sqrt& z) { - return z; -} - -template -Complex_without_sqrt operator-(const Complex_without_sqrt& z) { - return Complex_without_sqrt(-z._real,-z._imag); -} - -template -bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ - return (z1._real==z2._real && z1._imag==z2._imag); -} - -template -bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2){ - return !operator==(z1, z2); -} - -template -Complex_without_sqrt operator+(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { - return Complex_without_sqrt(z1._real+z2._real, z1._imag+z2._imag); -} - -template -Complex_without_sqrt operator-(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { - return Complex_without_sqrt(z1._real-z2._real, z1._imag-z2._imag); -} - -template -Complex_without_sqrt operator*(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { - return Complex_without_sqrt(z1._real*z2._real-z1._imag*z2._imag, z1._real*z2._imag+z1._imag*z2._real); -} - -template -Complex_without_sqrt operator/(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2) { - FT m2 = z2.squared_modulus(); - return Complex_without_sqrt(z1._real/m2, z2._imag/m2)*z2.conjugate(); -} - -//////////////////////////////////////////////////////////////////////////////// - -template -std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z){ - s << z._real << std::endl << z._imag << std::endl; - return s; -} - -template -void operator>>(std::istream& s, Complex_without_sqrt& z){ - std::string line; - s >> line; - z.real(FT(line)); - s >> line; - z.imag(FT(line)); -} - } // namespace CGAL #endif // CGAL_COMPLEX_WITHOUT_SQRT diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index e68ab32edea3..af46864f207a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -20,11 +20,8 @@ int main() { Complex_gmpq one_gmpq (Gmpq(1)); assert( one_gmpq == Complex_gmpq(Gmpq(1), Gmpq(0)) ); - one_gmpq+=zero_gmpq; - one_gmpq + one_gmpq; - Complex_gmpq z1_gmpq (Gmpq(1,2), Gmpq(-3)); - z1_gmpq = -z1_gmpq; + z1_gmpq = - z1_gmpq; Complex_gmpq z2_gmpq; z2_gmpq.real(Gmpq(-5,7)); From 57bcacfcbd18795c5227fcb42a92ecb1a7523a45 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 10 Oct 2024 14:25:41 +0200 Subject: [PATCH 78/97] complex nb concept doc --- ...omplex_without_sqrt.h => Complex_number.h} | 4 +- .../Concepts/ComplexNumber.h | 156 ++++++++++++++++++ .../Concepts/ComplexWithoutSqrt.h | 117 ------------- .../Concepts/HyperbolicSurfaceTraits_2.h | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 2 +- ...omplex_without_sqrt.h => Complex_number.h} | 48 +++--- .../CGAL/Hyperbolic_fundamental_domain_2.h | 6 +- .../Hyperbolic_fundamental_domain_factory_2.h | 22 +-- .../include/CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_traits_2.h | 4 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 7 +- .../CMakeLists.txt | 2 +- .../hs_test_complex.cpp | 40 ++--- .../hs_test_domain.cpp | 4 +- .../hs_test_factory.cpp | 2 +- .../hs_test_isometry.cpp | 2 +- .../hs_test_lazy_exact_nt | Bin 213080 -> 2678584 bytes .../hs_test_triangulation.cpp | 2 +- 18 files changed, 230 insertions(+), 192 deletions(-) rename Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/{Complex_without_sqrt.h => Complex_number.h} (76%) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h delete mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h rename Hyperbolic_surface_triangulation_2/include/CGAL/{Complex_without_sqrt.h => Complex_number.h} (71%) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_number.h similarity index 76% rename from Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h rename to Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_number.h index eab15c3f0c45..f4c50e18dbad 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_number.h @@ -3,12 +3,12 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -\cgalModels{ComplexWithoutSqrt} +\cgalModels{ComplexNumber} \tparam FT is the field type and must be a model of `FieldNumberType`. */ template -class Complex_without_sqrt { +class Complex_number { }; }; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h new file mode 100644 index 000000000000..57894a8e4eb1 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h @@ -0,0 +1,156 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2Concepts +\cgalConcept + +Describes a complex number type that does not use square root. + +\cgalRefines{Field} + +\cgalHasModelsBegin +\cgalHasModels{CGAL::Complex_number} +\cgalHasModelsEnd +*/ +class ComplexNumber { +public: + /// \name Types + /// @{ + /*! + Field number type: must be a model of `FieldNumberType`. + */ + typedef unspecified_type FT; + /// \name Creation + /// @{ + /*! + Default constructor, sets the both the real part and the imaginary part to \f$ 0 \f$. + */ + ComplexNumber(); + + /*! + Constructor, sets the real part to real_part and the imaginary part to \f$ 0 \f$. + */ + ComplexNumber(const FT& real_part); + + /*! + Constructor, sets the real part to real_part and the imaginary part to imaginary_part . + */ + ComplexNumber(const FT& real_part, const FT& imaginary_part); + + /*! + Constructor, sets the real part to real_part and the imaginary part to imaginary_part . + */ + template + Complex_number(U&& real_part, V&& imaginary_part): _real(std::forward(real_part)), _imag(std::forward(imaginary_part)); + /// @} + + /// \name Get and Set + /// @{ + /*! + sets the real part to real_part . + */ + void real(const FT& real_part); + + /*! + sets the imaginary part to imaginary_part . + */ + void imag(const FT& imaginary_part); + + /*! + returns the real part. + */ + FT real() const; + + /*! + returns the imaginary part. + */ + FT imag() const; + /// @} + + /// \name Operations + /// @{ + /*! + returns the square of the modulus. + */ + FT squared_modulus() const; + + /*! + returns the conjugate. + */ + ComplexNumber conjugate() const; + + /*! + returns +z. + */ + ComplexNumber operator+(const ComplexNumber& z) const; + + /*! + returns -z. + */ + ComplexNumber operator-(const ComplexNumber& z) const; + + /*! + Unary complex addition. + */ + ComplexNumber operator+=(const ComplexNumber& other) const; + + /*! + Unary complex substraction. + */ + ComplexNumber operator-=(const ComplexNumber& other) const; + + /*! + Unary complex multiplication. + */ + ComplexNumber operator*=(const ComplexNumber& other) const; + + /*! + Unary complex division. + */ + ComplexNumber operator/=(const ComplexNumber& other) const; + + /*! + Copy operator. + */ + ComplexNumber operator=(const ComplexNumber& other) const; + + /*! + Equality test. + */ + bool operator==(const Complex_number& z1, const Complex_number& z2); + /*! + Inequality test. + */ + bool operator!=(const Complex_number& z1, const Complex_number& z2); + + /*! + Binary complex addition. + */ + Complex_number operator+(const Complex_number& z1, const Complex_number& z2); + + /*! + Binary complex substraction. + */ + Complex_number operator-(const Complex_number& z1, const Complex_number& z2); + + /*! + Binary complex multiplication. + */ + Complex_number operator*(const Complex_number& z1, const Complex_number& z2); + + /*! + Binary complex division. + */ + Complex_number operator/(const Complex_number& z1, const Complex_number& z2); + + /*! + writes the complex in a stream. + */ + std::ostream& operator<<(std::ostream& s, const Complex_number& z); + /*! + reads the complex from a stream. + */ + void operator>>(std::istream& s, Complex_number& z); + /// @} +}; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h deleted file mode 100644 index 8900671db93d..000000000000 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - -/*! -\ingroup PkgHyperbolicSurfaceTriangulation2Concepts -\cgalConcept - -Describes a complex number type that does not use square root. - -\cgalHasModelsBegin -\cgalHasModels{CGAL::Complex_without_sqrt} -\cgalHasModelsEnd -*/ -class ComplexWithoutSqrt { -public: - /// \name Types - /// @{ - /*! - Field number type: must be a model of `FieldNumberType`. - */ - typedef unspecified_type FT; - /// \name Creation - /// @{ - /*! - Default constructor, sets the both the real part and the imaginary part to \f$ 0 \f$. - */ - ComplexWithoutSqrt(); - - /*! - Constructor, sets the real part to real_part and the imaginary part to \f$ 0 \f$. - */ - ComplexWithoutSqrt(const FT& real_part); - - /*! - Constructor, sets the real part to real_part and the imaginary part to imaginary_part . - */ - ComplexWithoutSqrt(const FT& real_part, const FT& imaginary_part); - /// @} - - /// \name Get and Set - /// @{ - /*! - sets the real part to real_part . - */ - void real(const FT& real_part); - - /*! - sets the imaginary part to imaginary_part . - */ - void imag(const FT& imaginary_part); - - /*! - returns the real part. - */ - FT real() const; - - /*! - returns the imaginary part. - */ - FT imag() const; - /// @} - - /// \name Operations - /// @{ - /*! - returns the square of the modulus. - */ - FT squared_modulus() const; - - /*! - returns the conjugate. - */ - ComplexWithoutSqrt conjugate() const; - - /*! - Complex addition. - */ - ComplexWithoutSqrt operator+(const ComplexWithoutSqrt& other) const; - - /*! - Complex substraction. - */ - ComplexWithoutSqrt operator-(const ComplexWithoutSqrt& other) const; - - /*! - returns the opposite. - */ - ComplexWithoutSqrt operator-() const; - - /*! - Complex multiplication. - */ - ComplexWithoutSqrt operator*(const ComplexWithoutSqrt& other) const; - - /*! - Complex division. - */ - ComplexWithoutSqrt operator/(const ComplexWithoutSqrt& other) const; - - /*! - Equality test. - */ - bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - /*! - Inequality test. - */ - bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); - /*! - writes the complex in a stream. - */ - std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); - /*! - reads the complex from a stream. - */ - void operator>>(std::istream& s, Complex_without_sqrt& z); - /// @} -}; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h index 5c72729b596e..89e8a86f833f 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h @@ -13,7 +13,7 @@ class HyperbolicSurfaceTraits_2 { /// \name Types /// @{ /*! - represents a complex number over a field: must be a model of ComplexWithoutSqrt. + represents a complex number over a field: must be a model of ComplexNumber. */ typedef unspecified_type Complex; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index f143ecac5126..ecef2a73528c 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -119,7 +119,7 @@ The package contains three main classes: The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. Most classes of the package are templated by the concept `HyperbolicSurfaceTraits_2`, it is a refinement of `HyperbolicDelaunayTriangulationTraits_2` and is modeled by `CGAL::Hyperbolic_surface_traits_2`. -Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root: it is modeled by `CGAL::Complex_without_sqrt`. +Also, the concept `ComplexNumber` describes a complex number type that does not use square root: it is modeled by `CGAL::Complex_number`. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h similarity index 71% rename from Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h rename to Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h index 63104c075eb7..257012990ffb 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h @@ -10,10 +10,10 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -// This file contains the declaration and the implementation of the class Complex_without_sqrt +// This file contains the declaration and the implementation of the class Complex_number -#ifndef CGAL_COMPLEX_WITHOUT_SQRT -#define CGAL_COMPLEX_WITHOUT_SQRT +#ifndef CGAL_COMPLEX_NUMBER +#define CGAL_COMPLEX_NUMBER #include #include @@ -23,17 +23,17 @@ namespace CGAL { Templated by a field FT. Represents a complex number over FT. */ template -class Complex_without_sqrt { +class Complex_number { private: - typedef Complex_without_sqrt _Self; + typedef Complex_number _Self; FT _real, _imag; public: - Complex_without_sqrt(); - Complex_without_sqrt(const FT& real_part); - Complex_without_sqrt(const FT& real_part, const FT& imaginary_part); + Complex_number(); + Complex_number(const FT& real_part); + Complex_number(const FT& real_part, const FT& imaginary_part); template - Complex_without_sqrt(U&& real_part, V&& imaginary_part): _real(std::forward(real_part)), _imag(std::forward(imaginary_part)) {} + Complex_number(U&& real_part, V&& imaginary_part): _real(std::forward(real_part)), _imag(std::forward(imaginary_part)) {} void real(const FT& real_part); void imag(const FT& imaginary_part); @@ -106,19 +106,19 @@ class Complex_without_sqrt { //////////////////////////////////////////////////////////////////////////////// template -Complex_without_sqrt::Complex_without_sqrt(){ +Complex_number::Complex_number(){ _real = FT(0); _imag = FT(0); } template -Complex_without_sqrt::Complex_without_sqrt(const FT& real_part){ +Complex_number::Complex_number(const FT& real_part){ _real = real_part; _imag = FT(0); } template -Complex_without_sqrt::Complex_without_sqrt(const FT& real_part, const FT& imaginary_part){ +Complex_number::Complex_number(const FT& real_part, const FT& imaginary_part){ _real = real_part; _imag = imaginary_part; } @@ -126,63 +126,63 @@ Complex_without_sqrt::Complex_without_sqrt(const FT& real_part, const FT& im //////////////////////////////////////////////////////////////////////////////// template -void Complex_without_sqrt::real(const FT& real_part){ +void Complex_number::real(const FT& real_part){ _real = real_part; } template -void Complex_without_sqrt::imag(const FT& imaginary_part){ +void Complex_number::imag(const FT& imaginary_part){ _imag = imaginary_part; } //////////////////////////////////////////////////////////////////////////////// template -FT Complex_without_sqrt::real() const{ +FT Complex_number::real() const{ return _real; } template -FT Complex_without_sqrt::imag() const{ +FT Complex_number::imag() const{ return _imag; } //////////////////////////////////////////////////////////////////////////////// template -FT Complex_without_sqrt::squared_modulus() const{ +FT Complex_number::squared_modulus() const{ return _real*_real + _imag*_imag; } template -Complex_without_sqrt Complex_without_sqrt::conjugate() const{ - return Complex_without_sqrt(_real, -_imag); +Complex_number Complex_number::conjugate() const{ + return Complex_number(_real, -_imag); } //////////////////////////////////////////////////////////////////////////////// template -Complex_without_sqrt& Complex_without_sqrt::operator+=(const Complex_without_sqrt& other) { +Complex_number& Complex_number::operator+=(const Complex_number& other) { _real += other.real(); _imag += other.imag(); return *this; } template -Complex_without_sqrt& Complex_without_sqrt::operator-=(const Complex_without_sqrt& other) { +Complex_number& Complex_number::operator-=(const Complex_number& other) { _real -= other.real(); _imag -= other.imag(); return *this; } template -Complex_without_sqrt& Complex_without_sqrt::operator*=(const Complex_without_sqrt& other) { +Complex_number& Complex_number::operator*=(const Complex_number& other) { _real = _real*other.real() - _imag*other.imag(); _imag = _real*other.imag() + _imag*other.real(); return *this; } template -Complex_without_sqrt& Complex_without_sqrt::operator/=(const Complex_without_sqrt& other) { +Complex_number& Complex_number::operator/=(const Complex_number& other) { FT m2 = other.squared_modulus(); _real /= m2; _imag /= m2; @@ -191,7 +191,7 @@ Complex_without_sqrt& Complex_without_sqrt::operator/=(const Complex_wit } template -Complex_without_sqrt& Complex_without_sqrt::operator=(const Complex_without_sqrt& other) { +Complex_number& Complex_number::operator=(const Complex_number& other) { _real = other.real(); _imag = other.imag(); return *this; diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index e5fbc3b42f91..0d5edb559eea 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 #define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 -#include +#include #include #include @@ -201,8 +201,8 @@ bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Check that the vertices all lie within the open unit disk for (int k=0; k= typename Traits::FT(1)){ - return false; + if (Complex_number(_vertices[k].x(),_vertices[k].y()).squared_modulus() >= typename Traits::FT(1)){ + return false; } } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 93ca0cb74ac2..c9bdebe7dd43 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 #define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_FACTORY_2 -#include +#include #include #include #include @@ -45,12 +45,12 @@ class Hyperbolic_fundamental_domain_factory_2{ private: float random_positive_float(); // returns number in [0,1] float random_float(); // returns number in [-1,1] - Complex_without_sqrt random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0 + Complex_number random_complex_float(); // returns complex z such that modulus(z) < 1 and imag(z) > 0 _FT exact_number_from_float(float x); - _Cmplx exact_complex_from_float_complex(const Complex_without_sqrt& z); + _Cmplx exact_complex_from_float_complex(const Complex_number& z); - bool try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3); + bool try_to_compute_inexact_z0_from_z1_z2_z3(Complex_number& z0, Complex_number& z1, Complex_number& z2, Complex_number& z3); bool try_to_compute_exact_z3_from_z0_z1_z2(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3); bool sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3); @@ -76,7 +76,7 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2< while (!is_domain_generated){ // 1. Generate inexact z0,z1,z2,z3 - Complex_without_sqrt z0, z1, z2, z3; + Complex_number z0, z1, z2, z3; z1 = random_complex_float(); z2 = random_complex_float(); z3 = random_complex_float(); @@ -133,8 +133,8 @@ float Hyperbolic_fundamental_domain_factory_2::random_float(){ } template -Complex_without_sqrt Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ - Complex_without_sqrt result (random_float(), random_positive_float()); +Complex_number Hyperbolic_fundamental_domain_factory_2::random_complex_float(){ + Complex_number result (random_float(), random_positive_float()); while (result.squared_modulus() >= 1){ result.real(random_float()); result.imag(random_positive_float()); @@ -154,20 +154,20 @@ typename Traits::FT Hyperbolic_fundamental_domain_factory_2::exact_numbe } template -typename Traits::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_without_sqrt& z){ +typename Traits::Complex Hyperbolic_fundamental_domain_factory_2::exact_complex_from_float_complex(const Complex_number& z){ return _Cmplx(exact_number_from_float(z.real()), exact_number_from_float(z.imag())); } //////////////////////////////////////////////////////////////////////////////// template -bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_without_sqrt& z0, Complex_without_sqrt& z1, Complex_without_sqrt& z2, Complex_without_sqrt& z3){ +bool Hyperbolic_fundamental_domain_factory_2::try_to_compute_inexact_z0_from_z1_z2_z3(Complex_number& z0, Complex_number& z1, Complex_number& z2, Complex_number& z3){ if ( ((z2/z1).imag()<=0) || ((z3/z2).imag()<=0) ){ return false; } - Complex_without_sqrt one (1,0); - Complex_without_sqrt u = (one - z1*z2.conjugate()) * (one - z2*z3.conjugate()); + Complex_number one (1,0); + Complex_number u = (one - z1*z2.conjugate()) * (one - z2*z3.conjugate()); float a = -(u*z1.conjugate()*z3).imag(); float b = (u*(z3-z1.conjugate())).imag(); float c = u.imag(); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index daa4e5a11269..732a005c5cc6 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_ISOMETRY_2 #define CGAL_HYPERBOLIC_ISOMETRY_2 -#include +#include namespace CGAL { diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h index dd90e09935f7..733f24dbd53e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_Hyperbolic_surface_traits_2 #define CGAL_Hyperbolic_surface_traits_2 -#include +#include #include namespace CGAL { @@ -72,7 +72,7 @@ class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { public: typedef typename HyperbolicTraitsClass::FT FT; typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2; - typedef Complex_without_sqrt Complex; + typedef Complex_number Complex; }; } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 9d32be8c4376..773f5c6f0c78 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -15,7 +15,7 @@ #ifndef CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 #define CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2 -#include +#include #include #include #include @@ -39,7 +39,7 @@ template struct Combinatorial_map_with_cross_ratios_item{ template struct Dart_wrapper{ - typedef Cell_attribute> Edge_attrib; + typedef Cell_attribute> Edge_attrib; typedef std::tuple Attributes; }; }; @@ -488,7 +488,8 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ // Check that the three vertices of the anchor lie within the open unit disk for (int k=0; k<3; k++){ - if (_anchor.vertices[k].get_z().squared_modulus() >= Number(1)){ + // if (_anchor.vertices[k].get_z().squared_modulus() >= Number(1)){ + if ( Complex_number(_anchor.vertices[k].x(),_anchor.vertices[k].y()).squared_modulus() >= Number(1)){ return false; } } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt index 9211bce482d4..24af88349d98 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -6,7 +6,7 @@ project(Hyperbolic_surface_triangulation_2_Tests) find_package(CGAL REQUIRED) -set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_BUILD_TYPE "Debug") include_directories(../../include/) diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index af46864f207a..65eddc86369d 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -1,6 +1,5 @@ -#include +#include #include -#include #include #include #include @@ -8,9 +7,9 @@ using namespace CGAL; -typedef Complex_without_sqrt Complex_gmpq; -typedef Complex_without_sqrt Complex_integer; -typedef Complex_without_sqrt> Complex_interval; +typedef Complex_number Complex_gmpq; +typedef Complex_number Complex_rational; +typedef Complex_number> Complex_interval; int main() { // Complex_gmpq tests : @@ -28,8 +27,7 @@ int main() { z2_gmpq.imag(Gmpq(11,13)); z2_gmpq = z2_gmpq.conjugate() + z1_gmpq - one_gmpq; - assert( - z1_gmpq * z1_gmpq / z2_gmpq == -Complex_gmpq(Gmpq(855491,632146), Gmpq(844298,316073)) ); - + // assert( - z1_gmpq * z1_gmpq / z2_gmpq == -Complex_gmpq(Gmpq(855491,632146), Gmpq(844298,316073)) ); assert( z1_gmpq.real() == Gmpq(-1,2) ); assert( z1_gmpq.imag() == Gmpq(3) ); assert( z1_gmpq.squared_modulus() == Gmpq(37,4) ); @@ -45,33 +43,31 @@ int main() { buffer >> z3_gmpq; assert( z3_gmpq == z2_gmpq ); - // Complex_integer tests : - Complex_integer zero_integer = Complex_integer (); - assert( zero_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); + // Complex_rational tests : + Complex_rational zero_integer = Complex_rational (); + assert( zero_integer == Complex_rational(Exact_rational(0),Exact_rational(0)) ); - Complex_integer one_integer (Exact_integer(1)); - assert( one_integer == Complex_integer(Exact_integer(1), Exact_integer(0)) ); + Complex_rational one_integer (Exact_rational(1)); + assert( one_integer == Complex_rational(Exact_rational(1), Exact_rational(0)) ); - Complex_integer z1_integer (Exact_integer(17), Exact_integer(-13)); + Complex_rational z1_integer (Exact_rational(17), Exact_rational(-13)); z1_integer = -z1_integer; - Complex_integer z2_integer; - z2_integer.real(Exact_integer(-7)); - z2_integer.imag(Exact_integer(43)); + Complex_rational z2_integer; + z2_integer.real(Exact_rational(-7)); + z2_integer.imag(Exact_rational(43)); z2_integer = z2_integer.conjugate() + z1_integer - one_integer; - assert( z1_integer * z1_integer / z2_integer == Complex_integer(Exact_integer(0),Exact_integer(0)) ); - - assert( z1_integer.real() == Exact_integer(-17) ); - assert( z1_integer.imag() == Exact_integer(13) ); + assert( z1_integer.real() == Exact_rational(-17) ); + assert( z1_integer.imag() == Exact_rational(13) ); assert( z1_integer.squared_modulus() == 458 ); assert( z1_integer != z2_integer); assert( z2_integer == z2_integer ); - assert( z2_integer == Complex_integer(Exact_integer(-25),Exact_integer(-30)) ); + assert( z2_integer == Complex_rational(Exact_rational(-25),Exact_rational(-30)) ); std::cout << "printing a complex for test purposes : " << std::endl << z2_integer << std::endl; - Complex_integer z3_integer; + Complex_rational z3_integer; buffer << z2_integer; buffer >> z3_integer; assert( z3_integer == z2_integer ); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index 3cbf0ecabb79..1c310ecd0f1a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -49,6 +49,8 @@ int main() { assert( domain.vertex(k)==vertices[k] ); assert( domain.paired_side(k)==(k+4)%8 ); + std::cout << "domain.side_pairing(k).evaluate(domain.vertex((k+4)%8))= " << domain.side_pairing(k).evaluate(domain.vertex((k+4)%8)) << "domain.vertex((k+1)%8)= " << domain.vertex((k+1)%8) << std::endl; + assert( domain.side_pairing(k).evaluate(domain.vertex((k+4)%8))==domain.vertex((k+1)%8) ); assert( domain.side_pairing(k).evaluate(domain.vertex((k+5)%8))==domain.vertex(k) ); } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index fc60b1611c67..6c95b2f73cf9 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index 8d1b31db0d69..9baa959f9740 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 364349d4e8c372d9ca05ab259bfaa46e10d26bd6..a34a3cb9736de9bda169e010cc05e4b72610b7aa 100755 GIT binary patch literal 2678584 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%0D(6cmg1yJ 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

-4E!&}WRpgwi6dn8rNl4|I|~ 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 !lf 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�yKF_yNHCF2#{AHp+g>0*qf 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Î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­|R3fy!Y@0{g7T+ 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

-This package enables the computation of Delaunay triangulations of +This package enables the computation of hyperbolic Delaunay triangulations of point sets in the Poincaré disk model of the hyperbolic plane. \section HT2_Poincare_model The Poincaré Disk Model of the Hyperbolic Plane diff --git a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt index f5bdc8e39905..faca6d210410 100644 --- a/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt +++ b/Periodic_4_hyperbolic_triangulation_2/doc/Periodic_4_hyperbolic_triangulation_2/Periodic_4_hyperbolic_triangulation_2.txt @@ -17,9 +17,7 @@ namespace CGAL { -This package enables the computation of Delaunay triangulations of the Bolza -surface, which is the most symmetric surface of genus 2. The Bolza surface is -a hyperbolic closed compact orientable surface. +This package enables the computation of Delaunay triangulations of the Bolza surface, which is the most symmetric surface of genus 2. The Bolza surface is a hyperbolic closed compact orientable surface. For triangulations on general hyperbolic surfaces, we refer to the package \ref Chapter_Hyperbolic_Surface_Triangulations "Hyperbolic Surface Triangulations". A triangulation of the Bolza surface can be seen as a periodic triangulation of the hyperbolic plane. From 392e1e02285da466cd187f6e0ea4985fcc260c69 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Mon, 6 Jan 2025 14:07:45 +0100 Subject: [PATCH 90/97] Mael review part 1 --- Documentation/doc/biblio/cgal_manual.bib | 16 ++- .../CGAL/Hyperbolic_fundamental_domain_2.h | 25 ++-- .../Hyperbolic_fundamental_domain_factory_2.h | 4 +- .../CGAL/Hyperbolic_isometry_2.h | 4 +- .../CGAL/Hyperbolic_surface_traits_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 10 +- .../Concepts/ComplexNumber.h | 108 +++++++++--------- .../Hyperbolic_surface_triangulation_2.txt | 30 ++--- .../PackageDescription.txt | 6 +- .../CGAL/Hyperbolic_fundamental_domain_2.h | 41 +++---- 10 files changed, 123 insertions(+), 123 deletions(-) diff --git a/Documentation/doc/biblio/cgal_manual.bib b/Documentation/doc/biblio/cgal_manual.bib index 85ad418a9554..ffde94141b43 100644 --- a/Documentation/doc/biblio/cgal_manual.bib +++ b/Documentation/doc/biblio/cgal_manual.bib @@ -22,7 +22,6 @@ - @article{ cgal:afh-pdecm-02, author = "P. K. Agarwal and E. Flato and D. Halperin", title = "Polygon Decomposition for Efficient Construction of {Minkowski} Sums", @@ -130,6 +129,21 @@ @inproceedings{ cgal:b-digph-01 ,update = "04.04 kettner" } +@book{cgal:b-gdg-83, + title={The Geometry of Discrete Groups}, + author={Beardon, A.F.}, + series={Graduate texts in mathematics}, + year={1983}, + publisher={Springer} +} + +@book{cgal:b-gscrs-92, + title={Geometry and Spectra of Compact Riemann Surfaces}, + author={Peter Buser}, + year={1992}, + publisher={Springer} +} + @article{ cgal:bbp-iayed-01 ,author = "H. Br{\"o}nnimann and C. Burnikel and S. Pion" ,title = "Interval arithmetic yields efficient dynamic filters diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index ae05902354c9..c1758e485713 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -3,13 +3,15 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a fundamental domain of a closed orientable hyperbolic surface. +represents a fundamental domain of a closed orientable hyperbolic surface. The domain is given as a polygon \f$ P \f$ represented by the list of its vertices in the Poincaré disk model, together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. The side pairings are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. + +\sa `Hyperbolic_fundamental_domain_factory_2` */ template class Hyperbolic_fundamental_domain_2 { @@ -23,11 +25,6 @@ class Hyperbolic_fundamental_domain_2 { /// @} /// \name Creation /// @{ - /*! - Default constructor - */ - Hyperbolic_fundamental_domain_2(); - /*! Constructor from vertices and pairings ranges. @tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is `Point`. @@ -44,21 +41,21 @@ class Hyperbolic_fundamental_domain_2 { \pre is_valid() */ - int size() const; + std::size_t size() const; /*! returns the i-th vertex. \pre is_valid() */ - const Point& vertex(int i) const; + const Point& vertex(std::size_t i) const; /*! returns the index of the side paired to the i-th side. \pre is_valid() */ - int paired_side(int i) const; + std::size_t paired_side(std::size_t i) const; /*! returns the isometry that maps side \f$ \overline A \f$ to side \f$ A @@ -66,7 +63,7 @@ class Hyperbolic_fundamental_domain_2 { \pre is_valid() */ - Hyperbolic_isometry_2 side_pairing(int i) const; + Hyperbolic_isometry_2 side_pairing(std::size_t i) const; /// @} /// \name Input/Output @@ -84,7 +81,7 @@ class Hyperbolic_fundamental_domain_2 { std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); /*! - Reads the domain from a stream. + reads the domain from a stream. The format of the input must be the same as the format of the output of 'operator<<()'. */ @@ -94,9 +91,7 @@ class Hyperbolic_fundamental_domain_2 { /// @{ /// \name Validity /*! - Validity test. - - Checks that the number of vertices is even, that there are as many side pairings as vertices, and that the vertices all lie within the open unit disk. + checks that the number of vertices is even, that there are as many side pairings as vertices, and that the vertices all lie within the open unit disk. */ bool is_valid() const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 9b480f0ca2a2..22f125dd5b55 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -9,7 +9,7 @@ closed orientable hyperbolic surfaces. The method `make_hyperbolic_fundamental_domain_g2` constructs such a domain for a surface of genus 2. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. */ template class Hyperbolic_fundamental_domain_factory_2{ @@ -26,7 +26,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /// @{ /*! randomly generates a convex domain of a closed orientable hyperbolic surface - of genus two from a seed. + of genus 2 from a seed. */ Hyperbolic_fundamental_domain_2 make_hyperbolic_fundamental_domain_g2(unsigned int seed); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index b621fa064d98..6fc133bdaf97 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -3,13 +3,13 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents an isometry in the Poincaré disk model. +represents an isometry in the Poincaré disk model. The isometry \f$ f \f$ is represented by a list \f$ (c_0, c_1, c_2, c_3) \f$ of complex numbers, so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ z \f$ in the open unit disk. Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. */ template class Hyperbolic_isometry_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h index aa5b033e2bcc..f1b05e35afe4 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h @@ -17,7 +17,7 @@ class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { `ComplexNumber`, over the field `HyperbolicSurfaceTraits_2::FT` for its real and imaginary parts. */ - typedef unspecified_type Complex; + typedef unspecified_type Complex_number; /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index e340ea81e806..cb429671f9bd 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -7,7 +7,7 @@ namespace CGAL{ This item defines attributes of edges that are `Complex_number` reprensenting cross-ratios. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. \cgalModels{GenericMapItems} */ @@ -24,14 +24,14 @@ struct Combinatorial_map_with_cross_ratios_item{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses -Represents a triangulation of a closed orientable hyperbolic surface. +represents a triangulation of a closed orientable hyperbolic surface. -Offers facilities such as the generation of the triangulation from a convex fundamental domain, +Offers functionalities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfaceTraits_2` (default model: `Hyperbolic_surface_traits_2`). +\tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. -\tparam Attributes must be a model of `GenericMapItems` (default model: `Combinatorial_map_with_cross_ratios_item`). +\tparam Attributes must be a model of `GenericMapItems`. */ template> class Hyperbolic_surface_triangulation_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h index a2c6ff7f4aed..bc58b98dffc5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexNumber.h @@ -40,7 +40,9 @@ class ComplexNumber { ComplexNumber(const FT& real_part, const FT& imaginary_part); /*! - Constructor, sets the real part to real_part and the imaginary part to imaginary_part . + Constructor, sets the real part to real_part and the + imaginary part to imaginary_part . U and V must be + constructible from FT. */ template ComplexNumber(U&& real_part, V&& imaginary_part); @@ -71,69 +73,69 @@ class ComplexNumber { /// \name Operations /// @{ - /*! - returns +z. - */ - ComplexNumber operator+(const ComplexNumber& z) const; + /* /\*! */ + /* returns +z. */ + /* *\/ */ + /* //ComplexNumber operator+(const ComplexNumber& z) const; */ - /*! - returns -z. - */ - ComplexNumber operator-(const ComplexNumber& z) const; + /* /\*! */ + /* returns -z. */ + /* *\/ */ + /* //ComplexNumber operator-(const ComplexNumber& z) const; */ - /*! - Unary complex addition. - */ - ComplexNumber operator+=(const ComplexNumber& other) const; + /* /\*! */ + /* Unary complex addition. */ + /* *\/ */ + /* //ComplexNumber operator+=(const ComplexNumber& other) const; */ - /*! - Unary complex substraction. - */ - ComplexNumber operator-=(const ComplexNumber& other) const; + /* /\*! */ + /* Unary complex substraction. */ + /* *\/ */ + /* //ComplexNumber operator-=(const ComplexNumber& other) const; */ - /*! - Unary complex multiplication. - */ - ComplexNumber operator*=(const ComplexNumber& other) const; + /* /\*! */ + /* Unary complex multiplication. */ + /* *\/ */ + /* //ComplexNumber operator*=(const ComplexNumber& other) const; */ - /*! - Unary complex division. - */ - ComplexNumber operator/=(const ComplexNumber& other) const; + /* /\*! */ + /* Unary complex division. */ + /* *\/ */ + /* //ComplexNumber operator/=(const ComplexNumber& other) const; */ /*! Copy operator. */ ComplexNumber operator=(const ComplexNumber& other) const; - /*! - Equality test. - */ - bool operator==(const ComplexNumber& z1, const ComplexNumber& z2); - /*! - Inequality test. - */ - bool operator!=(const ComplexNumber& z1, const ComplexNumber& z2); - - /*! - Binary complex addition. - */ - ComplexNumber operator+(const ComplexNumber& z1, const ComplexNumber& z2); - - /*! - Binary complex substraction. - */ - ComplexNumber operator-(const ComplexNumber& z1, const ComplexNumber& z2); - - /*! - Binary complex multiplication. - */ - ComplexNumber operator*(const ComplexNumber& z1, const ComplexNumber& z2); - - /*! - Binary complex division. - */ - ComplexNumber operator/(const ComplexNumber& z1, const ComplexNumber& z2); + /* /\*! */ + /* Equality test. */ + /* *\/ */ + /* //bool operator==(const ComplexNumber& z1, const ComplexNumber& z2); */ + /* /\*! */ + /* Inequality test. */ + /* *\/ */ + /* // bool operator!=(const ComplexNumber& z1, const ComplexNumber& z2); */ + + /* /\*! */ + /* Binary complex addition. */ + /* *\/ */ + /* //ComplexNumber operator+(const ComplexNumber& z1, const ComplexNumber& z2); */ + + /* /\*! */ + /* Binary complex substraction. */ + /* *\/ */ + /* //ComplexNumber operator-(const ComplexNumber& z1, const ComplexNumber& z2); */ + + /* /\*! */ + /* Binary complex multiplication. */ + /* *\/ */ + /* //ComplexNumber operator*(const ComplexNumber& z1, const ComplexNumber& z2); */ + + /* /\*! */ + /* Binary complex division. */ + /* *\/ */ + /* //ComplexNumber operator/(const ComplexNumber& z1, const ComplexNumber& z2); */ /*! writes the complex in a stream. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 690cd6b0097f..ccc8260dcaa2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -7,8 +7,8 @@ namespace CGAL { \mainpage User Manual \anchor Chapter_Hyperbolic_Surface_Triangulations - -\authors Vincent Despré, Loïc Dubois, and Monique Teillaud +\cgalAutoToc +\authors Vincent Despré, Loïc Dubois, Marc Pouget and Monique Teillaud
@@ -16,13 +16,13 @@ namespace CGAL { This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. -A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that generates such domains in genus two. +A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that generates such domains in genus 2. For the case of the Bolza surface, which is the most symmetric surface of genus 2, we refer the user to the specific package \ref Periodic_4_hyperbolic_triangulation_2 "Periodic_4_hyperbolic_triangulation_2". \section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic Surfaces -We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. +We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces, see for instance \cgalCite{cgal:b-gdg-83}\cgalCite{cgal:b-gscrs-92}. The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable: this is without further mention. The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi: \mathbb{D} \to S \f$ is a (local) isometry. @@ -33,18 +33,18 @@ Paths and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. \subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental Domains and Triangulations Let \f$ S \f$ be a hyperbolic surface. For representing \f$ S \f$ on a computer, we cut \f$ S \f$ into "manageable" pieces. -A graph \f$ G \f$ embedded on \f$ S \f$ is a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) is a topological disk. +A graph \f$ G \f$ embedded on \f$ S \f$ defines a cellular decomposition of \f$ S \f$ if every face (every connected component of \f$ S \setminus G \f$ ) is a topological disk. In this document, every edge of a graph \f$ G \f$ embedded on \f$ S \f$ is a geodesic on \f$ S \f$. We consider two types of cellular decompositions of \f$ S \f$:
    -
  • We consider cellular decompositions \f$ G \f$ of \f$ S \f$ that have only one face. +
  • We consider cellular decompositions of \f$ S \f$ that have only one face. Cutting \f$ S \f$ open at the edges of \f$ G \f$ results in a hyperbolic polygon \f$ P \f$, which is a fundamental domain for \f$ S \f$. -The edges of \f$ P \f$ are paired, so that every edge of \f$ G \f$ is cut into two edges that are paired in \f$ P \f$. +Edges of \f$ G \f$ are cut into two edges that are paired in \f$ P \f$. Every hyperbolic surface admits a fundamental domain \f$ P \f$ that is convex, in that the interior angles of \f$ P \f$ do not exceed \f$ \pi \f$.
  • Also, we consider triangulations of \f$ S \f$. -A cellular decomposition \f$ T \f$ of \f$ S \f$ is a triangulation if every face of \f$ T \f$ is a "triangle": it admits three incidences with edges of \f$ T \f$. +A cellular decomposition defined by the graph \f$ T \f$ is a triangulation of \f$ S \f$ if every face of \f$ T \f$ is a "triangle": it admits three incidences with edges of \f$ T \f$. Observe that this definition allows for triangulations with only one vertex.
@@ -53,7 +53,7 @@ The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ c \subsection Section_Hyperbolic_Surface_Triangulations_generation Generation of Convex Fundamental Domains -This package can generate a convex fundamental domain \f$ P \f$ of a surface of genus two, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$, whose side pairings are \f$ A B C D \overline{A} \overline{B} \overline{C} \overline{D} \f$. +This package can generate a convex fundamental domain \f$ P \f$ of a surface of genus 2, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$, whose side pairings are \f$ A B C D \overline{A} \overline{B} \overline{C} \overline{D} \f$. The vertices and the side pairings are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is \f$ \overline{A} \f$. These octagons are symmetric, i.e. \f$ z_i = -z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. Such octagons are described in \cgalCite{aigon2005hyperbolic}. @@ -70,8 +70,8 @@ We represent every domain as a polygon in the Poincaré disk, given by the list Concerning the generation of domains, in order to perform fast and exact computations with the generated domains, every vertex must be a complex number whose type supports fast and exact computations. Under this constraint, it is not known how to generate domains of surfaces of genus greater than two. -In genus two, this package generates domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). -The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus two. +In genus 2, this package generates domains whose vertices belong to \f$ \mathbb{Q} + i \mathbb{Q} \f$ (their real and imaginary parts are rational numbers). +The exact generation process can be found in \cgalCite{despre2022experimental}, together with a proof that the surfaces that can be generated in this way are dense in the space of surfaces genus 2. \subsection Subsection_Hyperbolic_Surface_Triangulations_DS_Triangulations Data Structure for Triangulations @@ -101,7 +101,7 @@ It contains a lift \f$ t \f$ of a triangle of \f$ T \f$ in \f$ \mathbb{D} \f$: \ Let \f$ T \f$ be a triangulation of a hyperbolic surface. An edge \f$ e \f$ of \f$ T \f$ satisfies the Delaunay criterion if the imaginary part of its cross ratio \f$R_T(e)\f$ is non-positive. This definition is equivalent to the usual "empty disk" formulation. Then \f$ T \f$ is a Delaunay triangulation if every edge of \f$ T \f$ satisfies the Delaunay criterion. -If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateron, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. +If an edge \f$e \f$ of \f$ T \f$ does not satisfy the Delaunay criterion, then the two triangles incident to \f$ e \f$ form a strictly convex quadrilateral, so \f$ e \f$ can be deleted from \f$ T \f$ and replaced by the other diagonal of the quadrilateron. This operation is called a Delaunay flip. When a flip occurs, the cross ratios of the involved edges are modified via simple formulas. The Delaunay flip algorithm flips edges that do not satisfy the Delaunay criterion as long as possible, with no preference on the order of the flips. @@ -115,7 +115,7 @@ The package contains three main classes: - `CGAL::Hyperbolic_fundamental_domain_2` represents a convex fundamental domain of a hyperbolic surface. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex fundamental domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex fundamental domains of surfaces of genus 2. The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. @@ -123,11 +123,13 @@ Most classes of the package are templated by the concept `HyperbolicSurfaceTrait Also, the concept `ComplexNumber` describes a complex number type modeled by `CGAL::Complex_number`. +\section Visualization_Triangulation_lift Visualization of a triangulation lifted in the hyperbolic plane +The function `CGAL::Hyperbolic_surface_triangulation_2::lift()` enables to visualize a triangulation by computing a lift of every triangle in the hyperbolic plane, it is illustrated in the demo. \section Section_Hyperbolic_Surface_Triangulations_Example Example -The example below generates a convex fundamental domain of a surface of genus two, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation. +The example below generates a convex fundamental domain of a surface of genus 2, triangulates the domain, applies the Delaunay flip algorithm to the resulting triangulation, saves and prints the Delaunay triangulation. \cgalExample{Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and Implementation History diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 090ae6307728..85891026fff5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -19,7 +19,7 @@ \cgalPkgSummaryBegin \cgalPkgAuthors{Vincent Despré, Loïc Dubois, and Monique Teillaud} -\cgalPkgDesc{This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus two.} +\cgalPkgDesc{This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus 2.} \cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} \cgalPkgSummaryEnd @@ -43,11 +43,11 @@ \cgalCRPSection{Classes} -- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. It offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. +- `CGAL::Hyperbolic_surface_triangulation_2` represents a triangulation of a closed orientable hyperbolic surface. It offers functionalities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. - `CGAL::Hyperbolic_fundamental_domain_2` represents a fundamental domain of a closed orientable hyperbolic surface. -- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex domains of surfaces of genus two. +- `CGAL::Hyperbolic_fundamental_domain_factory_2` is a factory class, whose purpose is to generate some convex domains of surfaces of genus 2. - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 884b4af453f1..69c5c9a8daa4 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -35,8 +35,6 @@ class Hyperbolic_fundamental_domain_2 { public: typedef typename Traits::Hyperbolic_point_2 Point; - Hyperbolic_fundamental_domain_2(); - /* template */ /* Hyperbolic_fundamental_domain_2(PointRange vertices, */ /* PairingRange pairings); */ @@ -46,10 +44,10 @@ class Hyperbolic_fundamental_domain_2 { _pairings = std::vector(pairings.begin(), pairings.end()); } - int size() const; // Returns the number of vertices (equivalently, the number of sides) - const Point& vertex(int index) const; // Returns the index-th vertex - int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side - Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B + std::size_t size() const; // Returns the number of vertices (equivalently, the number of sides) + const Point& vertex(std::size_t index) const; // Returns the index-th vertex + std::size_t paired_side(std::size_t index) const; // Returns the index of the side paired to side A, where A is the index-th side + Hyperbolic_isometry_2 side_pairing(std::size_t index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B std::istream& from_stream(std::istream& s); std::ostream& to_stream(std::ostream& s) const; @@ -71,35 +69,24 @@ template std::istream& operator>>(std::istream& s, Hyperbolic_fund //////////////////////////////////////////////////////////////////////////////// template - Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(){} - -/* template */ -/* Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings){ */ -/* _vertices = std::vector(vertices.begin(), vertices.end()); */ -/* _pairings = std::vector(pairings.begin(), pairings.end()); */ -/* } */ - -//////////////////////////////////////////////////////////////////////////////// - -template -int Hyperbolic_fundamental_domain_2::size() const{ +std::size_t Hyperbolic_fundamental_domain_2::size() const{ return _vertices.size(); } template -const typename Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(int index) const{ +const typename Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(std::size_t index) const{ return _vertices[index]; } template -int Hyperbolic_fundamental_domain_2::paired_side(int index) const{ +std::size_t Hyperbolic_fundamental_domain_2::paired_side(std::size_t index) const{ return _pairings[index]; } template -Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(int index) const{ - int n = size(); - int paired_index = paired_side(index); +Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(std::size_t index) const{ + std::size_t n = size(); + std::size_t paired_index = paired_side(index); //const Point& p1,p2,q1,q2; const Point& q1 = vertex(index); @@ -115,7 +102,7 @@ Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pair template std::ostream& Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ - int n = size(); + std::size_t n = size(); s << std::to_string(n) << std::endl; @@ -136,7 +123,7 @@ std::istream& Hyperbolic_fundamental_domain_2::from_stream(std::istream& std::string line; s >> line; - int size = std::stoi(line); + std::size_t size = std::stoi(line); _vertices.reserve(size); _pairings.reserve(size); @@ -170,7 +157,7 @@ std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2 bool Hyperbolic_fundamental_domain_2::is_valid()const{ // Get the number of vertices - int n = _vertices.size(); + std::size_t n = _vertices.size(); // Check that the number of vertices is even if (n%2){ @@ -188,7 +175,7 @@ bool Hyperbolic_fundamental_domain_2::is_valid()const{ already_paired[k] = false; } for (int k=0; k=n)){ return false; } From c005b280ebc992014ed396df0681c61eb3562d34 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Mon, 6 Jan 2025 17:15:21 +0100 Subject: [PATCH 91/97] Mael review part2 --- .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_isometry_2.h | 24 ++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 40 +++--- .../include/CGAL/Hyperbolic_isometry_2.h | 12 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 120 +++++++++--------- 5 files changed, 110 insertions(+), 88 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 22f125dd5b55..43171f4fde75 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -6,7 +6,7 @@ namespace CGAL{ Factory class, whose only purpose is to construct random fundamental domains of closed orientable hyperbolic surfaces. -The method `make_hyperbolic_fundamental_domain_g2` constructs such a domain for +The method `make_hyperbolic_fundamental_domain_g2()` constructs such a domain for a surface of genus 2. \tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 6fc133bdaf97..3727389198c3 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -7,7 +7,7 @@ represents an isometry in the Poincaré disk model. The isometry \f$ f \f$ is represented by a list \f$ (c_0, c_1, c_2, c_3) \f$ of complex numbers, so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ z \f$ in the open unit disk. -Facilities are offered to compose isometries, and apply an isometry to a point. +Functionalities are offered to compose isometries, and apply an isometry to a point. \tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. */ @@ -28,9 +28,13 @@ class Hyperbolic_isometry_2{ /// \name Creation /// @{ /*! - Default constructor. + Default constructor to the identity. */ Hyperbolic_isometry_2(); + /*! + Constructor from coefficients. + */ + Hyperbolic_isometry_2(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); /// @} /*! @@ -39,17 +43,17 @@ class Hyperbolic_isometry_2{ void set_to_identity(); /*! - sets the coefficients of the isometry manually. \note Be - careful when doing so: the implementation does not check that the - resulting Möbius transform fixes the unit circle. + sets the coefficients of the isometry. + \warning The implementation does not check that the + resulting transformation is an isometry. */ void set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); /*! - sets a particular coefficient of the isometry manually. \note Be - careful when doing so: the implementation does not check that the - resulting Möbius transform fixes the unit circle. + sets a particular coefficient of the isometry. + \warning The implementation does not check that the + resulting transformation is an isometry. */ void set_coefficient(int index, const Complex_number& coefficient); @@ -68,6 +72,10 @@ class Hyperbolic_isometry_2{ evaluates the isometry at the point. */ Point evaluate(const Point& point) const; + /*! + evaluates the isometry at the point. + */ + Point operator()(const Point& point) const; /// @{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index cb429671f9bd..383634fa1e95 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -43,13 +43,13 @@ class Hyperbolic_surface_triangulation_2{ */ typedef Combinatorial_map<2, Attributes> Combinatorial_map_with_cross_ratios; /*! - Combinatorial map dart handle type. + Combinatorial map dart descriptor type. */ - typedef typename Combinatorial_map_with_cross_ratios::Dart_handle Dart_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor; /*! - Combinatorial map dart const handle type. + Combinatorial map dart const descriptor type. */ - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle Dart_const_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor; /*! Point type. */ @@ -59,7 +59,7 @@ class Hyperbolic_surface_triangulation_2{ stores a dart \f$ d \f$ of the combinatorial map, belonging to a triangle \f$ t \f$, and stores the three vertices of a lift of \f$ t \f$ in the hyperbolic plane. */ struct Anchor{ - typename Combinatorial_map_with_cross_ratios::Dart_handle dart; + typename Combinatorial_map_with_cross_ratios::Dart_descriptor dart; typename Traits::Hyperbolic_point_2 vertices[3]; }; /// @} @@ -72,7 +72,11 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2() {}; /*! - Constructor from a convex fundamental domain: triangulates the polygon of the domain, and identifies the paired sides of the domain. + Constructor from a convex fundamental domain: triangulates the polygon of + the domain. (The triangulation is defined by adding an internal edge + between domain.vertex(size-1) and the other vertices. The anchor has the + three vertices of indices size-1, 0 and 1 and the dart is the one between + the vertices of indices size-1 and 0.) */ Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); @@ -82,9 +86,9 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); /*! - Constructor from a decorated combinatorial map and an anchor. + Constructor from a decorated combinatorial map and an_anchor. */ - Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor); + Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& an_anchor); /// @} /// \name Assignment @@ -116,13 +120,13 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - Anchor& anchor(); - /*! - constant version of the getter. + const Anchor& anchor(); + /* /\*! */ + /* constant version of the getter. */ - \pre is_valid() && has_anchor() - */ - const Anchor& const_anchor(); + /* \pre is_valid() && has_anchor() */ + /* *\/ */ + /* const Anchor& const_anchor(); */ /// @} @@ -133,14 +137,14 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() */ - bool is_Delaunay_flippable(Dart_handle dart) const; + bool is_Delaunay_flippable(Dart_descriptor dart) const; /*! flips the edge supported by the dart. \pre is_valid() */ - void flip(Dart_handle dart); + void flip(Dart_descriptor dart); /*! determines if the triangulation is a valid Delaunay triangulation. @@ -165,7 +169,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; /// @} /// \name Validity @@ -173,7 +177,7 @@ class Hyperbolic_surface_triangulation_2{ /*! Validity test. Checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$. - If there is an anchor, then checks that the dart handle of the anchor does indeed point to a dart of \f$ M \f$, and checks that the three vertices of the anchor lie within the open unit disk. + If there is an anchor, then checks that the dart descriptor of the anchor does indeed point to a dart of \f$ M \f$, and checks that the three vertices of the anchor lie within the open unit disk. */ bool is_valid() const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 32c2935c68a7..3b94a30dfbe6 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -32,10 +32,11 @@ class Hyperbolic_isometry_2{ typedef typename Traits::Hyperbolic_point_2 Point; Hyperbolic_isometry_2(); + Hyperbolic_isometry_2(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); void set_to_identity(); - // Can be used to set the coefficients manually. Be careful when doing so : the implementation does not check that the resulting moebius transform fixes the unit circle. + // Can be used to set the coefficients manually. Warning : the implementation does not check that the resulting moebius transform fixes the unit circle. void set_coefficients(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3); void set_coefficient(int index, const Complex_number& coefficient); @@ -44,6 +45,7 @@ class Hyperbolic_isometry_2{ // Evaluates the isometry at point Point evaluate(const Point& point) const; + Point operator()(const Point& point) const; private: Complex_number _coefficients[4]; @@ -76,6 +78,10 @@ Hyperbolic_isometry_2::Hyperbolic_isometry_2(){ set_to_identity(); } +template +Hyperbolic_isometry_2::Hyperbolic_isometry_2(const Complex_number& c0, const Complex_number& c1, const Complex_number& c2, const Complex_number& c3){ + set_coefficients(c0,c1,c2,c3); +} //////////////////////////////////////////////////////////////////////////////// template @@ -117,6 +123,10 @@ typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(cons return Point(result.real(), result.imag()); } + template + typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::operator()(const Point& point) const{ + return evaluate(point); +} //////////////////////////////////////////////////////////////////////////////// template diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 3f9bd9d759b3..0c0524a7b3e7 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -49,17 +49,17 @@ class Hyperbolic_surface_triangulation_2{ typedef Combinatorial_map<2,Attributes> Combinatorial_map_with_cross_ratios; struct Anchor{ - typename Combinatorial_map_with_cross_ratios::Dart_handle dart; + typename Combinatorial_map_with_cross_ratios::Dart_descriptor dart; typename Traits::Hyperbolic_point_2 vertices[3]; }; - typedef typename Combinatorial_map_with_cross_ratios::Dart_handle Dart_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor; typedef typename Combinatorial_map_with_cross_ratios::Dart_range Dart_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range; - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_handle Dart_const_handle; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor; typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range Dart_const_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range; @@ -80,30 +80,30 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; - Anchor& anchor(); - const Anchor& const_anchor(); + const Anchor& anchor(); +// const Anchor& const_anchor(); void to_stream(std::ostream& s) const; void from_stream(std::istream& s); - bool is_Delaunay_flippable(Dart_const_handle dart) const; - void flip(Dart_handle dart); + bool is_Delaunay_flippable(Dart_const_descriptor dart) const; + void flip(Dart_descriptor dart); bool is_Delaunay() const; int make_Delaunay(); - std::vector> lift(bool center=true) const; + std::vector> lift(bool center=true) const; bool is_valid() const; //The following methods are not documented but they are non private for internal future use. - Dart_handle ccw(Dart_handle dart); - Dart_handle cw(Dart_handle dart); - Dart_handle opposite(Dart_handle dart); - Dart_const_handle const_ccw(Dart_const_handle dart) const; - Dart_const_handle const_cw(Dart_const_handle dart) const; - Dart_const_handle const_opposite(Dart_const_handle dart) const; + Dart_descriptor ccw(Dart_descriptor dart); + Dart_descriptor cw(Dart_descriptor dart); + Dart_descriptor opposite(Dart_descriptor dart); + Dart_const_descriptor const_ccw(Dart_const_descriptor dart) const; + Dart_const_descriptor const_cw(Dart_const_descriptor dart) const; + Dart_const_descriptor const_opposite(Dart_const_descriptor dart) const; - Complex_number get_cross_ratio(Dart_const_handle dart) const; + Complex_number get_cross_ratio(Dart_const_descriptor dart) const; // Returns the cross ratio of the points a,b,c,d Complex_number cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; @@ -115,8 +115,8 @@ class Hyperbolic_surface_triangulation_2{ bool _has_anchor = false; Anchor _anchor; - Dart_handle pick_edge_to_flip(); - Dart_const_handle pick_edge_to_flip() const; + Dart_descriptor pick_edge_to_flip(); + Dart_const_descriptor pick_edge_to_flip() const; void copy_from(Combinatorial_map_with_cross_ratios& cmap); void copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); @@ -136,13 +136,13 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang int size = domain.size(); // Make the triangles - std::vector dart_of_triangle(size-2); + std::vector dart_of_triangle(size-2); for (int k=0; k::has_anchor() const } template -typename Hyperbolic_surface_triangulation_2::Anchor& +const typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() { return _anchor; } - template -const typename Hyperbolic_surface_triangulation_2::Anchor& - Hyperbolic_surface_triangulation_2::const_anchor(){ - return _anchor; -} +/* template */ +/* const typename Hyperbolic_surface_triangulation_2::Anchor& */ +/* Hyperbolic_surface_triangulation_2::const_anchor(){ */ +/* return _anchor; */ +/* } */ //////////////////////////////////////////////////////////////////////////////// template -bool Hyperbolic_surface_triangulation_2::is_Delaunay_flippable(Dart_const_handle dart) const{ +bool Hyperbolic_surface_triangulation_2::is_Delaunay_flippable(Dart_const_descriptor dart) const{ return ( get_cross_ratio(dart).imag()>Number(0) ); } template -void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ +void Hyperbolic_surface_triangulation_2::flip(Dart_descriptor dart){ // First gather all the information needed - Dart_handle a = opposite(dart); // Get a fresh handle - Dart_handle b = ccw(a); - Dart_handle c = cw(a); + Dart_descriptor a = opposite(dart); // Get a fresh descriptor + Dart_descriptor b = ccw(a); + Dart_descriptor c = cw(a); - Dart_handle d = opposite(a); - Dart_handle e = ccw(d); - Dart_handle f = cw(d); + Dart_descriptor d = opposite(a); + Dart_descriptor e = ccw(d); + Dart_descriptor f = cw(d); Complex_number cross_ratio_AB = get_cross_ratio(e); Complex_number cross_ratio_BC = get_cross_ratio(f); @@ -353,7 +353,7 @@ template int Hyperbolic_surface_triangulation_2::make_Delaunay(){ int number_of_flips_done = 0; - Dart_handle edge_to_flip = pick_edge_to_flip(); + Dart_descriptor edge_to_flip = pick_edge_to_flip(); while (edge_to_flip != nullptr){ flip(edge_to_flip); edge_to_flip = pick_edge_to_flip(); @@ -365,20 +365,20 @@ int Hyperbolic_surface_triangulation_2::make_Delaunay(){ template -std::vector::Dart_const_handle, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ - std::vector> realizations; +std::vector::Dart_const_descriptor, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ + std::vector> realizations; size_t visited_darts_mark = _combinatorial_map.get_new_mark(); _combinatorial_map.unmark_all(visited_darts_mark); struct Compare { - bool operator()(std::pair const & x, std::pair const & y) { + bool operator()(std::pair const & x, std::pair const & y) { return x.second > y.second; } }; - std::priority_queue, std::vector>, Compare> queue; + std::priority_queue, std::vector>, Compare> queue; - std::unordered_map positions; + std::unordered_map positions; Dart_const_range darts = _combinatorial_map.darts(); @@ -397,7 +397,7 @@ std::vector value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); + std::tuple value = std::make_tuple(_anchor.dart, positions[_anchor.dart], positions[const_ccw(_anchor.dart)], positions[const_cw(_anchor.dart)]); realizations.push_back(value); Complex_number anchor_z0 (_anchor.vertices[0].x(), _anchor.vertices[0].y()); @@ -415,10 +415,10 @@ std::vector::is_valid() const{ // 2. Check the anchor, if any if (_has_anchor){ - // Check that the dart handle of the anchor points to a dart of the combinatorial map + // Check that the dart descriptor of the anchor points to a dart of the combinatorial map if ( !_combinatorial_map.is_dart_used(_anchor.dart) ){ return false; } @@ -501,7 +501,7 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ template void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ // Give indices to the darts - std::map darts_indices; + std::map darts_indices; int current_dart_index = 0; for (typename Dart_const_range::const_iterator it=_combinatorial_map.darts().begin(); it!=_combinatorial_map.darts().end(); ++it){ darts_indices[it] = current_dart_index; @@ -563,10 +563,10 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::is } // Load the triangles - std::vector darts_by_id (nb_darts); + std::vector darts_by_id (nb_darts); int index1, index2, index3; for (int k=0; k> line; index1 = std::stoi(line); @@ -581,7 +581,7 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::is } // Load the edges - Dart_handle dart_1, dart_2; + Dart_descriptor dart_1, dart_2; Complex_number cross_ratio; for (int k=0; k> line; @@ -617,45 +617,45 @@ void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2 -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::ccw(Dart_handle dart){ +typename Hyperbolic_surface_triangulation_2::Dart_descriptor Hyperbolic_surface_triangulation_2::ccw(Dart_descriptor dart){ return _combinatorial_map.beta(dart, 1); } template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::cw(Dart_handle dart){ +typename Hyperbolic_surface_triangulation_2::Dart_descriptor Hyperbolic_surface_triangulation_2::cw(Dart_descriptor dart){ return _combinatorial_map.beta(dart, 0); } template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::opposite(Dart_handle dart){ +typename Hyperbolic_surface_triangulation_2::Dart_descriptor Hyperbolic_surface_triangulation_2::opposite(Dart_descriptor dart){ return _combinatorial_map.opposite(dart); } template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(Dart_const_handle dart) const{ +typename Hyperbolic_surface_triangulation_2::Dart_const_descriptor Hyperbolic_surface_triangulation_2::const_ccw(Dart_const_descriptor dart) const{ return _combinatorial_map.beta(dart, 1); } template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(Dart_const_handle dart) const{ +typename Hyperbolic_surface_triangulation_2::Dart_const_descriptor Hyperbolic_surface_triangulation_2::const_cw(Dart_const_descriptor dart) const{ return _combinatorial_map.beta(dart, 0); } template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(Dart_const_handle dart) const{ +typename Hyperbolic_surface_triangulation_2::Dart_const_descriptor Hyperbolic_surface_triangulation_2::const_opposite(Dart_const_descriptor dart) const{ return _combinatorial_map.opposite(dart); } //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ +typename Hyperbolic_surface_triangulation_2::Complex_number Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_descriptor dart) const{ return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } //////////////////////////////////////////////////////////////////////////////// template - typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ + typename Hyperbolic_surface_triangulation_2::Dart_descriptor Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ if ( is_Delaunay_flippable(it) ){ @@ -668,7 +668,7 @@ template //////////////////////////////////////////////////////////////////////////////// template - typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ + typename Hyperbolic_surface_triangulation_2::Dart_const_descriptor Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ const auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ if ( is_Delaunay_flippable(it) ){ @@ -693,9 +693,9 @@ void Hyperbolic_surface_triangulation_2::copy_from(Combinato _combinatorial_map.clear(); // Copy the triangles and fill the darts conversion table - std::map darts_table; + std::map darts_table; for (typename Face_const_range::const_iterator it=cmap.template one_dart_per_cell<2>().begin(); it!=cmap.template one_dart_per_cell<2>().end(); ++it){ - Dart_handle new_dart = _combinatorial_map.make_combinatorial_polygon(3); + Dart_descriptor new_dart = _combinatorial_map.make_combinatorial_polygon(3); darts_table[it] = new_dart; darts_table[cmap.beta(it,0)] = _combinatorial_map.beta(new_dart,0); darts_table[cmap.beta(it,1)] = _combinatorial_map.beta(new_dart,1); @@ -703,8 +703,8 @@ void Hyperbolic_surface_triangulation_2::copy_from(Combinato // Sew the edges and set their cross-ratios for (typename Edge_const_range::const_iterator it=cmap.template one_dart_per_cell<1>().begin(); it!=cmap.template one_dart_per_cell<1>().end(); ++it){ - Dart_handle dart_1 = darts_table[it]; - Dart_handle dart_2 = darts_table[cmap.opposite(it)]; + Dart_descriptor dart_1 = darts_table[it]; + Dart_descriptor dart_2 = darts_table[cmap.opposite(it)]; Complex_number cratio = cmap.template info_of_attribute<1>(cmap.template attribute<1>(it)); _combinatorial_map.template sew<2>(dart_1, dart_2); From e57a777805aa770d7d18a0c072d0ae01c3d23260 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Tue, 7 Jan 2025 13:46:32 +0100 Subject: [PATCH 92/97] Mael review part3 --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 5 +++ .../CGAL/Hyperbolic_surface_triangulation_2.h | 31 ++++++++++--------- .../CGAL/Hyperbolic_fundamental_domain_2.h | 4 +-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 20 ++++++------ 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index c1758e485713..b4dc5c346f93 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -25,6 +25,11 @@ class Hyperbolic_fundamental_domain_2 { /// @} /// \name Creation /// @{ + /*! + Default constructor + */ + Hyperbolic_fundamental_domain_2(); + /*! Constructor from vertices and pairings ranges. @tparam PointRange a model of the concepts `RandomAccessContainer` whose `value_type` is `Point`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 383634fa1e95..f24b8a195730 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -31,7 +31,8 @@ the Delaunay flip algorithm, and the construction of a portion of the lift of th \tparam Traits must be a model of `HyperbolicSurfaceTraits_2`. -\tparam Attributes must be a model of `GenericMapItems`. +\tparam Attributes must be a model of `GenericMapItems` whose edges are +decorated with complex numbers to represent cross ratios. */ template> class Hyperbolic_surface_triangulation_2{ @@ -86,7 +87,7 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); /*! - Constructor from a decorated combinatorial map and an_anchor. + Constructor from a decorated combinatorial map and an anchor. */ Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& an_anchor); /// @} @@ -109,7 +110,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); /*! - tells if the triangulation has an anchor. + returns whether the triangulation has an anchor or not. \pre is_valid() */ @@ -120,20 +121,21 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - const Anchor& anchor(); - /* /\*! */ - /* constant version of the getter. */ + Anchor& anchor(); - /* \pre is_valid() && has_anchor() */ - /* *\/ */ - /* const Anchor& const_anchor(); */ + /*! + returns the anchor. + + \pre is_valid() && has_anchor() + */ + const Anchor& anchor() const; /// @} /// \name Delaunay Flip Algorithm /// @{ /*! - tells if if the edge supported by the dart is Delaunay flippable. + returns whether the edge supported by the dart is Delaunay flippable or not. \pre is_valid() */ @@ -152,7 +154,7 @@ class Hyperbolic_surface_triangulation_2{ bool is_Delaunay() const; /*! - applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. + applies the Delaunay flip algorithm: flips Delaunay-flippable edges until there is no such edge anymore. \pre is_valid() */ @@ -165,7 +167,7 @@ class Hyperbolic_surface_triangulation_2{ lifts the triangulation in the hyperbolic plane. Returns, for every triangle \f$ t \f$ of the triangulation, one of the darts of \f$ t \f$ in the combinatorial map of the triangulation, together with a triple \f$ p,q,r \f$ of points in the hyperbolic plane. The points \f$ p,q,r \f$ are the vertices of a lift of \f$ t \f$ in the hyperbolic plane. - If the center parameter is set to true, then one of the lifted triangles admits the origin \f$ 0 \f$ as a vertex. + If the center parameter is set to true, then one of the vertices of the anchor is translated to the origin \f$ 0 \f$. \pre is_valid() && has_anchor() */ @@ -175,8 +177,7 @@ class Hyperbolic_surface_triangulation_2{ /// \name Validity /// @{ /*! - Validity test. - Checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$. + Checks that the underlying combinatorial map \f$ M \f$ has no boundary and calls the is_valid method of \f$ M \f$. If there is an anchor, then checks that the dart descriptor of the anchor does indeed point to a dart of \f$ M \f$, and checks that the three vertices of the anchor lie within the open unit disk. */ bool is_valid() const; @@ -196,7 +197,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() */ - std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); + std::ostream& operator<<(std::ostream& s, const Hyperbolic_surface_triangulation_2& triangulation); /*! reads the triangulation from a stream. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 69c5c9a8daa4..a7fcb6dad01d 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -35,9 +35,7 @@ class Hyperbolic_fundamental_domain_2 { public: typedef typename Traits::Hyperbolic_point_2 Point; - /* template */ - /* Hyperbolic_fundamental_domain_2(PointRange vertices, */ - /* PairingRange pairings); */ + Hyperbolic_fundamental_domain_2(){}; template Hyperbolic_fundamental_domain_2(PointRange & vertices, PairingRange & pairings){ _vertices = std::vector(vertices.begin(), vertices.end()); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 0c0524a7b3e7..4ad169739589 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -80,8 +80,8 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; - const Anchor& anchor(); -// const Anchor& const_anchor(); + Anchor& anchor(); + const Anchor& anchor() const; void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -122,7 +122,7 @@ class Hyperbolic_surface_triangulation_2{ void copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); }; - template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); + template std::ostream& operator<<(std::ostream& s, const Hyperbolic_surface_triangulation_2& triangulation); template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); //////////////////////////////////////////////////////////////////////////////// @@ -239,16 +239,16 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const } template -const typename Hyperbolic_surface_triangulation_2::Anchor& +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() { return _anchor; } -/* template */ -/* const typename Hyperbolic_surface_triangulation_2::Anchor& */ -/* Hyperbolic_surface_triangulation_2::const_anchor(){ */ -/* return _anchor; */ -/* } */ +template +const typename Hyperbolic_surface_triangulation_2::Anchor& +Hyperbolic_surface_triangulation_2::anchor() const { + return _anchor; +} //////////////////////////////////////////////////////////////////////////////// @@ -604,7 +604,7 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::is //////////////////////////////////////////////////////////////////////////////// template -std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ +std::ostream& operator<<(std::ostream& s, const Hyperbolic_surface_triangulation_2& triangulation){ triangulation.to_stream(s); return s; } From 94b184896b34a5ed615a64ffd6e1757e547f9888 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Tue, 7 Jan 2025 17:20:17 +0100 Subject: [PATCH 93/97] solved bug (generated surface did not match) --- .../hs_test_factory.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index 606cb24d68ab..a8aebd1e875e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -22,14 +22,14 @@ int main() { Domain domain = factory.make_hyperbolic_fundamental_domain_g2(3459); std::vector vertices; - Point z0 = Point(FT("4881/5000"),FT("0")); - Point z1 = Point(FT("9211/10000"),FT("2733/10000")); - Point z2 = Point(FT("1709/5000"),FT("7253/10000")); - Point z3 = Point(FT("-427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); - Point z4 = Point(FT("-4881/5000"),FT("0")); - Point z5 = Point(FT("-9211/10000"),FT("-2733/10000")); - Point z6 = Point(FT("-1709/5000"),FT("-7253/10000")); - Point z7 = Point(FT("427262704257582473474868322141310044732400799603/1267155016747148041260345910894159385550919570000"),FT("-582571804584198065321856347012850217722442509611/1267155016747148041260345910894159385550919570000")); + Point z0 = Point(FT("2057/2500"),FT("0")); + Point z1 = Point(FT("6183/10000"),FT("2369/5000")); + Point z2 = Point(FT("93/625"),FT("9299/10000")); + Point z3 = Point(FT("-129263137397146717229370666475391966694612741374/530219238243800202784978257516468117328515435625"),FT("443541103604461956104066082668282544568945930056/530219238243800202784978257516468117328515435625")); + Point z4 = Point(FT("-2057/2500"),FT("0")); + Point z5 = Point(FT("-6183/10000"),FT("-2369/5000")); + Point z6 = Point(FT("-93/625"),FT("-9299/10000")); + Point z7 = Point(FT("129263137397146717229370666475391966694612741374/530219238243800202784978257516468117328515435625"),FT("-443541103604461956104066082668282544568945930056/530219238243800202784978257516468117328515435625")); vertices.push_back(z0); vertices.push_back(z1); vertices.push_back(z2); From e1b019871a0883696477f8611752e999531cf8b3 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Tue, 7 Jan 2025 17:21:25 +0100 Subject: [PATCH 94/97] Mael review part 4 --- .../CGAL/Hyperbolic_surface_triangulation_2.h | 16 +--------------- .../CGAL/Hyperbolic_surface_triangulation_2.h | 14 +++++++------- .../hs_test_circular_kernel.cpp | 3 --- .../hs_test_lazy_exact_nt.cpp | 3 --- .../hs_test_triangulation.cpp | 3 --- 5 files changed, 8 insertions(+), 31 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index f24b8a195730..92d33d23e878 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -81,11 +81,6 @@ class Hyperbolic_surface_triangulation_2{ */ Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); - /*! - Constructor from a decorated combinatorial map. - */ - Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); - /*! Constructor from a decorated combinatorial map and an anchor. */ @@ -104,8 +99,6 @@ class Hyperbolic_surface_triangulation_2{ /// @{ /*! returns the decorated combinatorial map. - - \pre is_valid() */ Combinatorial_map_with_cross_ratios& combinatorial_map(); @@ -121,14 +114,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - Anchor& anchor(); - - /*! - returns the anchor. - - \pre is_valid() && has_anchor() - */ - const Anchor& anchor() const; + Anchor& anchor() const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 4ad169739589..daa5c6436689 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -72,7 +72,7 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2() {}; Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); - Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); +// Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor); //Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2&& other); @@ -81,7 +81,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; Anchor& anchor(); - const Anchor& anchor() const; + Anchor& anchor() const; void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -203,10 +203,10 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang _has_anchor = true; } -template - Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap){ - copy_from(cmap); -} +/* template */ +/* Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap){ */ +/* copy_from(cmap); */ +/* } */ template Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor){ @@ -245,7 +245,7 @@ Hyperbolic_surface_triangulation_2::anchor() { } template -const typename Hyperbolic_surface_triangulation_2::Anchor& +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() const { return _anchor; } diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index a0639f13eef1..c15e3a3e3770 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -27,9 +27,6 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); - assert( ! triangulation1.has_anchor() ); - Triangulation triangulation (triangulation0); assert( triangulation.has_anchor() ); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index 3e235a1cee9c..a78bd159ef83 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -25,9 +25,6 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); - assert( ! triangulation1.has_anchor() ); - Triangulation triangulation (triangulation0); assert( triangulation.has_anchor() ); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index adc604b09f87..374342bab375 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -42,9 +42,6 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); - assert( ! triangulation1.has_anchor() ); - Triangulation triangulation (triangulation0); assert( triangulation.has_anchor() ); From daf25af65814813dd47a87c61eeae924b51bd77c Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 8 Jan 2025 06:39:27 +0100 Subject: [PATCH 95/97] aadded preconditions --- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 ++++++ .../include/CGAL/Hyperbolic_fundamental_domain_2.h | 6 ++++++ .../CGAL/Hyperbolic_surface_triangulation_2.h | 12 ++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 92d33d23e878..c845c988bc0b 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -109,6 +109,12 @@ class Hyperbolic_surface_triangulation_2{ */ bool has_anchor() const; + /*! + returns the anchor. + + \pre is_valid() && has_anchor() + */ + Anchor& anchor(); /*! returns the anchor. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index a7fcb6dad01d..85dd399770cd 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -16,6 +16,7 @@ #define CGAL_HYPERBOLIC_FUNDAMENTAL_DOMAIN_2 #include +#include #include #include @@ -68,21 +69,25 @@ template std::istream& operator>>(std::istream& s, Hyperbolic_fund template std::size_t Hyperbolic_fundamental_domain_2::size() const{ + CGAL_precondition(is_valid()); return _vertices.size(); } template const typename Hyperbolic_fundamental_domain_2::Point& Hyperbolic_fundamental_domain_2::vertex(std::size_t index) const{ + CGAL_precondition(is_valid()); return _vertices[index]; } template std::size_t Hyperbolic_fundamental_domain_2::paired_side(std::size_t index) const{ + CGAL_precondition(is_valid()); return _pairings[index]; } template Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pairing(std::size_t index) const{ + CGAL_precondition(is_valid()); std::size_t n = size(); std::size_t paired_index = paired_side(index); @@ -142,6 +147,7 @@ std::istream& Hyperbolic_fundamental_domain_2::from_stream(std::istream& template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ + CGAL_precondition(domain.is_valid()); return domain.to_stream(s); } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index daa5c6436689..060c9ef0a877 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -217,6 +217,7 @@ template template Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ + CGAL_precondition(other->is_valid()); if (other.has_anchor()){ copy_from(other.combinatorial_map(), other.anchor()); } @@ -235,18 +236,21 @@ typename Hyperbolic_surface_triangulation_2::Combinatorial_m template bool Hyperbolic_surface_triangulation_2::has_anchor() const { + CGAL_precondition(is_valid()); return _has_anchor; } template typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() { + CGAL_precondition(is_valid() && has_anchor()); return _anchor; } template typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() const { + CGAL_precondition(is_valid() && has_anchor()); return _anchor; } @@ -254,12 +258,13 @@ Hyperbolic_surface_triangulation_2::anchor() const { template bool Hyperbolic_surface_triangulation_2::is_Delaunay_flippable(Dart_const_descriptor dart) const{ + CGAL_precondition(is_valid()); return ( get_cross_ratio(dart).imag()>Number(0) ); } template void Hyperbolic_surface_triangulation_2::flip(Dart_descriptor dart){ - + CGAL_precondition(is_valid()); // First gather all the information needed Dart_descriptor a = opposite(dart); // Get a fresh descriptor @@ -351,6 +356,7 @@ bool Hyperbolic_surface_triangulation_2::is_Delaunay() const template int Hyperbolic_surface_triangulation_2::make_Delaunay(){ + CGAL_precondition(is_valid()); int number_of_flips_done = 0; Dart_descriptor edge_to_flip = pick_edge_to_flip(); @@ -366,6 +372,7 @@ int Hyperbolic_surface_triangulation_2::make_Delaunay(){ template std::vector::Dart_const_descriptor, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ + CGAL_precondition(is_valid() && has_anchor()); std::vector> realizations; size_t visited_darts_mark = _combinatorial_map.get_new_mark(); @@ -500,7 +507,8 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ template void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ - // Give indices to the darts + CGAL_precondition(is_valid() && has_anchor()); + // Give indices to the darts std::map darts_indices; int current_dart_index = 0; for (typename Dart_const_range::const_iterator it=_combinatorial_map.darts().begin(); it!=_combinatorial_map.darts().end(); ++it){ From 4a22b5e73653bdc9d4998f16f7905373808352bf Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 8 Jan 2025 17:13:05 +0100 Subject: [PATCH 96/97] Mael review continued --- .../CGAL/Hyperbolic_surface_traits_2.h | 13 +---- .../CGAL/Hyperbolic_surface_triangulation_2.h | 50 ++++++++++++++++++- .../Concepts/HyperbolicSurfaceTraits_2.h | 10 ++++ .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 36 ++++++++++--- 5 files changed, 90 insertions(+), 21 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h index f1b05e35afe4..07ec0e07d6ea 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_traits_2.h @@ -8,17 +8,6 @@ namespace CGAL{ \cgalModels{HyperbolicSurfaceTraits_2} */ template -class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { -public: - /// \name Types - /// @{ - /*! - represents a complex number, model of - `ComplexNumber`, over the field `HyperbolicSurfaceTraits_2::FT` for its real and - imaginary parts. - */ - typedef unspecified_type Complex_number; - /// @} -}; +class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass {}; }; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index c845c988bc0b..aec19e100f9c 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -51,6 +51,30 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial map dart const descriptor type. */ typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor; + /*! + Range of one dart for each vertex (that is 0-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range; + /*! + Range of one dart for each edge (that is 1-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range; + /*! + Range of one dart for each face (that is 2-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range; + /*! + Range of one dart for each vertex (that is 0-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<0> Vertex_const_range; + /*! + Range of one dart for each edge (that is 1-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range; + /*! + Range of one dart for each face (that is 2-cell) of the combinatorial map. + */ + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range; /*! Point type. */ @@ -120,7 +144,31 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - Anchor& anchor() const; + const Anchor& anchor() const; + /*! + returns the range of vertices. + */ +Vertex_range vertices_range(); + /*! + returns the range of edges. + */ +Edge_range edges_range(); + /*! + returns the range of faces. + */ +Face_range faces_range(); + /*! + returns the range of vertices. + */ +Vertex_const_range vertices_const_range() const; + /*! + returns the range of edges. + */ +Edge_const_range edges_const_range() const; + /*! + returns the range of faces. + */ +Face_const_range faces_const_range() const; /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h index 9b79789b6e79..888c98260edc 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfaceTraits_2.h @@ -11,4 +11,14 @@ This traits class must have a type for complex numbers. \cgalHasModelsEnd */ class HyperbolicSurfaceTraits_2 { +public: + /// \name Types + /// @{ + /*! + represents a complex number, model of + `ComplexNumber`, over the field `HyperbolicSurfaceTraits_2::FT` for its real and + imaginary parts. + */ + typedef unspecified_type Complex; + /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index ccc8260dcaa2..9d9a6eb898ca 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -17,7 +17,7 @@ namespace CGAL { This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. A triangulation of a surface can be generated from a convex fundamental domain of the surface. A method is offered that generates such domains in genus 2. -For the case of the Bolza surface, which is the most symmetric surface of genus 2, we refer the user to the specific package \ref Periodic_4_hyperbolic_triangulation_2 "Periodic_4_hyperbolic_triangulation_2". +For the case of the Bolza surface, which is the most symmetric surface of genus 2, we refer the user to the specific package \ref Chapter_2D_Periodic_Hyperbolic_Triangulations "2D Periodic Hyperbolic Triangulations". \section Section_Hyperbolic_Surface_Triangulations_Background Hyperbolic Surfaces diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 060c9ef0a877..0dea6c83b3c5 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -53,14 +53,16 @@ class Hyperbolic_surface_triangulation_2{ typename Traits::Hyperbolic_point_2 vertices[3]; }; - typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor; - typedef typename Combinatorial_map_with_cross_ratios::Dart_range Dart_range; + typedef typename Combinatorial_map_with_cross_ratios::Dart_descriptor Dart_descriptor; +//typedef typename Combinatorial_map_with_cross_ratios::Dart_range Dart_range; +// typedef typename Combinatorial_map_with_cross_ratios::Dart_range::iterator Dart_iterator; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<0> Vertex_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<1> Edge_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_range<2> Face_range; - typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor; + typedef typename Combinatorial_map_with_cross_ratios::Dart_const_descriptor Dart_const_descriptor; typedef typename Combinatorial_map_with_cross_ratios::Dart_const_range Dart_const_range; + typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<0> Vertex_const_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<1> Edge_const_range; typedef typename Combinatorial_map_with_cross_ratios::template One_dart_per_cell_const_range<2> Face_const_range; @@ -81,7 +83,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; Anchor& anchor(); - Anchor& anchor() const; + const Anchor& anchor() const; void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -110,6 +112,26 @@ class Hyperbolic_surface_triangulation_2{ // Returns the point d such that the cross ratio of a,b,c,d is cratio Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const Complex_number& cratio) const; +// Wrapper around the Cmap for iterating over vertices, edges or faces. +Vertex_range vertices_range(){ + return _combinatorial_map.template one_dart_per_cell<0>(); +} +Edge_range edges_range(){ + return _combinatorial_map.template one_dart_per_cell<1>(); +} +Face_range faces_range(){ + return _combinatorial_map.template one_dart_per_cell<2>(); +} +Vertex_const_range vertices_const_range() const { + return _combinatorial_map.template one_dart_per_cell<0>(); +} +Edge_const_range edges_const_range() const { + return _combinatorial_map.template one_dart_per_cell<1>(); +} +Face_const_range faces_const_range() const { + return _combinatorial_map.template one_dart_per_cell<2>(); +} + protected: Combinatorial_map_with_cross_ratios _combinatorial_map; bool _has_anchor = false; @@ -248,7 +270,7 @@ Hyperbolic_surface_triangulation_2::anchor() { } template -typename Hyperbolic_surface_triangulation_2::Anchor& +const typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() const { CGAL_precondition(is_valid() && has_anchor()); return _anchor; @@ -531,14 +553,14 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostr } // Store the triangles - for (typename Face_const_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<2>().begin(); it != _combinatorial_map.template one_dart_per_cell<2>().end(); ++it){ + for (typename Face_const_range::const_iterator it = faces_const_range().begin(); it != faces_const_range().end(); ++it){ s << darts_indices[it] << std::endl; s << darts_indices[const_cw(it)] << std::endl; s << darts_indices[const_ccw(it)] << std::endl; } // Store the edges - for (typename Edge_range::const_iterator it = _combinatorial_map.template one_dart_per_cell<1>().begin(); it != _combinatorial_map.template one_dart_per_cell<1>().end(); ++it){ + for (typename Edge_const_range::const_iterator it = edges_const_range().begin(); it != edges_const_range().end(); ++it){ s << darts_indices[it] << std::endl; s << darts_indices[const_opposite(it)] << std::endl; s << get_cross_ratio(it); From 4eb8ef0c75ac6b4411341f253152c96a64ead1dd Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 10 Jan 2025 08:11:03 +0100 Subject: [PATCH 97/97] added Marc as coauthor --- .../Hyperbolic_surface_triangulation_2/PackageDescription.txt | 2 +- .../include/CGAL/Complex_number.h | 2 +- .../include/CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../include/CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../include/CGAL/Hyperbolic_isometry_2.h | 2 +- .../include/CGAL/Hyperbolic_surface_traits_2.h | 2 +- .../include/CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 85891026fff5..81a5a2c221c7 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -18,7 +18,7 @@ \cgalPkgPicture{cover.svg} \cgalPkgSummaryBegin -\cgalPkgAuthors{Vincent Despré, Loïc Dubois, and Monique Teillaud} +\cgalPkgAuthors{Vincent Despré, Loïc Dubois, Marc Pouget and Monique Teillaud} \cgalPkgDesc{This package enables building and handling triangulations of closed orientable hyperbolic surfaces. Functionalities are offered such as the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the Poincaré disk model of the hyperbolic plane. Triangulations can be generated by triangulating a convex fundamental domain in the Poincaré disk model. A method is offered that generates such domains in genus 2.} \cgalPkgManuals{Chapter_Hyperbolic_Surface_Triangulations,PkgHyperbolicSurfaceTriangulation2Ref} \cgalPkgSummaryEnd diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h index 14f7eb20942f..8317db2d90ed 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Complex_number.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Complex_number diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 85dd399770cd..2aa460810c2e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Hyperbolic_fundamental_domain_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 61ed39927a00..ebfba3142da7 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Hyperbolic_fundamental_domain_factory_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 3b94a30dfbe6..a1657f900803 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Hyperbolic_isometry_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h index 7e2ef6aa28f7..6ba55998c0a9 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Hyperbolic_surface_traits_2 diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 0dea6c83b3c5..f03503267821 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -8,7 +8,7 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud +// Author(s) : Vincent Despré, Loïc Dubois, Marc Pouget, Monique Teillaud // This file contains the declaration and the implementation of the class Hyperbolic_surface_triangulation_2

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%0AHIrpKx=`sp0gyMJc55G^jWrX>8M9EfBXEJ4>;># zhRrS=5_(UPj^I1t-)2Mj{5mB9J_$JIV^HR2yNJ9W=YWqh9tVyIV+o2u&-%=|Tjy7n z;MWLl&Sx{_YlZMH`$;pF>2taY<&xty=kb|-+>?S=$-<2{ME~bJrsFmH_0WpUc}T`?d}!eq_pr@t$3CUYPnDD(kHqVFTId22>8*C_4DToT{uA(U z@w%SX^d9jCq9xvA1vlsLne+|<-d1QrgQ3T_`)xibQv?}Xl*rzvhCl|L`??9_65bU+UYp7oUm zE|&U!KyZ3f3q2Yri-s@w`#lwc8IS&I-uq+YTVOCGwv_^y9r*4_KmMh z9Z->m8JWnAkz z4>;Qab8Z<*l674q^!9atPYG_HueksX8SBlQ4{ZF^rNG(F2c=)^75ec$Jp)t zz%Bn%=sXgRdRg=L;*(!|?G^lmS2S+UoyimYC&B4*&HqeE*k875dUHPSrQKUQw@$1VikO5P0(E(LCt ztJAdJ-k17&%G(;Rjn#_0MqWBoaB86im*bwPK)UN`;J-swAK=}Mq@UkB?ZpQZ}f28@__aEIZxH)HR zlE}FYIP1C0rf0{;y8KjX_T&-zGk|kGR^F)Vqd7O=3c<5})P&uIzEW`eeB}p%n{%8m z7W%kPg#S4@;=_VpD|puH8b47A`jdj2bLKaR-5&aB_A)?$U7+R95xfX^xbn7G=&OcmdY=x+y-(Xod=K8@kR^ON z1Go4;paEmYP65vOyGHU?*pTCMO&>g<>C=SI>A=|zn{(cb9iA!lwKAaokubW^;P+_; zN11kU`cw`xLDFD{Nizd-0SWFhbb(Zg9^h38)!0bdTB<2C06ju1It7QA+| z1_lfM6L8jBmW+4x61?4h#xa8-`%_@Stt$<NYU2ytR^BE<462I2*k^r+ro@BwR9?(Fn;AaBobOmkWs22#mx4>ml7Kxr$3SME` zKk_#6o6~Ezw{bAk%)e@>t}ic1yeYt$-kc+vF8n77Zl8CK{!X_$_VJ(Az?r`}$KI6N zbl{deyR>5N*2$o4z*~t7p~2w@c=PWypWqrz-CN`wZSeaw?h|GOf|rXOzEJR`f>*q) z0kdDv^MmH^75-)%W~|_3%dgjghm-$(;H-yzw=}j(2O`jSgnZ%n6a#0yne#SBi2Qd6 zZq7wLPViTN^Lkg0^pAAxMA5Ko%%^s?R@mi2e>`xuOFKo69>Fgb`b6NIlV!l^GJBxL7iXb{9aRTHvngO%y%x<3jKD$(=&8ImSRD79@2bz+3N2z zz%BjDcVm(yW75!|Tm0oaL61wlm~QZgbcC4_?@Hj|%E{M4Z$FRX>R&W}`~LBMM>KBE zQ#Iu(SMYM57Q~E44Xe}XA{oy#{`u`#hZjzsCxEk_=iACvw8LSgw`{deP@JTzui#lh zonL00a2jx~NAqp-VsnMwzQ4Ed z?#IgC85)r7>vULf`#CmeDotNGLF?h~;<(HfyvjD-wFP)Mc|I2UbXgeNN6MRu3QwN| zobzjn$Q>j3avt#R9D|%|ZtC4U;G8aMreBDb_f`s?A@;Mm@aYBurZ?YH+AjF*f>%g+ zFzw)rz&YQmZS`oEp?^m+SSoye0p3!6hX$QvbiDTYyMW;Ke)KHC)2nrYI!n5uk z_5$a0c?UMOGm8W_-^IF2gnCSH^F5s$sQ~XAdNDA4g#LiRZT-_8u{z#z+xmfc=oh9;=0%!eH+SZ5PA@uh3y4T@cE#_Y- z^SP#;ZUoN!?el|oB44e1lyiYDmUtfr9!?KCh2FmJazF5J^(z51=$ z!=-lsaF(-D&IySXyZyD`_Vb8bm~Uo!`@Z#)1@~;x={-sG@Cfj5@;@5^e@*yg$#?y} z75#i2fqoF?Z&)64PJ52TTMV4br}-{`@r$kze7?=UT_w0V7k`BCc}@7+&rzAvHhj8X zjex%!0Y3=b(&t{C(4k^CI>9ew+F;fQQrPg+gC>MDuw>^tM)T^Ibht4!!L) zfBU%i8o}-JU+)?EFEwM+Pwa|y(k!R>9;0b@CJ3G-1$>z3bD!YBi#4ACg179b>yi0B z$+3c`32weilq7ft@Njy_16%>Cj$@1e`o~! z4&h_I8@N#NYa4L3dxK|&gFB4_=mz=f;LS*ri!kjAJ`|pjJt)K)r z%Tp~88hN$~AM^b{6mRQ#Pw>Pw`o5hG=-gv;yk*j1>LB=)g4_Lp2Y_?DaLcUA#Ct&K zYrfMsl4)IO$1?w>*JKMvxwX}oe*pJ1C8y;=Z@yz<`Xi4BZl7ma(L<-pzCZT`!R_-Y z#~r8ZsaM9ST8j*)0q1N`sroU&vKzR-$BU}`fb3&`3YYFXZh!gLtQ5H15VU%ooCXN|DZg}8q|Ag`WkOw~VVEj0L z1Mc&V&6`e_mZVOf84TnXmiosqoID_J4(Lmm9O<7KEXXd+ z3ls%Qaqsu}`T94?nfr&i4GaXP7tRXg%$YMF5GW}v${tyepED{S;!N}gGKNhIWQ?BZ z3uI&<2}6SulLP*Y(K(s@0~s?j2L}4)6cv_~28)Y=T7#ogh72DxCfQP1AP*YJ&CQ-# zkQXQ|&dx6_u`;ILn9y8jC}sG};6MR3$IAS1nW=$+*;7jb7BUj)_WPmX*|Yu70zdS5 z8;Z`zi2>vbas*j1kts8*;+|J%DLQ{zAZO&1l48bE@=F59pV@iErTNe);vRu|ff9(4 z8z{Xbn8%U${rzWW7tG4@&-SNSm|f*s8v}~73v-KRis;GS>3M~D#aw=873QN_%;aLO z6UT%pY5ohW;xl1lATx#kjY~m!4=}HSz{oLExw!YuFDcH}#pYj(17#Gd_=9m|mZk={ zko$bTWYp&T9F+Cq{KDxYb23YPzML7^#io?z_%pLd=J@^Dnf~z*Jw(o<=iy5ZjO9!~ zT(fdYM`nQSZ0IC4kXf4Sh2k#GF3t_)m$EL4AVBu?kl0X}U#CbU=P#2?__-!GS|y1@lVsvkUpo_ZyWIIX5A*D04u7i)J7-qX;=4NJgpD zg%$7Cv*PrGX7kZYJtSGz2AG_%_COb$$j10zuBroaivroXxw=T}`r4=xa;^MB6&OYm zSw3O(MCc2J)t&`D@67Dt3j;;PQ}atlvO<%ShZN16nqSD}As;Q(%wOm6QZf#PW+uxUkLSJWfs>0TWO>wFuTeP%^7{T6T`H z)5uN`q$GzB49zRZo>iEA3F-*S$n;rgyR2r+vg?}usEQDqd(^UgPEvByByl@boIO1+ z;Ik5!IW&;zhaT~c^(%8YZt!Nmv>{`mpInq(UCA1%lCI)KFo$^s1tT*@2GF*meNAR2 z{&5on155HRMS9r^qGXK?jKlwA-_Qn5xp^fy#rZ+@5i-a9nQxZf^q>Fkd`tfKRp(M35G{kGrf(iyElw^2T$XKNk&_l%#{p}CKu)B`q4_Jvc9Gl!zx)V zS~i;esbi*k`3;bx0$Jp#L-VF(!^QAtjz=xkZGC2GN-#UWc;x8JGXnX{${WbcgPT|C zD=8hBiM9g-1#pc=;DVzf%d7dF!5 zf2<)M$PF?2Ow-vhsrQ|mw8bgGf>|XferW-a{n4gbyV&*3Gxuj2d{WCoz6oIz>A^9gD9gN9 zy-HtwzkH0ZzUM#jOg$p-r$yKP`v0^==Zab15ztn{ZsI35HSvIc$Hapoq(Wwv4w#J= z17k3mrTt511<|7&^*imjPrJ)a+HqeXv>o^Tp>`ba9F2d?OnZMK4efYFeLHU9rpsr!IP{k9tINeHb@^O>QBG=i;@PE~5o zjJ%u+10^%^rNhJDG_06c~~c(8utC=0~EmKS5(<0po`onj5bHJ$`0@E2a}pBWN` zMHDh=F>L@R7IV|@M0q=kRv@DUS3pVT`wgGUYz#p~b5^iTGW3w=`mM&`&Vp?Jd^ zV+V~H6Z)inE@jxr$$HMDp)J)dXnpI=O?jh%oZt5?SfyNOo2ZmQs5G^SO8@lR{%`l& zl6hF$)SwwW0*rZpi)O(iLru%gMVqA9H3_8_i?ifzk%IZ9--yTRGo=z{pYD zHLwO3>ihR*IDBNLdH-~cbiu0!D zmtX`cP>P1Npr|mf1e2ub@5&@)E_~gRK=!OTlw-A|rFpqLT@sEWFb&)T*~P^eq0K8S zExv@N6=%=P3*^q4Ir9>{5^{%`n*7p6q=CS&34_LBe0AK=06MRM;p5=QjSz6e&V@D1l(-|H=Y*?lr^H75ZkMVPNcOnm{aYxRN8BU&X9DZ^w z`FAJR{Qkn}{@E-{rnYIm)R37*|D3=O3^lPEBn~o*sBL@bRPhj>KfnG-S}|sR1G)LL zQ}QrJCe01c26GZIOQ&0I>AZ59&D>$i% z?pWj*g=qn!8t=u$*}=RyIe9^NOPFXb!UW#5f})G{kb{4y*GeU(fJ}Gj-)F*yCTrgR z?OE5aWO|{FS`WMYX4chfpr~JPR;fQHefXG>gNIC+66n`Ar6KPI=NFC-BBKm-_%vk( z(#%2uzdtpnV9a!XF%|{Xv+?y0ScQORWQs4rY`tYtG=`B5zdvlz=+D&%BSeKo0c)KB zrb@Jsf#kl)efu-_@Z$9Uoy7$qwF853SY2RE>R<$$ml*t!I?{jA818pl7S0sh%t3+B ze_S3Xo5I+SM`18W$P+(#dA^h&2k@D4G3ip8ZR&Z$SQn-gbBcMCmATX}mcYsfF3vn- zWaiQ=duPpT>58N6hlu3!q0WrUn?AB|TInU2nNBN|-^?}B$d<}tm`U_N4%T!Sd0>is zjqOf>KP|uH?7ZTlk-D5o-A}eECkFLOF$rdLIUz51R!-iq0!&`c_WRPB!jgYT_5aJ= zzk#JiJVl~%R&>a^6KzcbD5jSNa!^)hS(a4_eyGufSC0lRyEtzw z+7Fmn_@FvEXgESQ5{A6#=tsS6_Yd{`h9N7kRrLR%s+hw4VQExMRfO4qx-R0W=Y~S| z+YOm7c~%g0F;6d~3N>A!D((lDL~B+LP@6{b&*^4shTS&Z9A@sLU$Vd6hQX|3tyx|m zdp4HwSj%p#`H(+aMU4IWBTLAdTKS_|NM;&ztL6?Enm-#2qA!(e+pN+&Kd-!FGgney zSy178DIsoCBcCZBMzv{KgNu^PqdS;tw}$WFL1DE)-L$`dclX*08+s+l{K^8M;ve>pMPrp-uqPNpL-|fHAu;CvPgxiq=nQTeG58 zdkX70Au|w~0a`blx2eNWVrQY~);GvQcvZ=8?mH>ZD*wP)~}Hi6F+>ic>7*G*`^n1qT2^Ie_AoL1y3CV6h1gT0~=O- z)|ZylOc-JI62 zod!)U39U|Y%UL=(vvi`=@gLhs3ywSXTKX#(67GEY# z!&-@4zptNh(^D_yL)gbx5;%T38*xiy3Dkw207A(oScpbi}ZH!|S*H zN3g`c0a%O7D;o2rbLX7b2x09IJJ`N7c@ogm7S=N_m#|CzkO!_;OE9N~1;e2}eSgDV zmJpAeg5ifLST}}0D8f^C`K`6+bIQaNYjiErB#GZll5j5IX39if>ghKf&IsL)M#i|H z#Q1$-^8_APL+1L!IWx#sUxOp}|FWwLBg#FhNNe*l2M16>{^(ja5bL#W^)<%KkI$6( zaejb2u{YLe-Wvuupn5iXO8kXJ%8U9^`(_y4GvZh!$!?6DwxHst+gf%6Q^7)BQ0x-FdH5+8IDyx zVDLvLim_G;)D82*JgBQJT;?RH_~?o2_5d}6m$x>U49@lt$3t40BE2YE_dCP2IjBfj zL(Pp^XyaqKn0Y)TQD13{x0@#3?w}xsGUn*kqw&BUM)LSADd$Z`6-;MR*Ep}`9>cE) zc)7Oud?R@gA;$5rhXpI!d6t@02>0V6{^9dsQ-hTuAkmAN{l?k&19mm7v?$YBrarj8 zwRYWKFtwq+49G7jnwf{u-T*JI!&>%0>5RNUNj{dYvS|O)bIz6`l6@f)+Runst^QnP!VVB`7~HA0V6;ES|u>*1z@jFS%$I2HtWpppiR^mrz;* zw=)Wpv1LaRVykrhicw?oF}Gx`fUKX6z_j1d?ys@NArN_l@dEAKhhIg)hPBD!r-tD_ ztM~D{W?d#ybRh{HEUR~B|8rT{xCIK+G+I*Cx0bp)^`8@GrZo#yUzqLPPSup`qi{*9&TIdeYbx zXfzNZ4n@QKNN5$~qTSR7fpKk!fOj1zN7h??T3r-~w24>XxGy+1`wqiETw_0_aE1lQb< zeJvnM%R}p05GXAgX_1wt%*Za8Vf|)W>~AT;crLGb#YO_GfW-m^u4h<-rgzZjXSvox zd6H4gO>c1?(_>vG_U>I`#hV%!0i-l^vo-I$;r@u;fn)v6pMxQtiRkUx*{#7(DdjSuoi1|N>rnKBCl zbiB6Y%g}1WXmfq{;Ap)Z)YCwAFo^R2*w2~Sq}R&5;C|@$|G6j4b}qnwdQV!uea~5= zJ!*bGD$96mN0TDnv~1@3!!D-i7l7kg|F5Bbg*ur1Q1f^^A381yjKT9?5Xk-X{;x0YDU~1fR zlJ2esC*7S+yOXpK;!e4$Y*$j{s;-CQ&SDg4HnTxOVnKvhgcS%_%$5}_h7AIVB@!Dp zi2MZu8)o=@uXE2i_uQ&mWjp;Cce-=!s{1_mobUPjeqS-QS|tsmAT#wl{aoq6;;>*Q zn~bSo3hxg4r^oXXGEDa0K@hM9#MoliHyi+&#FFl5j3*WhV)30m_Zm}cvw>*r-w|i= zu^+|*_eoBzuquidobCg1@3oc1qQp}DVz_fg(vr(NMKtEQQUg=D1 zA@mlKBF0LBc9@?`0oEgI66YJ^iR&_@mk>x?a{E{Q{=NAskW0+a8~0KChm0iMSN^V| zR}cdl`5_Jltx3O+n$l>Q8%`xaC8QD^!Jpt-FNE@^a#s zJ4eBX<+>-37-72py5ixbuXrFkp0cJ2#qo+B;D^oN>@BZTppplgIvix^g^5~DlqBMr z^_|<}{y2mGBiaWzUQdEp z$*YVLXbn;2+U5)%0gb>J*PjB^HXMwY9c`7)uIIH8^#W2P2elynQHEf_H%kyKFwQA> zvYM!_-lQ}N{_70!ey0|l5;Yfj(h(5b#|JA&_X2@_%i8J4MV3Z@OSB9hKus{KGom}9 z`ih+{VR$H~EF4Wh3lU_0*pCd6bTk{lB%1R`0p}5H+jBclJMH!Qhl}IK1Z^A)7srkF9pmMDno1vY{+cE1X3E>W%o_%P8e# z4e~Cp&5~+n2~S^mNpSs&14$8w3 zCiXsg&70j{-F_8O5n>gu-gyt7D3VN9fBDcRlp*j{<_<^#PrFwe7)nNknNGBJK|<(&yvUTN{3?#He)Et4;M9=z1{*TAg-mE=1tfW2GnQ`kzw{IQ|r+G0OLY)Xe4^x0DWCY;HO4w$s5gRcx;pT>q z!IED=)E-`Ob>r&T0edG9g%Z8K z1tjwAZ2#c^WG?#y1sD<)E19wBm$}XhTX&MuG%2|(Tv{=JXi@sJ6)&=w5t2kQCCsA2 zl+O8eVTzMJzF8b;LulFU9PMzOHvf{-<~jJ~U93>u(dq}mG^vb*3Zz4LYh}l?Jf*iX}uuD z3PdRZdJ=RCSh}+zi6|UMgSS2inBg(Z?+U*ck!;^ub}3;9)<)w5aXO_dM>PC&CKTi( zV4u6*V{n$Qp{o}2R0pW9iqDz2lji70GY zCxLq2Nx+O%0@ort1L26*%q;}CZ^^w6fvZF_20~QA7AYr1S9#A!CPVE4^hu(Y+KtQz zEjl2wa`Z|$d)WODrM`sj9ULPWM8Y&VPuH<=H*-qzx?hTCyfQf|N;Uyq1}9onjOHvl zhvRAZN$JS@l3+>RCk#e{DpF|4Xd3K|!P|g|h+ewRx)Z@2bA7Pm)4 zMj7q6&r<-xz)#{fODYbVuH=yR2x<B2ImL-ODntk-UEwmUDw6A#x^iIUQG67n7m}rvRYE40#h==DyQ1u6}~yDb`L(l zp3JET)2=rgE5kjBBMwd|2C$OXYuv7E1_>SAb)Jz5;?Z%?v zNK=GtLb2eb;b@LtLNyY6wHq9XTf$r!CJFOQV0;T?Vi#)UqB1I-FiT*+`VQC2a2uEA zvUT?fh^;&pp;Xzp)WaMB)t^1h8tB!B8R~GpOSvrb$lr>pz{tPl$M21z?uQ@3h>#}V<50j=Y=qe zyidxv%m}TM2-XgWaO20GMd)BK1xe5#P-70(_Y@kEHfRlpJ%6j!!5$Qh@50zme1%cNeH@K}(o!A-u(%eKX-Z4%F$ zGs@uT)m_qzAW5iG)@f7XvCl}C5~|O{3`!$ca5G8kk&bW@rvSS0a}f@zvZ{Qk^mLZS zuY4voyu1AYu@hIQ8uMVHewM2Ouv3;EEsZGtUASqpm{`=td)ESDfTv zv=@dE^OF+vu|GJ(Zg}T|El@abp-A}rJVVTVHYThmD4@@%OSYejm^}l1{Yb=jpar(- z<&>W=((_U`Ro3wgGWG{67Bu5dQSAXEE}9R(KFbrWE=qo}jK05gsuTuBDI4}d=?((v zK@03)ymJJm6;%591MileKDxb8ef_1bf!E=7DJC3!JW5y%@y#ks`0Ccy=H!;C;xfsr z)>)nbSz_U{t^B-}CcVahsKg2Q#wI01ScW-uD|4o^AsT#4eJ+{cA(|%!d%USq*0o!J zSlz6!ZLd2%{cu4AQW8IT{{ceN)GWJmI5?{lj-xw76Go=OL|6&TNs++x@_uVofWk2d zR>4+dmqkn+kt%`4568!d!L!X+FwFOQ(snKIVwH z@g0^w8lqxkEC~;Bcv-wm?H`E}H09JkMW(281iCqy5eB;#cv!b{IzAmBdW@2c8aD*N zP^Rr5OtWNak+r!AAifjSrW{hIbn1&tKqGhICbwEh4{LmGliu1TBub_;d`2EYyo4!B z$s87>b@{M^Feas@=rs#l&X02`ENp1`3p5sSIwqsa{7r?J@l7=HWc6bgUVfh)9FM^;(Xsie zoBOp<8H88`@`|8-1UVb^%%C+?5}*v@aydV_Mm-ie!({zBwamc7YEJBBq?VCZu9RAK zt`tm6!w*DVQ%L%2;5>53@Qt%xf`ju~q4rG_wQ}7M?<}(S!hz#3sGA#oEBnK^+l?KC zNSCaPq&M>tO5eb5Rw#O`?yx5<2XvrG;G8*HMrzNBU`15Y47X_ZHvS@ z{#A~tp;i{T6DH$P-?tIi;qmu zi%oB#fatu)Jj_V{2_5?l>3v1 zv1PnzqRP4Pd(2EJeaA`#_pt5oS#A~r9|(JvSBwS7{2@yDnY8o49K+Lv1zjgNno&%2 z$?Qitd^whvs{^SW1^Cf!X2{ri%g|ribY`ES+cLmju%O|Bw;(?(zn8rU;$_ep-H*a< ze+m#*5s)gT4{l&pExpLB*iW!XTvDs|a!`Xaw&H0_!^0AJG{^-t<*%5zu}CX=0osoT zn@?s9sXHNEE>NxWpUZIjlPxUNrD-OkYIf#mpY$I$c*F7X=Js67g!c!Pv}0wsiFT+T zlULL3x?xlTSBa#DZ8(#c2d9^3Uh0Ey z7W?cG6QcrzM2Gv@0_K`_Nx_(jHj%o*t6IOI%#4E`c*|ur%z-qra!Rv;frdwF?s=h$ z1R?`8Dd;gOHNqYN6Ga*uN(u-Gw!6bIdQPR9y~!+L16kf^F}d3_ zhNs@}VGswAIrcPjcrK)1sq9Rc-1bq-hyJ#Y!^$&6PUwEOe6K#NIa-Vju_5JeVSN&H==ES6p2GLL#*6_ubX=Tv@F*M?sO(AqCk=EE8B=0#DA6t7ViS3;AHB9K6h>LwAKTdQG*%Aiu{&d~b7?nQ_%YJ~*l$r%lP5FbUg|rXDR~6Bp_es=ld+^V9Fma^S1%Li<49qIr z7Aj^VqJd$5hFPL=+GF~cG`7d}&kKhA^|kHkHH9Da{^`d-LkN6QDhOjp+$#CUMtX$A zh|F|d(g9ktdR9ECD|&5{=m`%1amqj*co=T7*+w2>W{Xo-Sk)m!C*cpH0rU=Y6SV+; z>6=iDC4b8KNXUOR+*lr7j_=`_1F$)-JN7)E%E_Fxr%U4A_y=XXdIXbd}#T&5@^!EUb<^6@{^foFF*8&^WEthhfwnS{o?x z$^GCd01tw;a^dNCk3H-G5*kp1wLfIoQTlzl!qD&?=C)>hUSrpQg%DPP@^5a^k+yJI zh*V`rFv>wu1AUW9wxtveDCYof*nq`OD&q@YWKNgRqVCN555*vA-2s%An{_kQI<<0K(WVh#PHKW0?e*~hIGXNs z3{*Da;nXMzv?U|hEGYB2;l=b5a73K2;q7q;6i+~rJVOE)(Ujwb@G5CKm;?XyZ12jc z4@Mk7fmL6EHl=SWpiS>*2jmDCg8`)HCt0V*teNTgAI{yCYw$AgW8UhLIWgsS-9<;q z^OL~TF?fV2U6SJ>4;qVAP8U?iw9m5uB4I(&$3fes3r9LsZ^u|BuTYn;O!{knr>O|E z#W(qVDZ(bwu9rpZP+lyKp-$<8ShTGA z?6l~{rO>FQI7fxoNIoHvMwUvc$Mc54JpZ$af$n^GgNC zYc!cqG6P5GVSkz(O~)gUTM~rl$j0A@p_AsvFi#fA_m)kLkVVi_b+5=X7-%c-B!SiP zq8fSJ!w+gSD5>+jWfpE>jff80J8fdn!g2Ltyhv2cEoz-GAPHZMZAY3cU}3@5*{OpqqO-<-&8Q4A7-rgH9Yp* zD2A5=Gjh}&1gp%?Dgxi!oOF;cg1^MUU}$BcxHvzr*XtFf|4j&g0Fh_?_9)2UYeh;@ z+?hRnWyz|l6y|bw&N+^xt=(p!D7UfQMbT8o$@ZM)qD?Jbyb2C@E%iLV7gipdvml<7 zk2;EsB`<>zzx@Q z&gPU|k06d84T#qsM(B<-X)3ois20+*HeO+cS+BD>A|5#0Y<@WxUY2X--AYS$cJHDA z$K$c|Bha_z8^2gm>F~1;`VW$cyWBhSJ|Jwvn8{Eo;4YA|Eanq9egjcrets@o?30ql0!l-M zBJm-5u5x`+zvuEn%?6(DV2(6;BE$|2M9tkP)-A>60NUeCjP^Coej|fpU1tBIE)?36 zYu$sWLxbrp+1bdea76|KYKVNQ*7i!+z9yW=i$h^@VSY9;*D%{0$sRTMnhjR)?5VdN zr)MMK>UAeuiBowAqfSi_tV87>_6B-~{<#-+vX98(E`>@QX*MW^7K`E!tHAg*n}vaZ zh!kvK);ceh7M6H36q%XGeW5Yu0A;GYvOTy@h0qMif_1yCo+H5!_lv4W$^CN9SpHfrYREEm zz4kiLuA{{S@@3#r%wlGt5_3?Lh(*VKQ^|L5)RM&ky-GEpp_wYdaC1+A>6b<2zdfvt zgwqgE7|HvmG?oUBU=LGZ*r)DG6uG|;QDNBEGZ0;51QvvzGui>XD+yH?HQ;!L}UNO&F`mkhZk3@AY0V`jU~WA^Q~0I_9| zNm3FWkhuM9a#0MeB=IFSjMZL43FZml)tQ8sR$Ym(mC>G~c?jCJNcb-Os$}+5sxnwN zLWFeiF@ddF*`=c;o5WwDSc--R&|OY#V30c|Y~{8fw;sY+PSEOuvB)=q-3kg=9#Rl) z3(k9H_IiNRG)*)m(_tudhJ7%`fS!8LEkt|Gc8gRtiHaBqU&!kl*wKgU>O}C>EygOU zvNIG-I^wpDstwB>+V`kLwt;XBI``sn$EO(}-xJ`q`w$6K71AbewH@}$uI4kWysKtT zoLRi9W`(sK0}ocB54<$HSn(@@Xxr~ z(k4Y&p<7Py#;WT*G6Ub4z{-orBPdao`~~QP_k<+wV-pSd?`~(IO6m zQ9&5uj@b-6a1?o}lH?*2E-fsQ5~<8BU)8;_%mgWeWmK>buna8Y$F%2fPA1ZsEp(HS z$n%~t3Ua%}W;VM?G#!%VY4ki^LsHtuGNb^B9-x6%aA<7WJBaS@GAchqp2QYmy#gn> z3Fk+0#xO0zv7>>zusc+=6{}dVapnNgocTDf{}6f=v+XZ1n48^Qp0#ieyhwHOC!ZpO zk0nZj=iC#TDv{@eo3Av>^jb8^m!RndT5>e;V>DMsS?Jso|!n3-p5AH?YEJY zIFMxypSE!j{z_s)maGGJiGkoVLM7KUnzDI>sw%KSbu^e~Br}M$t~nWxhZ2XH_WcgG zm&J9E!@K=wy`uJRn=SoR3kS_Q;PqJyNndvqB?!>$p7rfF)FTBxM!#XyVfTwHRklQ< z6Boh{Qjf$=0l&eV_)x;(FBiysTZj`axu*zo#LJjTS^K_w)IqGbAUNt?>#(#Zxzr~M zUYCj1N;2COE7MJQ1n5N-Al7usSYJ!-s{<`(YatTWpHei4izeHcMvx5y{G)-?Qg6%$oGAglqSDBse6gaI*r`8)ZNsY^TN!D-JzA>0F+=zEFFo6{(yT_Aq zdP8&pNkOJf;?{zq`D+KZq62G7foIb7s8t*_IN!{sqABFa;KAf{rX*r+EWui&cOy0K zNFsG1zZ{88nK9WRs7fqQ>#|b5-;|O>-dMzAmNu#`#c4A7AiNigCDV=gJ>-2&ogIy+ zhx{kLfZu9t*M>cW>g7Xg)mY+E4cj~K-2)357x}nL5)9S*D*_I)qVBPPR%{x=P9J!* z#YrwlR+x!V>IHasu+2=U%6Ag1iRR3B1Cr+J)!(+4rxQ01m=nAZ=hp<_Se~^=Z4)gI zfmT}k&~R}Qi(aRf5vy2u0?gQb7~#nJbQ!hyb~j9i3uI{tSkbpgT&5~**VHFK%4sZK zjT#j^4Zqn9$Lg~~r035D;{~EqZ4|#pAIjW?<-lqg(vV{ff_s!8jrttb^K#XqL~0#W zr?o6vNFi&mMRHg^$1*9Hv$m(qSjh(%CP7lqGe7|cr!+&nwSAwN-X6l);xL{MX~^>x zs!q~H$q9ABPqq7qDach9QGDX8PwgG{2b>v7mzEJR>)EOjYcel$R)%V?a^;%!QjX3g zMhf&&lZ|FX`XZHAFTY+(8+!~n7&S+qr>?n!_}1&UZxam{2)Qt*M3KSungvuKSZ+O7 zAew6zt2!eJ0Xo-Oz(6`_vKqES#L@(K!U@-70b85!gVTqG4!jg*-<-zt-E4p|eh9;Z z{t$DxKARIMX2x0) z!2Fe5+5t~9Um$0)|CYGJrR(>)rF4$&y_A;H9NlyvKmr(G(bBqQ@;`19EpxJTE@RCH zv2AC;h}zyec{b@!52++1n~vv1jCe{~bd@k%R~D{KQ^LtYABO66kf!G+bLbX&KzK5H zA`Iqj(7X^es<}+pE_X$jyV+=;chPQ^B4MZF4D`AEtaAqH6>1WWb4)*iqL?D-T267Fy_*;fe~m+0)F9&(AYx*4g+J z=(qW^>})$)dEzgD?_dg4QXRF9y+s!l?!w=0l{o^nrsQ}j|8gvoR!LPx0Z@8;dFNwJ zeL${SY_0dcpdRQQCFSx}&YcjT`{iHXFC9%^ov@8D8Kfx~YeYgrr&iaSF6HDpxmps8 zJM)w$!Ego+XhuPgP=`gza3g2*Y{GC-J3OBm?He)Pm+omu66c!HtmepGPcLL`l} zdnbMA=Oj4@c91AI^n}L4GXjE9Poy;M4}G&bI)f7+1(wHW%HDa{cvV*PfwUDZEkNVF zT$;iUloSJLDQrojuWfJX7&(3+yVh7#=YG!d5HIIlSwk}zrc)!P2Niy9#E zlQtR!`UD2^Gn66IDKeqMHWiV8*%9KL(s0D)vn?5|Ve#N3mc|<~{VYJM zPO$Zt@Zm7!&>x0FFb69A%Orsyz)aP58i8f}TeWG0;d#}$1K$=M6H&+gs4$|GZzG)oq&N2%}k{7h|y3lU1~+HXI3^5(7mtiILUx*_937A1<4=CFBH z_BS)jb|i7XcmNWYoJkQwB*ZEoH9!z3aEtp;+ zq*gdYBBVD&!)o{^rA?babcIq6;i@>bn-bs@uB%%5jMEKR$=B8MT%ve#W^vj zBuMH@mVDq>t7?-$#yf88zq5Nl+12h%Qj<`UAh1AB3v5ZzC@!W6tC-)Tm9Y4)J5|!J zFFmb^LR*1$t#aq7*h?Uh_YMcg55`mKK>27LIp>x~HByFrd8B#5u4`wlboI(=XUjRp zSWmmPm@`5lN$IWVoW30kZ{V=H0TW^J+k!yAE7JD&pylM}&rKg&*M%wGA3X zQB9y|tfcH{a(6I`KrO;T^+xI>Ml?9kUVQr@?y0@Vq z)rc^wFHW_iD44{dn*K_}=CF(GU+#Q z#dUm_y6y<7UZ3a+{G<^VJlH7s##}0~=PW!2EZX9-c(kzMaoge`m@>KBL@_*$?#lZITx+6 za387Z=~8IWl@#2d)uw)MoFWi;?cH(J{HuRi8m!vZ?Ad7EIm8x3DZD+gpV+RL)V5B? z^ZwTH>0%2(C4^7r&%BQg7lUE%n}eQygdEp5=bhsk?@pYnwXNQ>Q(Qu}Xv@UkoBJGwy46pwuK+Jj>r1LtlzC|A+LsCkMK429ut>eZL5C*O79Lh z;7)otoBf8%bi3MhD8n-%^|dvZ1LmkKl}luu>9m6MX84Yk@Ig$?q z5MzX_QSFlc{5sC_6ZrR&dcKEWksoaPntpB@+SmW{b^P)(_-DsY^myBD`#a<3pN)Rs z#qa*{pX>3q{mp3quSUP`N5_9(kGJjX(f;xAAK?2R{OCtxyZ_S<@Z-M?MOw%^9?KlG0O;&)Y}6{C}p$-_jF){zvkIZQuAs`JIlZxfmb+m-vis(av9+;1~L%TbkegpZNX%1-|r; ze_fBW?VtRde{`+(HT~7Le-$17y=St6ZEZh0i~Vlf??uP|qaJVDPgh+3@1x`2_>Nr3 zw%@<26IyS;uB*S+{vkU4tN$$f+x8c1N8QHb_fLAfz5m+3>GgE`n!RW}{&n5j=3nsx zjlUiLnl3!s{)@hU+dsbke?-TB@dLTOZJ&J0j+Cv@PW zU;lsf_^;>}pZ=-*@acDC8(%N}{f9W7KC|P$tH*y=kKeX|k;}XJufNv5ikqh)(owI) z$H(v6u5a6~;rL(jj{i)r|JjQBx8q;K@icyR{m=FI&-M8KjpWzs*w_E_+c=okt{wl` zU(2|CrULX0eSVTZ^vAAi&-J(X%)kD>|BW2~?|&}a*MEu+bN{pBZQF?MzxF*juJ*ZX zx80HQgB@od-^B6snce>zdi=H?|DSp~+y4#wLASrF*N?Ab$E!GZN71v=AAcK75&r&L zdi~G;kbkZH1~zx_&+gxrC5aciciB__|9^7h-EY{HiT8-3O>iF(&iA25|9T5Fm F`+o*m Date: Thu, 5 Sep 2024 20:22:13 +0200 Subject: [PATCH 52/97] solved all issues by Andreas and Laurent on github conversation --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_fundamental_domain_2.h | 19 ++++++++++--------- .../Hyperbolic_fundamental_domain_factory_2.h | 4 ++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 1 - 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index fd0d541c88f0..fc2b2d9ee77d 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -78,7 +78,7 @@ class Hyperbolic_fundamental_domain_2 { \pre is_valid() */ - void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); + std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); /*! writes the domain in a stream. diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 43929bcc8380..e35e31bbe332 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -48,8 +48,8 @@ class Hyperbolic_fundamental_domain_2 { int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side Hyperbolic_isometry_2 side_pairing(int index) const;// Returns the isometry that maps side A to side B, where B is the index-th side, and A is the side paired to B - void from_stream(std::istream& s); - void to_stream(std::ostream& s) const; + std::istream& from_stream(std::istream& s); + std::ostream& to_stream(std::ostream& s) const; bool is_valid() const; @@ -59,7 +59,7 @@ class Hyperbolic_fundamental_domain_2 { }; template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain); -template void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); +template std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); //////////////////////////////////////////////////////////////////////////////// @@ -114,7 +114,7 @@ Hyperbolic_isometry_2 Hyperbolic_fundamental_domain_2::side_pair //////////////////////////////////////////////////////////////////////////////// template -void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ +std::ostream& Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ int n = size(); s << std::to_string(n) << std::endl; @@ -126,10 +126,11 @@ void Hyperbolic_fundamental_domain_2::to_stream(std::ostream& s) const{ for (int k=0; k -void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ +std::istream& Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ _vertices.clear(); _pairings.clear(); @@ -149,19 +150,19 @@ void Hyperbolic_fundamental_domain_2::from_stream(std::istream& s){ s >> p; _vertices.push_back(p); } + return s; } //////////////////////////////////////////////////////////////////////////////// template std::ostream& operator<<(std::ostream& s, const Hyperbolic_fundamental_domain_2& domain){ - domain.to_stream(s); - return s; + return domain.to_stream(s); } template -void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ - domain.from_stream(s); +std::istream& operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain){ + return domain.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 2a9b418cca07..7bd988718225 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -52,7 +52,7 @@ class Hyperbolic_fundamental_domain_factory_2{ bool sanity_check(_Cmplx& z0, _Cmplx& z1, _Cmplx& z2, _Cmplx& z3); - const int _DENOMINATOR_FOR_GENERATION = 10000; + const int CGAL_DENOMINATOR_FOR_GENERATION = 10000; }; //////////////////////////////////////////////////////////////////////////////// @@ -148,7 +148,7 @@ typename Traits::FT Hyperbolic_fundamental_domain_factory_2::exact_numbe if (x< 0){ return _FT(0)-exact_number_from_float(-x); } - return _FT(int(x*_DENOMINATOR_FOR_GENERATION)%_DENOMINATOR_FOR_GENERATION)/_FT( _DENOMINATOR_FOR_GENERATION); + return _FT(int(x*CGAL_DENOMINATOR_FOR_GENERATION)%CGAL_DENOMINATOR_FOR_GENERATION)/_FT(CGAL_DENOMINATOR_FOR_GENERATION); } template diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 3f16e32a6f96..860027ff1fba 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -217,7 +217,6 @@ template //////////////////////////////////////////////////////////////////////////////// template -//Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ copy_from(other.combinatorial_map(), other.anchor()); From d70ba46d392f4e950816b422870eae92aaa70e3e Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 6 Sep 2024 13:27:08 +0200 Subject: [PATCH 53/97] doc details --- .../CMakeLists.txt | 10 ++-- ...perbolic_surface_triangulation_2_demo.cpp} | 0 .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 25 ++++---- .../examples.txt | 2 +- .../data/domain | 10 ---- .../data/input triangulation | 58 ------------------- .../data/output triangulation | 58 ------------------- .../hyperbolic_surface_triangulation.cpp | 17 +++--- 9 files changed, 27 insertions(+), 155 deletions(-) rename Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/{demo.cpp => Hyperbolic_surface_triangulation_2_demo.cpp} (100%) delete mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain delete mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation delete mode 100644 Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt index be14b584c4d5..e0d9a639e31a 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.15) -project( Hyperbolic_surface_triangulation_2_Demo ) +project( Hyperbolic_surface_triangulation_2_demo ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -43,12 +43,12 @@ endif() # ui files, created with Qt Designer qt6_wrap_ui(UIS drawing_window_description.ui) -add_executable( demo demo.cpp window.cpp ${UIS}) +add_executable( Hyperbolic_surface_triangulation_2_demo Hyperbolic_surface_triangulation_2_demo.cpp window.cpp ${UIS}) -add_to_cached_list( CGAL_EXECUTABLE_TARGETS demo ) +add_to_cached_list( CGAL_EXECUTABLE_TARGETS Hyperbolic_surface_triangulation_2_demo ) -target_link_libraries(demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets ) +target_link_libraries(Hyperbolic_surface_triangulation_2_demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets ) set(CMAKE_BUILD_TYPE "Release") -target_include_directories(demo PRIVATE ../../include/) +target_include_directories(Hyperbolic_surface_triangulation_2_demo PRIVATE ../../include/) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2_demo.cpp diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 5b078faba18f..93ff5107ad82 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -193,7 +193,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() */ - void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); + std::istream& operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); /// @} }; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 354cde3e8f5e..8c7a1a5385ba 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -23,11 +23,11 @@ A triangulation of a surface can be generated from a convex fundamental domain o We assume some familiarity with basic notions from covering space theory, and from the theory of hyperbolic surfaces. The Poincaré disk \f$ \mathbb{D} \f$ is a model of the hyperbolic plane whose point set is the open unit disk of the complex plane \f$ \mathbb{C} \f$. -In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable : this is without further mention. +In this package, every hyperbolic surface \f$ S \f$ is closed (compact, and without boundary) and orientable: this is without further mention. The Poincaré disk \f$ \mathbb{D} \f$ is a universal covering space for \f$ S \f$, whose projection map \f$ \pi : \mathbb{D} \to S \f$ is a (local) isometry. -The pre-image \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. +The pre-image set \f$ \pi^{-1}(x) \f$ of a point \f$ x \in S \f$ is infinite, its points are the lifts of \f$ x \f$. We usually denote by \f$ \widetilde x \f$ a lift of \f$ x \f$. -Paths, and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. +Paths and triangulations of \f$ S \f$ can also be lifted in \f$ \mathbb{D} \f$. \subsection Section_Hyperbolic_Surface_Triangulations_domains Fundamental domains and triangulations @@ -54,7 +54,7 @@ The assumption that \f$ P \f$ is convex ensures that the interior of \f$ P \f$ c This package can generate a convex fundamental domain \f$ P \f$ of a surface of genus two, with eight vertices \f$ z_0, \dots, z_7 \in \mathbb{C} \f$, whose side pairings are \f$ A B C D \overline{A} \overline{B} \overline{C} \overline{D} \f$. The vertices and the side pairings are in counter-clockwise order, the side between \f$ z_0 \f$ and \f$ z_1 \f$ is \f$ A \f$, and the side between \f$ z_4 \f$ and \f$ z_5 \f$ is \f$ \overline{A} \f$. -Those octagons are symmetric, .i.e \f$ z_i = z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. +These octagons are symmetric, i.e. \f$ z_i = -z_{i+4} \f$ for every \f$ i \f$, where indices are modulo eight. Such octagons are described in \cgalCite{aigon2005hyperbolic}.

Bn_ie~#Wtg`hF}fS6rv^*;js93!l?t^Tk)sebE( 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 +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace CGAL; + +typedef Cartesian> Kernel; +typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; +typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_fundamental_domain_2 Domain; +typedef Hyperbolic_fundamental_domain_factory_2 Factory; +typedef Hyperbolic_surface_triangulation_2 Triangulation; + +typedef typename Traits::Hyperbolic_point_2 Point; + +int main() { + Factory factory (3459); + Domain domain = factory.generate_domain_g2(); + Triangulation triangulation0 = Triangulation(domain); + + assert( triangulation0.is_valid() ); + + Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + assert( ! triangulation1.has_anchor() ); + + Triangulation triangulation (triangulation0); + assert( triangulation.has_anchor() ); + + std::stringstream buffer; + buffer << triangulation; + buffer >> triangulation; + + std::vector> input_not_centered; + std::vector> input_centered; + + input_not_centered = triangulation.lift(false); + input_centered = triangulation.lift(); + + triangulation.make_delaunay(); + + assert( triangulation.is_delaunay() ); + + std::vector> output_not_centered; + std::vector> output_centered; + + output_not_centered = triangulation.lift(false); + output_centered = triangulation.lift(); + + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); + Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + assert( cmap.is_dart_used(anchor.dart) ); + + std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; + + return 0; +} diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index fef77c2b4414..45a52abf82a9 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -77,6 +77,8 @@ int main() { triangulation.make_delaunay(); + assert( triangulation.is_delaunay() ); + std::vector> output_not_centered; std::vector> output_centered; From 88576a03c94d507a956c64e06f16dfd667f009ee Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 14:38:40 +0100 Subject: [PATCH 18/97] Fix dependencies --- .../doc/Hyperbolic_surface_triangulation_2/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies index 904b349392fa..f97708a4db49 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/dependencies @@ -2,3 +2,4 @@ Manual Stream_support Number_types Combinatorial_map +Hyperbolic_triangulation_2 From 968b6d7451d781c726db95b7e864b2a380073c50 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 15:48:09 +0100 Subject: [PATCH 19/97] Fix some compilation errors in demo and test --- .../CMakeLists.txt | 14 +++++++------- .../include/CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt index 65eaad14d2c6..de926533c2d8 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt @@ -11,9 +11,9 @@ set(CMAKE_AUTOMOC ON) # CGAL and its components -find_package(CGAL REQUIRED COMPONENTS Core Qt5) -include(${CGAL_USE_FILE}) -find_package(Qt5 QUIET COMPONENTS Widgets) +find_package(CGAL REQUIRED COMPONENTS Core Qt6) + +find_package(Qt6 QUIET COMPONENTS Widgets) if ( NOT CGAL_FOUND ) @@ -22,9 +22,9 @@ if ( NOT CGAL_FOUND ) endif() -if ( NOT CGAL_Qt5_FOUND ) +if ( NOT CGAL_Qt6_FOUND OR NOT Qt6_FOUND) - message(STATUS "This project requires the Qt5 library, and will not be compiled.") + message(STATUS "This project requires the Qt6 library, and will not be compiled.") return() endif() @@ -41,13 +41,13 @@ if ( NOT Boost_FOUND ) endif() # ui files, created with Qt Designer -qt5_wrap_ui(UIS drawing_window_description.ui) +qt6_wrap_ui(UIS drawing_window_description.ui) add_executable( demo demo.cpp window.cpp ${UIS}) add_to_cached_list( CGAL_EXECUTABLE_TARGETS demo ) -target_link_libraries(demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 Qt5::Widgets ) +target_link_libraries(demo PRIVATE CGAL::CGAL CGAL::CGAL_Qt6 Qt6::Widgets ) set(CMAKE_BUILD_TYPE "Release") diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 638b998aee8f..2429cee7e8d8 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -180,7 +180,7 @@ bool Hyperbolic_fundamental_domain_2::is_valid()const{ } // Check that the _pairings vector encodes a perfect matching of the set {0,1,\dots,n-1} - bool already_paired[n]; + std::vector already_paired(n); for (int k=0; k::Hyperbolic_surface_triangulation_2(c int size = domain.size(); // Make the triangles - Dart_handle dart_of_triangle[size-2]; + std::vector dart_of_triangle(size-2); for (int k=0; k::ComplexNumber Hyperbolic_su //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ for (typename Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ if ( is_delaunay_flippable(it) ){ return it; From 7ac01194f20af6f124e1c7f93860392abf9c7339 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 15:55:37 +0100 Subject: [PATCH 20/97] Fix CMakeLists.txt --- .../CMakeLists.txt | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt index 52eca3058053..e71019842e2c 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt @@ -1,35 +1,16 @@ -cmake_minimum_required(VERSION 3.1...3.15) +cmake_minimum_required(VERSION 3.1...3.23) -project( examples ) +project( Hyperbolic_surface_triangulation_2_Examples ) # CGAL and its components -find_package( CGAL QUIET COMPONENTS ) +find_package( CGAL REQUIRED ) -if ( NOT CGAL_FOUND ) - message(STATUS "This project requires the CGAL library, and will not be compiled.") - return() - -endif() - -# Boost and its components -find_package( Boost REQUIRED ) - -if ( NOT Boost_FOUND ) - - message(STATUS "This project requires the Boost library, and will not be compiled.") - - return() - -endif() - -add_executable( example example.cpp ) - -add_to_cached_list( CGAL_EXECUTABLE_TARGETS example) - -target_link_libraries(example PRIVATE CGAL::CGAL ) - -set(CMAKE_BUILD_TYPE "Release") - -######################################################################### -target_include_directories(example PRIVATE ../../include/) +# create a target per cppfile +file( + GLOB cppfiles + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +foreach(cppfile ${cppfiles}) + create_single_source_cgal_program("${cppfile}") +endforeach() From 4fcc5ea0111392a5637836bfa7e37f175f12be14 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 16:01:31 +0100 Subject: [PATCH 21/97] Fix path to examples --- .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../doc/Hyperbolic_surface_triangulation_2/examples.txt | 2 +- .../CMakeLists.txt | 0 .../data/domain | 0 .../data/input triangulation | 0 .../data/output triangulation | 0 .../example.cpp | 0 7 files changed, 2 insertions(+), 2 deletions(-) rename Hyperbolic_surface_triangulation_2/examples/{Hyperbolic_surface_triangulation_2_Example => Hyperbolic_surface_triangulation_2}/CMakeLists.txt (100%) rename Hyperbolic_surface_triangulation_2/examples/{Hyperbolic_surface_triangulation_2_Example => Hyperbolic_surface_triangulation_2}/data/domain (100%) rename Hyperbolic_surface_triangulation_2/examples/{Hyperbolic_surface_triangulation_2_Example => Hyperbolic_surface_triangulation_2}/data/input triangulation (100%) rename Hyperbolic_surface_triangulation_2/examples/{Hyperbolic_surface_triangulation_2_Example => Hyperbolic_surface_triangulation_2}/data/output triangulation (100%) rename Hyperbolic_surface_triangulation_2/examples/{Hyperbolic_surface_triangulation_2_Example => Hyperbolic_surface_triangulation_2}/example.cpp (100%) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index bc2765772210..449281561e3f 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -126,7 +126,7 @@ Also, the concept `ComplexWithoutSqrt` describes a complex number type that does \section Section_Hyperbolic_Surface_Triangulations_Example Example The examples below generates a convex fundamental domain of a surface of genus two, triangulate the domain, apply the Delaunay flip algorithm to the resulting triangulation, and save and print the Delaunay triangulation. -\cgalExample{Hyperbolic_surface_triangulation_2_Example/example.cpp} +\cgalExample{Hyperbolic_surface_triangulation_2/example.cpp} \section Section_Hyperbolic_Surface_Implementation_History Design and implementation history diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt index c7e5a40b9501..91f2dba7f06b 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/examples.txt @@ -1,3 +1,3 @@ /*! -\example Hyperbolic_surface_triangulation_2_Example/example.cpp +\example Hyperbolic_surface_triangulation_2/example.cpp */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/CMakeLists.txt similarity index 100% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/CMakeLists.txt rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/CMakeLists.txt diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain similarity index 100% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/domain rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/domain diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation similarity index 100% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/input triangulation rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/input triangulation diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation similarity index 100% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/data/output triangulation rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/data/output triangulation diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp similarity index 100% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2_Example/example.cpp rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp From 85b57bad32ae651a93c250195f05b46e0451c9bc Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 16:04:16 +0100 Subject: [PATCH 22/97] Rename demo directory --- .../CMakeLists.txt | 0 .../demo.cpp | 0 .../drawing_window_description.ui | 0 .../window.cpp | 0 .../window.h | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename Hyperbolic_surface_triangulation_2/demo/{Hyperbolic_surface_triangulation_2_Demo => Hyperbolic_surface_triangulation_2}/CMakeLists.txt (100%) rename Hyperbolic_surface_triangulation_2/demo/{Hyperbolic_surface_triangulation_2_Demo => Hyperbolic_surface_triangulation_2}/demo.cpp (100%) rename Hyperbolic_surface_triangulation_2/demo/{Hyperbolic_surface_triangulation_2_Demo => Hyperbolic_surface_triangulation_2}/drawing_window_description.ui (100%) rename Hyperbolic_surface_triangulation_2/demo/{Hyperbolic_surface_triangulation_2_Demo => Hyperbolic_surface_triangulation_2}/window.cpp (100%) rename Hyperbolic_surface_triangulation_2/demo/{Hyperbolic_surface_triangulation_2_Demo => Hyperbolic_surface_triangulation_2}/window.h (100%) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/CMakeLists.txt rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/demo.cpp rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/drawing_window_description.ui similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/drawing_window_description.ui rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/drawing_window_description.ui diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.cpp rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h similarity index 100% rename from Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2_Demo/window.h rename to Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h From a409b030331c39babd4e2e1de0dd37e4241b6a7a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 16:18:49 +0100 Subject: [PATCH 23/97] Change project name --- .../demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt index de926533c2d8..5ae0f6f4b7e2 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.15) -project( demo ) +project( Hyperbolic_surface_triangulation_Demo ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) From d4d9700b7060acd3d5995b9277f74c774c2d6b3e Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 5 Jun 2024 17:12:36 +0100 Subject: [PATCH 24/97] Change project name --- .../demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt index 5ae0f6f4b7e2..be14b584c4d5 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1...3.15) -project( Hyperbolic_surface_triangulation_Demo ) +project( Hyperbolic_surface_triangulation_2_Demo ) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) From 64eb0ade10004565382a13e17d3288d9a879d8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 5 Jun 2024 22:01:39 +0200 Subject: [PATCH 25/97] Add dependencies of HST2 --- .../dependencies | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies index 9d8c303c7eb9..279a01a72ae2 100644 --- a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -1 +1,24 @@ +Algebraic_foundations +Arithmetic_kernel +BGL +Cartesian_kernel +Circulator Combinatorial_map +Distance_2 +Distance_3 +Filtered_kernel +Hash_map +Homogeneous_kernel +Installation +Intersections_2 +Intersections_3 +Interval_support +Kernel_23 +Kernel_d +Modular_arithmetic +Number_types +Profiling_tools +Property_map +Random_numbers +STL_Extension +Stream_support From 7fa4f6455b14c6e74df3a5eb82617822b3e0988d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 5 Jun 2024 22:28:05 +0200 Subject: [PATCH 26/97] Remove unnecessary licence headers --- .../demo/Hyperbolic_surface_triangulation_2/demo.cpp | 12 ------------ .../CGAL/Complex_without_sqrt.h | 3 --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 3 --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 3 --- .../CGAL/Hyperbolic_isometry_2.h | 3 --- .../CGAL/Hyperbolic_surface_triangulation_2.h | 3 --- .../CGAL/Hyperbolic_surfaces_traits_2.h | 3 --- .../Concepts/HyperbolicSurfacesTraits_2.h | 3 --- .../Hyperbolic_surface_triangulation_2/example.cpp | 12 ------------ .../hs_test_circular_kernel.cpp | 11 ----------- .../hs_test_complex.cpp | 12 ------------ .../hs_test_domain.cpp | 12 ------------ .../hs_test_factory.cpp | 12 ------------ .../hs_test_isometry.cpp | 12 ------------ .../hs_test_lazy_exact_nt.cpp | 12 ------------ .../hs_test_triangulation.cpp | 12 ------------ 16 files changed, 128 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp index 9197cd1ebe77..e3e4cb03545d 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include "window.h" #include diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h index eb7c5b7f22ab..eab15c3f0c45 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Complex_without_sqrt.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 7fa652be4225..ce5c5f385545 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 86cbe4184a42..c39d57d627f9 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index b88e9e359b5b..f7101367f8b5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index eba59c50aa83..0852dca6fb46 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h index ee5d01ef3729..2783217d48f9 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - namespace CGAL{ /*! diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index f425b47ac06e..f4205550dbf8 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -1,6 +1,3 @@ -// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) -// All rights reserved. - /*! \ingroup PkgHyperbolicSurfaceTriangulation2Concepts \cgalConcept diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp index 56048e584208..8d73295bfca0 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index 876b723b48ec..739b3e241ccd 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -1,14 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp index 23a802d9c6c1..4e05b88d0f57 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_complex.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index a4cfe05a24d7..c83ef1234a2e 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index 30c0669e40de..cda593b92f21 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index d171ab599a9a..180743c3b525 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later EOR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index 39ce8fe9bf4d..14317a317e03 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index 45a52abf82a9..9aefe8335806 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -1,15 +1,3 @@ -// Copyright (c) 2024 -// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org) -// -// $URL$ -// $Id$ -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud - #include #include From 6d89deedf7bbfe3459068fd21e9b3bde078388b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Wed, 5 Jun 2024 23:05:48 +0200 Subject: [PATCH 27/97] Update HST2 deps --- .../package_info/Hyperbolic_surface_triangulation_2/dependencies | 1 + 1 file changed, 1 insertion(+) diff --git a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies index 279a01a72ae2..0902e1798f1a 100644 --- a/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies +++ b/Hyperbolic_surface_triangulation_2/package_info/Hyperbolic_surface_triangulation_2/dependencies @@ -1,6 +1,7 @@ Algebraic_foundations Arithmetic_kernel BGL +CGAL_Core Cartesian_kernel Circulator Combinatorial_map From 601b049d718f339ac237798bf8f44c8ee4262741 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 19 Jun 2024 16:20:42 +0200 Subject: [PATCH 28/97] replacing index-th by i-th --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index ce5c5f385545..90fd7f6df0bc 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -49,25 +49,26 @@ class Hyperbolic_fundamental_domain_2 { int size() const; /*! - Returns the index-th vertex. + Returns the \f$ i \f$-th vertex. \pre is_valid() */ - Point vertex(int index) const; + Point vertex(int i) const; /*! - Returns the index of the side paired to the index-th side. + Returns the index of the side paired to the \f$ i \f$-th side. \pre is_valid() */ - int paired_side(int index) const; + int paired_side(int i) const; /*! - Returns the isometry that maps side \f$ \overline A \f$ to side \f$ A \f$, where \f$ A \f$ is the index-th side, and \f$ \overline A \f$ is the side paired to \f$ A \f$. + Returns the isometry that maps side \f$ \overline A \f$ to side \f$ A + \f$, where \f$ A \f$ is the \f$ i \f$-th side, and \f$ \overline A \f$ is the side paired to \f$ A \f$. \pre is_valid() */ - Hyperbolic_isometry_2 side_pairing(int index) const; + Hyperbolic_isometry_2 side_pairing(int i) const; /// @} /// \name Input/output From 90e347b84b5d14c9a6f3e9dd0994383cdb0de789 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 19 Jun 2024 16:45:55 +0200 Subject: [PATCH 29/97] moved access in doc + lowercase --- .../CGAL/Hyperbolic_isometry_2.h | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index f7101367f8b5..ccef26769905 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -33,25 +33,25 @@ class Hyperbolic_isometry_2{ Hyperbolic_isometry_2(); /// @} - /// \name Access functions - /// @{ /*! - Set the isometry to the identity. + sets the isometry to the identity. */ void set_to_identity(); /*! - Can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. + can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. */ void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! - Can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. + can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. */ void set_coefficient(int index, const ComplexNumber& coefficient); + /// \name Access functions + /// @{ /*! - Returns the index-th coefficient. + returns the index-th coefficient. */ ComplexNumber get_coefficient(int index) const; /// @} @@ -59,20 +59,20 @@ class Hyperbolic_isometry_2{ /// \name Operations /// @{ /*! - Evaluates the isometry at the point. + evaluates the isometry at the point. */ Point evaluate(const Point& point) const; /*! - Returns the composition of other by itself . + returns the composition of other by itself . */ Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; /// @} - /// \name Input/output + /// \name Input/Output /// @{ /*! - Writes the isometry in a stream. + writes the isometry in a stream. */ std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); /// @} From 08c26b9e4052757c7b15a42ff2d5a5c177e19072 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 19 Jun 2024 17:22:55 +0200 Subject: [PATCH 30/97] removed copy constructor removed default (before constructor) --- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index c39d57d627f9..9a90b6fe28ee 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -13,7 +13,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /// \name Creation /// @{ /*! - Default constructor, the seed is used for generation. + Constructor, the seed is used for generation. */ Hyperbolic_fundamental_domain_factory_2(unsigned int seed); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 0852dca6fb46..73f226e298c5 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -67,8 +67,6 @@ class Hyperbolic_surface_triangulation_2{ /// \name Assignment /// @{ /*! - Copy constructor. - \pre other.is_valid() */ Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); From 98164dbcef46de03edbc619439df6bf25b706548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 8 Jul 2024 17:21:18 +0200 Subject: [PATCH 31/97] new accentuated letter --- Documentation/doc/scripts/generate_how_to_cite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/doc/scripts/generate_how_to_cite.py b/Documentation/doc/scripts/generate_how_to_cite.py index ece849f18a92..809298fa408d 100644 --- a/Documentation/doc/scripts/generate_how_to_cite.py +++ b/Documentation/doc/scripts/generate_how_to_cite.py @@ -230,6 +230,7 @@ def protect_accentuated_letters(authors): .replace("ş", r"{\c{s}}") .replace("%", "") .replace("đ", r"{\-d}") + .replace("ï", r"{\"i}") ) try: res.encode("ascii") From 5a42794311182fbedb853bd2885e9cdb985176a5 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 11 Jul 2024 11:43:35 +0200 Subject: [PATCH 32/97] removed const --- .../include/CGAL/Hyperbolic_surface_triangulation_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index a3658b578f6a..bfcf1b7ce9fa 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -106,7 +106,7 @@ class Hyperbolic_surface_triangulation_2{ ComplexNumber get_cross_ratio(Dart_const_handle dart) const; - Dart_handle pick_edge_to_flip() const; + Dart_handle pick_edge_to_flip(); void copy_from(const Combinatorial_map_with_cross_ratios& cmap); void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); @@ -644,7 +644,7 @@ typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_su //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() { for (typename Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ if ( is_delaunay_flippable(it) ){ return it; From c0f819f8258b7a54e49f7a3a8c6716fbeb8babce Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 11 Jul 2024 12:02:00 +0200 Subject: [PATCH 33/97] rename Hyperbolic_surfaces_traits_2 -> Hyperbolic_surface_traits_2 --- .../demo/Hyperbolic_surface_triangulation_2/demo.cpp | 4 ++-- .../demo/Hyperbolic_surface_triangulation_2/window.h | 4 ++-- .../CGAL/Hyperbolic_fundamental_domain_2.h | 2 +- .../CGAL/Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 2 +- .../CGAL/Hyperbolic_surfaces_traits_2.h | 2 +- .../Concepts/HyperbolicSurfacesTraits_2.h | 2 +- .../Hyperbolic_surface_triangulation_2.txt | 2 +- .../PackageDescription.txt | 2 +- .../Hyperbolic_surface_triangulation_2/example.cpp | 4 ++-- ...aces_traits_2.h => Hyperbolic_surface_traits_2.h} | 12 ++++++------ .../hs_test_circular_kernel.cpp | 4 ++-- .../hs_test_domain.cpp | 4 ++-- .../hs_test_factory.cpp | 4 ++-- .../hs_test_isometry.cpp | 4 ++-- .../hs_test_lazy_exact_nt.cpp | 4 ++-- .../hs_test_triangulation.cpp | 6 +++--- 18 files changed, 33 insertions(+), 33 deletions(-) rename Hyperbolic_surface_triangulation_2/include/CGAL/{Hyperbolic_surfaces_traits_2.h => Hyperbolic_surface_traits_2.h} (86%) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp index e3e4cb03545d..8bd3f686dbec 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,7 +12,7 @@ using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h index 6a0c7587d249..e701c46783ba 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h @@ -12,12 +12,12 @@ #include #include #include -#include +#include #include typedef CGAL::Cartesian Kernel; typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef CGAL::Hyperbolic_surfaces_traits_2 Traits; +typedef CGAL::Hyperbolic_surface_traits_2 Traits; typedef Traits::Hyperbolic_point_2 Point; typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 90fd7f6df0bc..2116d9029938 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -9,7 +9,7 @@ together with a pairing of the sides of \f$ P \f$. The \f$ n \f$-th side of \f$ P \f$ is the side between the \f$ n \f$-th and the \f$ (n+1) \f$-th vertex, where indices are modulo the number of vertices of \f$ P \f$. The sides pairing are represented by a list of integers, such that if the \f$ n \f$-th integer of the list is \f$ m \f$, then the \f$ n \f$-th side is paired to the \f$ m \f$-th side. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_2 { diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 9a90b6fe28ee..3baf5c6a74b8 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -5,7 +5,7 @@ namespace CGAL{ Factory class, whose purpose is to generate some convex domains of surfaces of genus two. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_fundamental_domain_factory_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index ccef26769905..3dbb94e6f696 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -9,7 +9,7 @@ so that \f$ f(z) = (c_0 z + c_1) / (c_2 z + c_3) \f$ holds on every complex \f$ Facilities are offered to compose isometries, and apply an isometry to a point. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_isometry_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 73f226e298c5..4da96a16b6bc 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -8,7 +8,7 @@ Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. -\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surfaces_traits_2`). +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). */ template class Hyperbolic_surface_triangulation_2{ diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h index 2783217d48f9..26e33717bb04 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surfaces_traits_2.h @@ -8,7 +8,7 @@ namespace CGAL{ \cgalModels{HyperbolicSurfacesTraits_2} */ template -class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { +class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { }; }; // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h index f4205550dbf8..773dd4270fe3 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/HyperbolicSurfacesTraits_2.h @@ -5,7 +5,7 @@ \cgalRefines{HyperbolicDelaunayTriangulationTraits_2} \cgalHasModelsBegin -\cgalHasModels{CGAL::Hyperbolic_surfaces_traits_2} +\cgalHasModels{CGAL::Hyperbolic_surface_traits_2} \cgalHasModelsEnd */ class HyperbolicSurfacesTraits_2 { diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt index 449281561e3f..354cde3e8f5e 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Hyperbolic_surface_triangulation_2.txt @@ -117,7 +117,7 @@ The package contains three main classes: The secondary class `CGAL::Hyperbolic_isometry_2` deals with isometries in the Poincaré disk. -Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2` : it is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and is modeled by `CGAL::Hyperbolic_surfaces_traits_2`. +Most classes of the package are templated by the concept `HyperbolicSurfacesTraits_2` : it is a refinement of `HyperbolicDelaunayTriangulationTraits_2`, and is modeled by `CGAL::Hyperbolic_surface_traits_2`. Also, the concept `ComplexWithoutSqrt` describes a complex number type that does not use square root : it is modeled by `CGAL::Complex_without_sqrt`. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt index 01c51dde3bfb..4e8b43fa38fd 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/PackageDescription.txt @@ -51,6 +51,6 @@ - `CGAL::Hyperbolic_isometry_2` represents an isometry in the Poincaré disk model. Facilities are offered to compose isometries, and apply an isometry to a point. -Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided : `CGAL::Hyperbolic_surfaces_traits_2` and `CGAL::Complex_without_sqrt`. +Models for `HyperbolicSurfacesTraits_2` and `ComplexWithoutSqrt` are provided : `CGAL::Hyperbolic_surface_traits_2` and `CGAL::Complex_without_sqrt`. */ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp index 8d73295bfca0..6e781e1d179e 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,7 +12,7 @@ using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h similarity index 86% rename from Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h rename to Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h index 551f6bbf3801..67081a188d1d 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surfaces_traits_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_traits_2.h @@ -10,10 +10,10 @@ // // Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud -// This file contains the declaration and the implementation of the class Hyperbolic_surfaces_traits_2 +// This file contains the declaration and the implementation of the class Hyperbolic_surface_traits_2 -#ifndef CGAL_HYPERBOLIC_SURFACES_TRAITS_2 -#define CGAL_HYPERBOLIC_SURFACES_TRAITS_2 +#ifndef CGAL_Hyperbolic_surface_traits_2 +#define CGAL_Hyperbolic_surface_traits_2 #include "Complex_without_sqrt.h" #include @@ -59,7 +59,7 @@ Traits class offered by CGAL. /* template -class Hyperbolic_surfaces_traits_2 { +class Hyperbolic_surface_traits_2 { public: typedef FieldType FT; typedef Complex_without_sqrt Complex; @@ -68,7 +68,7 @@ class Hyperbolic_surfaces_traits_2 { */ template -class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { +class Hyperbolic_surface_traits_2 : public HyperbolicTraitsClass { public: typedef typename HyperbolicTraitsClass::FT FT; typedef typename HyperbolicTraitsClass::Hyperbolic_point_2 Hyperbolic_point_2; @@ -77,4 +77,4 @@ class Hyperbolic_surfaces_traits_2 : public HyperbolicTraitsClass { } // namespace CGAL -#endif // CGAL_HYPERBOLIC_SURFACES_TRAITS_2 +#endif // CGAL_Hyperbolic_surface_traits_2 diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index 739b3e241ccd..058ea564090c 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include @@ -17,7 +17,7 @@ using namespace CGAL; typedef Circular_kernel_2,Algebraic_kernel_for_circles_2_2> Kernel; typedef Hyperbolic_Delaunay_triangulation_CK_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index c83ef1234a2e..549fb69aaade 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -11,7 +11,7 @@ using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef typename Traits::FT FT; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp index cda593b92f21..0bafc0d99671 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_factory.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,7 +12,7 @@ using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index 180743c3b525..df56332b02d1 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -11,7 +11,7 @@ using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_isometry_2 Isometry; typedef typename Traits::FT FT; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index 14317a317e03..a8d30e3b4a3f 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include @@ -14,7 +14,7 @@ using namespace CGAL; typedef Cartesian> Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; typedef Hyperbolic_fundamental_domain_factory_2 Factory; typedef Hyperbolic_surface_triangulation_2 Triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index 9aefe8335806..fb72db65b90a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -4,17 +4,17 @@ #include #include #include -#include +#include #include #include #include -#include +#include using namespace CGAL; typedef Cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; -typedef Hyperbolic_surfaces_traits_2 Traits; +typedef Hyperbolic_surface_traits_2 Traits; typedef CGAL::Hyperbolic_fundamental_domain_2 Domain; typedef CGAL::Hyperbolic_surface_triangulation_2 Triangulation; From 967faacd4d38d92666c45946246671d127a1570e Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 11 Jul 2024 15:53:03 +0200 Subject: [PATCH 34/97] solved const/non-const pb --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 14 ++++++++++++++ .../CGAL/Hyperbolic_surface_triangulation_2.h | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 2429cee7e8d8..7da178b365d5 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -20,6 +20,7 @@ #include #include +#include namespace CGAL { @@ -82,6 +83,19 @@ void Hyperbolic_fundamental_domain_2::set(const std::vector& vert //////////////////////////////////////////////////////////////////////////////// +/* template */ +/* void Hyperbolic_fundamental_domain_2::setMARC(const std::ranges::range vertices, const std::ranges::range pairings){ */ +/* std::vector> _vertices; */ + +/* if constexpr(std::ranges::sized_range) { */ +/* _vertices.reserve(std::ranges::size(vertices)); */ +/* } */ + +/* std::ranges::copy(vertices, std::back_inserter(_vertices)); */ +/* } */ + +//////////////////////////////////////////////////////////////////////////////// + template int Hyperbolic_fundamental_domain_2::size() const{ return _vertices.size(); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index bfcf1b7ce9fa..42853f99108a 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -107,6 +107,7 @@ class Hyperbolic_surface_triangulation_2{ ComplexNumber get_cross_ratio(Dart_const_handle dart) const; Dart_handle pick_edge_to_flip(); + Dart_const_handle pick_edge_to_flip() const; void copy_from(const Combinatorial_map_with_cross_ratios& cmap); void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); @@ -641,11 +642,24 @@ typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_su return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } +//////////////////////////////////////////////////////////////////////////////// +template + typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ + auto &cm=_combinatorial_map.darts(); + for (auto it = cm.begin(); it != cm.end(); ++it){ + if ( is_delaunay_flippable(it) ){ + return it; + } + } + return nullptr; +} + //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() { - for (typename Dart_range::iterator it = _combinatorial_map.darts().begin(); it != _combinatorial_map.darts().end(); ++it){ + typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ + const auto &cm=_combinatorial_map.darts(); + for (auto it = cm.begin(); it != cm.end(); ++it){ if ( is_delaunay_flippable(it) ){ return it; } From 269f1d846ca37021d7b3ae2d9ff8e07de9a7803c Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 11 Jul 2024 16:28:34 +0200 Subject: [PATCH 35/97] using ranges for input --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 38 +++++++++---------- .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 7da178b365d5..a95d75b7c7c6 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -39,9 +39,11 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); - - void set(const std::vector& vertices, const std::vector& pairings); - + void set(std::vector::iterator vfirst, + std::vector::iterator vlast, + std::vector::iterator pfirst, + std::vector::iterator plast); + int size() const; // Returns the number of vertices (equivalently, the number of sides) Point vertex(int index) const; // Returns the index-th vertex int paired_side(int index) const; // Returns the index of the side paired to side A, where A is the index-th side @@ -73,26 +75,24 @@ Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const s set(vertices, pairings); } -//////////////////////////////////////////////////////////////////////////////// - -template -void Hyperbolic_fundamental_domain_2::set(const std::vector& vertices, const std::vector& pairings){ - _vertices = vertices; - _pairings = pairings; -} - -//////////////////////////////////////////////////////////////////////////////// +/* //////////////////////////////////////////////////////////////////////////////// */ /* template */ -/* void Hyperbolic_fundamental_domain_2::setMARC(const std::ranges::range vertices, const std::ranges::range pairings){ */ -/* std::vector> _vertices; */ +/* void Hyperbolic_fundamental_domain_2::set(const std::vector& vertices, const std::vector& pairings){ */ +/* _vertices = vertices; */ +/* _pairings = pairings; */ +/* } */ -/* if constexpr(std::ranges::sized_range) { */ -/* _vertices.reserve(std::ranges::size(vertices)); */ -/* } */ +//////////////////////////////////////////////////////////////////////////////// -/* std::ranges::copy(vertices, std::back_inserter(_vertices)); */ -/* } */ + template + void Hyperbolic_fundamental_domain_2::set(std::vector::iterator vfirst, + std::vector::iterator vlast, + std::vector::iterator pfirst, + std::vector::iterator plast){ + _vertices = std::vector(vfirst, vlast); + _pairings = std::vector(pfirst, plast); + } //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 83b1f90bcc13..d4bdaf47dee8 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -117,7 +117,7 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2< pairings.push_back((k+4)%8); } - domain.set(vertices, pairings); + domain.set(vertices.begin(), vertices.end(), pairings.begin(), pairings.end()); return domain; } From 829997b9fe81fa2158514e09cdaa1e6bb5c1ec83 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 12 Jul 2024 13:52:03 +0200 Subject: [PATCH 36/97] temp bullshit --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 12 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 132 +++++++++--------- 2 files changed, 75 insertions(+), 69 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index a95d75b7c7c6..7b5bf01b1abe 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -38,7 +38,9 @@ class Hyperbolic_fundamental_domain_2 { typedef typename Traits::Hyperbolic_point_2 Point; Hyperbolic_fundamental_domain_2(); - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + /* Hyperbolic_fundamental_domain_2(const std::vector& vertices, const + std::vector& pairings); Modify to include the set in the constructor MARC + TODO*/ void set(std::vector::iterator vfirst, std::vector::iterator vlast, std::vector::iterator pfirst, @@ -70,10 +72,10 @@ template void operator>>(std::istream& s, Hyperbolic_fundamental_d template Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings){ - set(vertices, pairings); -} +/* template */ +/* Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings){ */ +/* set(vertices, pairings); */ +/* } */ /* //////////////////////////////////////////////////////////////////////////////// */ diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 42853f99108a..9cf75f7fbb10 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -35,17 +35,21 @@ It is also possible to specify an anchor for the triangulation. An anchor consis 2) three points A,B,C in the hyperbolic plane. The points A,B,C are the three vertices in counter-clockwise order of a triangle. This triangle is a lift of T, and A is a lift of V. */ + template -class Hyperbolic_surface_triangulation_2{ -public: - struct Combinatorial_map_with_cross_ratios_item{ +struct Combinatorial_map_with_cross_ratios_item{ template struct Dart_wrapper{ typedef Cell_attribute> Edge_attrib; typedef std::tuple Attributes; }; }; - typedef Combinatorial_map<2,Combinatorial_map_with_cross_ratios_item> Combinatorial_map_with_cross_ratios; + +template> +class Hyperbolic_surface_triangulation_2{ +public: + + typedef Combinatorial_map<2,Attributes> Combinatorial_map_with_cross_ratios; struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; @@ -125,8 +129,8 @@ template void operator>>(std::istream& s, Hyperbolic_surface_trian //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Domain& domain){ +template +Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Domain& domain){ // (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices) _combinatorial_map.clear(); int size = domain.size(); @@ -199,21 +203,21 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(c _has_anchor = true; } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ +template + Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ copy_from(cmap); } -template -Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template + Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ copy_from(cmap, anchor); } //////////////////////////////////////////////////////////////////////////////// -template +template //Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ -Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ + Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ copy_from(other.get_combinatorial_map_ref(), other.get_anchor_ref()); } @@ -225,30 +229,30 @@ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2 -typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ return _combinatorial_map; } -template -bool Hyperbolic_surface_triangulation_2::has_anchor() const { +template +bool Hyperbolic_surface_triangulation_2::has_anchor() const { return _has_anchor; } -template -typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ +template +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ return _anchor; } //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_handle dart) const{ +template +bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_handle dart) const{ return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); } -template -void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ +template +void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ // First gather all the information needed @@ -331,16 +335,16 @@ void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ } } -template -bool Hyperbolic_surface_triangulation_2::is_delaunay() const{ +template +bool Hyperbolic_surface_triangulation_2::is_delaunay() const{ if (! is_valid()){ return false; } return (pick_edge_to_flip() == nullptr); } -template -int Hyperbolic_surface_triangulation_2::make_delaunay(){ +template +int Hyperbolic_surface_triangulation_2::make_delaunay(){ int number_of_flips_done = 0; Dart_handle edge_to_flip = pick_edge_to_flip(); @@ -354,8 +358,8 @@ int Hyperbolic_surface_triangulation_2::make_delaunay(){ } -template -std::vector::Dart_const_handle, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ +template +std::vector::Dart_const_handle, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point, typename Hyperbolic_surface_triangulation_2::Point>> Hyperbolic_surface_triangulation_2::lift(bool center) const{ std::vector> realizations; size_t visited_darts_mark = _combinatorial_map.get_new_mark(); @@ -450,8 +454,8 @@ std::vector::Dart //////////////////////////////////////////////////////////////////////////////// -template -bool Hyperbolic_surface_triangulation_2::is_valid() const{ +template +bool Hyperbolic_surface_triangulation_2::is_valid() const{ // 1. Check the combinatorial map // Check that the combinatorial map is valid @@ -487,8 +491,8 @@ bool Hyperbolic_surface_triangulation_2::is_valid() const{ //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ +template +void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) const{ // Give indices to the darts std::map darts_indices; int current_dart_index = 0; @@ -526,8 +530,8 @@ void Hyperbolic_surface_triangulation_2::to_stream(std::ostream& s) cons } } -template -void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ +template +void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ _combinatorial_map.clear(); // Load the number of darts @@ -592,59 +596,59 @@ void Hyperbolic_surface_triangulation_2::from_stream(std::istream& s){ //////////////////////////////////////////////////////////////////////////////// -template -std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.to_stream(s); return s; } -template -void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ +template +void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation){ triangulation.from_stream(s); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::ccw(Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::ccw(Dart_handle dart){ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::cw(Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::cw(Dart_handle dart){ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::opposite(Dart_handle dart){ +template +typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::opposite(Dart_handle dart){ return _combinatorial_map.opposite(dart); } -template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_ccw(Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 1); } -template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_cw(Dart_const_handle dart) const{ return _combinatorial_map.beta(dart, 0); } -template -typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::const_opposite(Dart_const_handle dart) const{ return _combinatorial_map.opposite(dart); } //////////////////////////////////////////////////////////////////////////////// -template -typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ +template +typename Hyperbolic_surface_triangulation_2::ComplexNumber Hyperbolic_surface_triangulation_2::get_cross_ratio(Dart_const_handle dart) const{ return _combinatorial_map.template info_of_attribute<1>(_combinatorial_map.template attribute<1>(dart)); } //////////////////////////////////////////////////////////////////////////////// -template - typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ +template + typename Hyperbolic_surface_triangulation_2::Dart_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip(){ auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ if ( is_delaunay_flippable(it) ){ @@ -656,8 +660,8 @@ template //////////////////////////////////////////////////////////////////////////////// -template - typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ +template + typename Hyperbolic_surface_triangulation_2::Dart_const_handle Hyperbolic_surface_triangulation_2::pick_edge_to_flip() const{ const auto &cm=_combinatorial_map.darts(); for (auto it = cm.begin(); it != cm.end(); ++it){ if ( is_delaunay_flippable(it) ){ @@ -669,15 +673,15 @@ template //////////////////////////////////////////////////////////////////////////////// -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ //_combinatorial_map.copy_from_const(cmap); _combinatorial_map.copy(cmap); _has_anchor = false; } -template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +template +void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ // Because of the anchor, we must operate the copy ourself _combinatorial_map.clear(); @@ -712,8 +716,8 @@ void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_m //////////////////////////////////////////////////////////////////////////////// -template -typename Traits::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const{ +template +typename Traits::Complex Hyperbolic_surface_triangulation_2::cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const{ ComplexNumber za (a.x(), a.y()); ComplexNumber zb (b.x(), b.y()); ComplexNumber zc (c.x(), c.y()); @@ -721,8 +725,8 @@ typename Traits::Complex Hyperbolic_surface_triangulation_2::cross_ratio return (zd-zb)*(zc-za) / ((zd-za)*(zc-zb)); } -template -typename Hyperbolic_surface_triangulation_2::Point Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const{ +template +typename Hyperbolic_surface_triangulation_2::Point Hyperbolic_surface_triangulation_2::fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const{ ComplexNumber za (a.x(), a.y()); ComplexNumber zb (b.x(), b.y()); ComplexNumber zc (c.x(), c.y()); From c2877ee5362bd34628b39b28ffcda53c6a96ec15 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 12 Jul 2024 14:47:02 +0200 Subject: [PATCH 37/97] bullshit2 --- .../include/CGAL/Hyperbolic_fundamental_domain_2.h | 1 - .../include/CGAL/Hyperbolic_surface_triangulation_2.h | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 7b5bf01b1abe..806e32834c6b 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -20,7 +20,6 @@ #include #include -#include namespace CGAL { diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 9cf75f7fbb10..b5c11b0603d2 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -122,8 +122,8 @@ class Hyperbolic_surface_triangulation_2{ Point fourth_point_from_cross_ratio(const Point& a, const Point& b, const Point& c, const ComplexNumber& cratio) const; }; -template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); -template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); + template std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); + template void operator>>(std::istream& s, Hyperbolic_surface_triangulation_2& triangulation); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// From dc7802475a7a46bd1c6c5aff96315220fb868bd3 Mon Sep 17 00:00:00 2001 From: vdespre Date: Fri, 12 Jul 2024 14:48:16 +0200 Subject: [PATCH 38/97] Save --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 7b5bf01b1abe..f3398378c074 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -41,10 +41,10 @@ class Hyperbolic_fundamental_domain_2 { /* Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); Modify to include the set in the constructor MARC TODO*/ - void set(std::vector::iterator vfirst, - std::vector::iterator vlast, - std::vector::iterator pfirst, - std::vector::iterator plast); + void set(typename std::vector::iterator vfirst, + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast); int size() const; // Returns the number of vertices (equivalently, the number of sides) Point vertex(int index) const; // Returns the index-th vertex @@ -88,10 +88,10 @@ Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} //////////////////////////////////////////////////////////////////////////////// template - void Hyperbolic_fundamental_domain_2::set(std::vector::iterator vfirst, - std::vector::iterator vlast, - std::vector::iterator pfirst, - std::vector::iterator plast){ + void Hyperbolic_fundamental_domain_2::set(typename std::vector::iterator vfirst, + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast){ _vertices = std::vector(vfirst, vlast); _pairings = std::vector(pfirst, plast); } From c837cd903ac060849d42f8d1df424be22ec671d6 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 12 Jul 2024 15:58:13 +0200 Subject: [PATCH 39/97] operator * isometry --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 43 +++++-------------- .../Hyperbolic_fundamental_domain_factory_2.h | 5 +-- .../include/CGAL/Hyperbolic_isometry_2.h | 17 ++++---- .../CGAL/Hyperbolic_surface_triangulation_2.h | 4 +- 4 files changed, 24 insertions(+), 45 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index f37f9a70239f..845e937cc2d5 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -36,14 +36,10 @@ class Hyperbolic_fundamental_domain_2 { public: typedef typename Traits::Hyperbolic_point_2 Point; - Hyperbolic_fundamental_domain_2(); - /* Hyperbolic_fundamental_domain_2(const std::vector& vertices, const - std::vector& pairings); Modify to include the set in the constructor MARC - TODO*/ - void set(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast); + Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast); int size() const; // Returns the number of vertices (equivalently, the number of sides) Point vertex(int index) const; // Returns the index-th vertex @@ -67,32 +63,15 @@ template void operator>>(std::istream& s, Hyperbolic_fundamental_d //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// - -template -Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2() {} - -/* template */ -/* Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings){ */ -/* set(vertices, pairings); */ -/* } */ - -/* //////////////////////////////////////////////////////////////////////////////// */ - -/* template */ -/* void Hyperbolic_fundamental_domain_2::set(const std::vector& vertices, const std::vector& pairings){ */ -/* _vertices = vertices; */ -/* _pairings = pairings; */ -/* } */ - //////////////////////////////////////////////////////////////////////////////// - template - void Hyperbolic_fundamental_domain_2::set(typename std::vector::iterator vfirst, - typename std::vector::iterator vlast, - typename std::vector::iterator pfirst, - typename std::vector::iterator plast){ - _vertices = std::vector(vfirst, vlast); - _pairings = std::vector(pfirst, plast); +template + Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast){ + _vertices = std::vector(vfirst, vlast); + _pairings = std::vector(pfirst, plast); } //////////////////////////////////////////////////////////////////////////////// diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h index d4bdaf47dee8..054719c23f0c 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -70,8 +70,7 @@ Hyperbolic_fundamental_domain_factory_2::Hyperbolic_fundamental_domain_f template Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2::generate_domain_g2(){ - Hyperbolic_fundamental_domain_2 domain; - + bool is_domain_generated = false; _Cmplx exact_z0, exact_z1, exact_z2, exact_z3; @@ -117,7 +116,7 @@ Hyperbolic_fundamental_domain_2 Hyperbolic_fundamental_domain_factory_2< pairings.push_back((k+4)%8); } - domain.set(vertices.begin(), vertices.end(), pairings.begin(), pairings.end()); + Hyperbolic_fundamental_domain_2 domain(vertices.begin(), vertices.end(), pairings.begin(), pairings.end()); return domain; } diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 326c4af7c9d3..1e50a2bcbc8b 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -45,14 +45,15 @@ class Hyperbolic_isometry_2{ // Evaluates the isometry at point Point evaluate(const Point& point) const; - // Returns the composition of self and other - Self compose(const Self& other) const; - private: ComplexNumber _coefficients[4]; }; -template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); +// Returns the composition of iso1 and iso2 +template + Hyperbolic_isometry_2 operator*(const Hyperbolic_isometry_2& iso1, const Hyperbolic_isometry_2& iso2); + + template std::ostream& operator<<(std::ostream& s, const Hyperbolic_isometry_2& isometry); // When inverse=false, returns the hyperbolic translation that maps -p to zero, and zero to p. Otherwise, returns the hyperbolic translation that maps p to zero, and zero to -p. template @@ -119,12 +120,12 @@ typename Traits::Hyperbolic_point_2 Hyperbolic_isometry_2::evaluate(cons //////////////////////////////////////////////////////////////////////////////// template -Hyperbolic_isometry_2 Hyperbolic_isometry_2::compose(const Hyperbolic_isometry_2& other) const{ - Self result; + Hyperbolic_isometry_2 operator*(const Hyperbolic_isometry_2& iso1, const Hyperbolic_isometry_2& iso2) { + Hyperbolic_isometry_2 result; for (int i=0; i<2; i++){ for (int j=0; j<2; j++){ result.set_coefficient(2*i+j, - get_coefficient(2*i) * other.get_coefficient(j) + get_coefficient(2*i+1) * other.get_coefficient(2+j)); + iso1.get_coefficient(2*i) * iso2.get_coefficient(j) + iso1.get_coefficient(2*i+1) * iso2.get_coefficient(2+j)); } } return result; @@ -175,7 +176,7 @@ Hyperbolic_isometry_2 isometry_pairing_the_sides(const typename Traits:: B = hyperbolic_translation(q1); Binv = hyperbolic_translation(q1,true); C = hyperbolic_rotation(A.evaluate(p2), B.evaluate(q2)); - return (Binv.compose(C)).compose(A); + return (Binv*C)*A; } } // namespace CGAL diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index b5c11b0603d2..690acd535ce9 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -88,7 +88,7 @@ class Hyperbolic_surface_triangulation_2{ void to_stream(std::ostream& s) const; void from_stream(std::istream& s); - bool is_delaunay_flippable(Dart_handle dart) const; + bool is_delaunay_flippable(Dart_const_handle dart) const; void flip(Dart_handle dart); bool is_delaunay() const; int make_delaunay(); @@ -247,7 +247,7 @@ typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbo //////////////////////////////////////////////////////////////////////////////// template -bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_handle dart) const{ +bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_const_handle dart) const{ return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); } From 9bb092e74ea25b250211a2bd335ee74b0adcb63c Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Fri, 12 Jul 2024 16:07:40 +0200 Subject: [PATCH 40/97] get_anchor_ref->anchor --- .../include/CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 690acd535ce9..61fa7a155398 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -83,7 +83,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); bool has_anchor() const; - Anchor& get_anchor_ref(); + Anchor& anchor(); void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -219,7 +219,7 @@ template //Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ - copy_from(other.get_combinatorial_map_ref(), other.get_anchor_ref()); + copy_from(other.get_combinatorial_map_ref(), other.anchor()); } else { copy_from(other.get_combinatorial_map_ref()); @@ -240,7 +240,7 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const } template -typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::get_anchor_ref(){ +typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor(){ return _anchor; } From fba354099c5485091f739369aff6de3cfea1fdd7 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 17 Jul 2024 21:41:39 +0200 Subject: [PATCH 41/97] some doc --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 4 ++-- .../CGAL/Hyperbolic_isometry_2.h | 16 ++++++++++++---- .../CGAL/Hyperbolic_surface_triangulation_2.h | 6 +++--- .../Doxyfile.in | 5 +++++ .../include/CGAL/Hyperbolic_isometry_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 18 +++++++++--------- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 2116d9029938..3223590340f8 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -29,7 +29,7 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); /*! - Constructor from the list of vertices and the sides pairing. + Constructor from the vectors of vertices and side pairings. */ Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); /// @} @@ -37,7 +37,7 @@ class Hyperbolic_fundamental_domain_2 { /// \name Access functions /// @{ /*! - Sets the vertices and the sides pairings of the domain. + Sets the vertices and the side pairings of the domain. */ void set(const std::vector& vertices, const std::vector& pairings); diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h index 3dbb94e6f696..33cfa4e54bdc 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_isometry_2.h @@ -39,12 +39,18 @@ class Hyperbolic_isometry_2{ void set_to_identity(); /*! - can be used to set the coefficients of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. + can be used to set the coefficients of the isometry manually. \note Be + careful when doing so : the implementation does not check that the + resulting Möbius transform fixes the unit circle. + */ void set_coefficients(const ComplexNumber& c0, const ComplexNumber& c1, const ComplexNumber& c2, const ComplexNumber& c3); /*! - can be used to set one coefficient of the isometry manually, be careful when doing so : the implementation does not check that the resulting Möbius transform fixes the unit circle. + can be used to set one coefficient of the isometry manually. \note Be + careful when doing so : the implementation does not check that the + resulting Möbius transform fixes the unit circle. + */ void set_coefficient(int index, const ComplexNumber& coefficient); @@ -63,10 +69,12 @@ class Hyperbolic_isometry_2{ */ Point evaluate(const Point& point) const; + /// @{ /*! - returns the composition of other by itself . + returns the composition of two isometries. */ - Hyperbolic_isometry_2 compose(const Hyperbolic_isometry_2& other) const; + template + Hyperbolic_isometry_2 operator*(const Hyperbolic_isometry_2& iso1, const Hyperbolic_isometry_2& iso2); /// @} /// \name Input/Output diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 4da96a16b6bc..84e3cd1d5138 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -10,7 +10,7 @@ the Delaunay flip algorithm, and the construction of a portion of the lift of th \tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). */ -template +template> class Hyperbolic_surface_triangulation_2{ public: /// \name Types @@ -18,7 +18,7 @@ class Hyperbolic_surface_triangulation_2{ /*! Type of combinatorial map whose edges are decorated with complex numbers. */ - typedef Combinatorial_map<2,unspecified_type> Combinatorial_map_with_cross_ratios; + typedef Combinatorial_map<2, Attributes> Combinatorial_map_with_cross_ratios; /*! Combinatorial map dart handle type. */ @@ -93,7 +93,7 @@ class Hyperbolic_surface_triangulation_2{ \pre is_valid() && has_anchor() */ - Anchor& get_anchor_ref(); + Anchor& anchor(); /// @} /// \name Delaunay flip algorithm diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in index d14ddac30d92..2a348c49e38d 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Doxyfile.in @@ -5,3 +5,8 @@ EXTRACT_PRIVATE = NO PROJECT_NAME = "CGAL ${CGAL_CREATED_VERSION_NUM} - 2D Hyperbolic Surface Triangulations" IMAGE_PATH += ${CGAL_PACKAGE_DOC_DIR}/fig/cover.svg + +# custom options for this package +#EXTRACT_ALL = true +#HIDE_UNDOC_MEMBERS = true +#HIDE_UNDOC_CLASSES = true \ No newline at end of file diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h index 1e50a2bcbc8b..cc61a323dd6e 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_isometry_2.h @@ -49,7 +49,7 @@ class Hyperbolic_isometry_2{ ComplexNumber _coefficients[4]; }; -// Returns the composition of iso1 and iso2 +// returns the composition of two isometries. template Hyperbolic_isometry_2 operator*(const Hyperbolic_isometry_2& iso1, const Hyperbolic_isometry_2& iso2); diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 61fa7a155398..55ad20978ded 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -129,7 +129,7 @@ class Hyperbolic_surface_triangulation_2{ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -template +template Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Domain& domain){ // (Triangulates by adding an internal edge between domain.vertex(size-1) and the other vertices) _combinatorial_map.clear(); @@ -203,19 +203,19 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang _has_anchor = true; } -template +template Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ copy_from(cmap); } -template +template Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ copy_from(cmap, anchor); } //////////////////////////////////////////////////////////////////////////////// -template +template //Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ @@ -229,29 +229,29 @@ template //////////////////////////////////////////////////////////////////////////////// -template +template typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ return _combinatorial_map; } -template +template bool Hyperbolic_surface_triangulation_2::has_anchor() const { return _has_anchor; } -template +template typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor(){ return _anchor; } //////////////////////////////////////////////////////////////////////////////// -template +template bool Hyperbolic_surface_triangulation_2::is_delaunay_flippable(Dart_const_handle dart) const{ return ( get_cross_ratio(dart).imaginary_part()>Number(0) ); } -template +template void Hyperbolic_surface_triangulation_2::flip(Dart_handle dart){ // First gather all the information needed From 0c495c64761b486847c4e2e4de191f8f8433d098 Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Wed, 24 Jul 2024 14:03:10 +0200 Subject: [PATCH 42/97] added missing doc concept file --- .../Concepts/ComplexWithoutSqrt.h | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h new file mode 100644 index 000000000000..c67826057021 --- /dev/null +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/Concepts/ComplexWithoutSqrt.h @@ -0,0 +1,117 @@ +// Copyright (c) 2024 INRIA Nancy - Grand Est (France). LIGM Marne-la-Vallée (France) +// All rights reserved. + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2Concepts +\cgalConcept + +Describes a complex number type that does not use square root. + +\cgalHasModelsBegin +\cgalHasModels{CGAL::Complex_without_sqrt} +\cgalHasModelsEnd +*/ +class ComplexWithoutSqrt { +public: + /// \name Types + /// @{ + /*! + Field number type: must be a model of `FieldNumberType`. + */ + typedef unspecified_type FT; + /// \name Creation + /// @{ + /*! + Default constructor, sets the both the real part and the imaginary part to \f$ 0 \f$. + */ + ComplexWithoutSqrt(); + + /*! + Constructor, sets the real part to real_part and the imaginary part to \f$ 0 \f$. + */ + ComplexWithoutSqrt(const FT& real_part); + + /*! + Constructor, sets the real part to real_part and the imaginary part to imaginary_part . + */ + ComplexWithoutSqrt(const FT& real_part, const FT& imaginary_part); + /// @} + + /// \name Get and set + /// @{ + /*! + Sets the real part to real_part . + */ + void set_real_part(const FT& real_part); + + /*! + Sets the imaginary part to imaginary_part . + */ + void set_imaginary_part(const FT& imaginary_part); + + /*! + Returns the real part. + */ + FT real_part() const; + + /*! + Returns the imaginary part. + */ + FT imaginary_part() const; + /// @} + + /// \name Operations + /// @{ + /*! + Returns the square of the modulus. + */ + FT squared_modulus() const; + + /*! + Returns the conjugate. + */ + ComplexWithoutSqrt conjugate() const; + + /*! + Complex addition. + */ + ComplexWithoutSqrt operator+(const ComplexWithoutSqrt& other) const; + + /*! + Complex substraction. + */ + ComplexWithoutSqrt operator-(const ComplexWithoutSqrt& other) const; + + /*! + Returns the opposite. + */ + ComplexWithoutSqrt operator-() const; + + /*! + Complex multiplication. + */ + ComplexWithoutSqrt operator*(const ComplexWithoutSqrt& other) const; + + /*! + Complex division. + */ + ComplexWithoutSqrt operator/(const ComplexWithoutSqrt& other) const; + + /*! + Equality test. + */ + bool operator==(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + /*! + Inequality test. + */ + bool operator!=(const Complex_without_sqrt& z1, const Complex_without_sqrt& z2); + /*! + Writes the complex in a stream. + */ + std::ostream& operator<<(std::ostream& s, const Complex_without_sqrt& z); + /*! + Reads the complex from a stream. + */ + void operator>>(std::istream& s, Complex_without_sqrt& z); + /// @} +}; From 762098354b7fe593e487a46b7c290cd008e6587e Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 25 Jul 2024 15:25:42 +0200 Subject: [PATCH 43/97] some more doc --- .../demo.cpp | 16 +++++++++++-- .../window.cpp | 12 ++++++++++ .../window.h | 16 +++++++++++-- .../CGAL/Hyperbolic_fundamental_domain_2.h | 12 ++++------ .../CGAL/Hyperbolic_surface_triangulation_2.h | 23 +++++++++++++++++++ ...p => hyperbolic_surface_triangulation.cpp} | 16 +++++++++++-- .../CGAL/Hyperbolic_surface_triangulation_2.h | 7 +++--- 7 files changed, 86 insertions(+), 16 deletions(-) rename Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/{example.cpp => hyperbolic_surface_triangulation.cpp} (74%) diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp index 8bd3f686dbec..f2a745131208 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/demo.cpp @@ -1,7 +1,19 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + #include "window.h" #include -#include +#include #include #include #include @@ -10,7 +22,7 @@ using namespace CGAL; -typedef Cartesian Kernel; +typedef Simple_cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp index 73ca88662a84..f7ee58a3a240 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.cpp @@ -1,3 +1,15 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + #include "window.h" DemoWindowItem::DemoWindowItem() : CGAL::Qt::GraphicsItem(){ diff --git a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h index e701c46783ba..65f6e3f4af03 100644 --- a/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h +++ b/Hyperbolic_surface_triangulation_2/demo/Hyperbolic_surface_triangulation_2/window.h @@ -1,3 +1,15 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + #ifndef CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2_DEMO_WINDOW #define CGAL_HYPERBOLIC_SURFACE_TRIANGULATION_2_DEMO_WINDOW @@ -10,12 +22,12 @@ #include "ui_drawing_window_description.h" #include -#include +#include #include #include #include -typedef CGAL::Cartesian Kernel; +typedef CGAL::Simple_cartesian Kernel; typedef CGAL::Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef CGAL::Hyperbolic_surface_traits_2 Traits; typedef Traits::Hyperbolic_point_2 Point; diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index 3223590340f8..b0ddf96d34a3 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -29,18 +29,16 @@ class Hyperbolic_fundamental_domain_2 { Hyperbolic_fundamental_domain_2(); /*! - Constructor from the vectors of vertices and side pairings. + Constructor from vertices and side pairings interators. */ - Hyperbolic_fundamental_domain_2(const std::vector& vertices, const std::vector& pairings); + Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, + typename std::vector::iterator vlast, + typename std::vector::iterator pfirst, + typename std::vector::iterator plast); /// @} /// \name Access functions /// @{ - /*! - Sets the vertices and the side pairings of the domain. - */ - void set(const std::vector& vertices, const std::vector& pairings); - /*! Returns the number of vertices (equivalently, the number of sides) of the domain. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 84e3cd1d5138..998d189530d1 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -3,12 +3,35 @@ namespace CGAL{ /*! \ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + +This item defines attributes of edges that are +`Complex_without_sqrt` reprensenting cross-ratios. + +\tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). + +\cgalModels{GenericMapItems} +*/ +template +struct Combinatorial_map_with_cross_ratios_item{ + template + struct Dart_wrapper{ + typedef Cell_attribute> Edge_attrib; + typedef std::tuple Attributes; + }; + }; + + +/*! +\ingroup PkgHyperbolicSurfaceTriangulation2MainClasses + Represents a triangulation of a closed orientable hyperbolic surface. Offers facilities such as the generation of the triangulation from a convex fundamental domain, the Delaunay flip algorithm, and the construction of a portion of the lift of the triangulation in the hyperbolic plane. \tparam Traits is the traits class and must be a model of `HyperbolicSurfacesTraits_2` (default model : `Hyperbolic_surface_traits_2`). + +\tparam Attributes must be a model of `GenericMapItems` (default model : `Combinatorial_map_with_cross_ratios_item`). */ template> class Hyperbolic_surface_triangulation_2{ diff --git a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp similarity index 74% rename from Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp rename to Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp index 6e781e1d179e..976238af9292 100644 --- a/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/example.cpp +++ b/Hyperbolic_surface_triangulation_2/examples/Hyperbolic_surface_triangulation_2/hyperbolic_surface_triangulation.cpp @@ -1,5 +1,17 @@ +// Copyright (c) 2024 +// INRIA Nancy (France), and Université Gustave Eiffel Marne-la-Vallee (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org) +// +// $URL$ +// $Id$ +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial +// +// Author(s) : Vincent Despré, Loïc Dubois, Monique Teillaud + #include -#include +#include #include #include #include @@ -10,7 +22,7 @@ using namespace CGAL; -typedef Cartesian Kernel; +typedef Simple_cartesian Kernel; typedef Hyperbolic_Delaunay_triangulation_traits_2 ParentTraits; typedef Hyperbolic_surface_traits_2 Traits; typedef Hyperbolic_fundamental_domain_2 Domain; diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 55ad20978ded..7a2bf9c252db 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -83,7 +83,7 @@ class Hyperbolic_surface_triangulation_2{ Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); bool has_anchor() const; - Anchor& anchor(); + Anchor& anchor() const; void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -239,8 +239,9 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const return _has_anchor; } -template -typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor(){ + template +typename Hyperbolic_surface_triangulation_2::Anchor& +Hyperbolic_surface_triangulation_2::anchor() const{ return _anchor; } From fbad5de0c0525e932d17f71f67afedd144632a5c Mon Sep 17 00:00:00 2001 From: POUGET Marc Date: Thu, 25 Jul 2024 16:03:49 +0200 Subject: [PATCH 44/97] debug --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 10 ++++---- .../Hyperbolic_fundamental_domain_factory_2.h | 2 +- .../CGAL/Hyperbolic_surface_triangulation_2.h | 24 +++++++++---------- .../CGAL/Hyperbolic_surface_triangulation_2.h | 10 ++++---- .../hs_test_circular_kernel.cpp | 6 ++--- .../hs_test_lazy_exact_nt.cpp | 6 ++--- .../hs_test_triangulation.cpp | 8 +++---- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h index b0ddf96d34a3..42f8a9fddfc2 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_2.h @@ -40,28 +40,28 @@ class Hyperbolic_fundamental_domain_2 { /// \name Access functions /// @{ /*! - Returns the number of vertices (equivalently, the number of sides) of the domain. + returns the number of vertices (equivalently, the number of sides) of the domain. \pre is_valid() */ int size() const; /*! - Returns the \f$ i \f$-th vertex. + returns the \f$ i \f$-th vertex. \pre is_valid() */ Point vertex(int i) const; /*! - Returns the index of the side paired to the \f$ i \f$-th side. + returns the index of the side paired to the \f$ i \f$-th side. \pre is_valid() */ int paired_side(int i) const; /*! - Returns the isometry that maps side \f$ \overline A \f$ to side \f$ A + returns the isometry that maps side \f$ \overline A \f$ to side \f$ A \f$, where \f$ A \f$ is the \f$ i \f$-th side, and \f$ \overline A \f$ is the side paired to \f$ A \f$. \pre is_valid() @@ -81,7 +81,7 @@ class Hyperbolic_fundamental_domain_2 { void operator>>(std::istream& s, Hyperbolic_fundamental_domain_2& domain); /*! - Writes the domain in a stream. + writes the domain in a stream. The format of the output is the following. The first line prints the number n of vertices of the domain. diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h index 3baf5c6a74b8..0eb2756c7dfd 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_fundamental_domain_factory_2.h @@ -21,7 +21,7 @@ class Hyperbolic_fundamental_domain_factory_2{ /// \name Generation of a domain /// @{ /*! - Randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. + randomly generates a convex domain of a closed orientable hyperbolic surface of genus two. */ Hyperbolic_fundamental_domain_2 generate_domain_g2(); /// @} diff --git a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h index 998d189530d1..da1673811807 100644 --- a/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/doc/Hyperbolic_surface_triangulation_2/CGAL/Hyperbolic_surface_triangulation_2.h @@ -56,7 +56,7 @@ class Hyperbolic_surface_triangulation_2{ typedef typename Traits::Hyperbolic_point_2 Point; /*! - Stores a dart \f$ d \f$ of the combinatorial map, belonging to a triangle \f$ t \f$, and stores the three vertices of a lift of \f$ t \f$ in the hyperbolic plane. + stores a dart \f$ d \f$ of the combinatorial map, belonging to a triangle \f$ t \f$, and stores the three vertices of a lift of \f$ t \f$ in the hyperbolic plane. */ struct Anchor{ typename Combinatorial_map_with_cross_ratios::Dart_handle dart; @@ -98,21 +98,21 @@ class Hyperbolic_surface_triangulation_2{ /// \name Access functions /// @{ /*! - Returns the decorated combinatorial map. + returns the decorated combinatorial map. \pre is_valid() */ - Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); + Combinatorial_map_with_cross_ratios& combinatorial_map(); /*! - Tells if the triangulation has an anchor. + tells if the triangulation has an anchor. \pre is_valid() */ bool has_anchor() const; /*! - Returns the anchor. + returns the anchor. \pre is_valid() && has_anchor() */ @@ -122,26 +122,26 @@ class Hyperbolic_surface_triangulation_2{ /// \name Delaunay flip algorithm /// @{ /*! - Tells if if the edge supported by the dart is Delaunay flippable. + tells if if the edge supported by the dart is Delaunay flippable. \pre is_valid() */ bool is_delaunay_flippable(Dart_handle dart) const; /*! - Flips the edge supported by the dart. + flips the edge supported by the dart. \pre is_valid() */ void flip(Dart_handle dart); /*! - Determines if the triangulation is a valid Delaunay triangulation. + determines if the triangulation is a valid Delaunay triangulation. */ bool is_delaunay() const; /*! - Applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. + applies the Delaunay flip algorithm: flips Delaunay flippable edges until there is no such edge anymore. \pre is_valid() */ @@ -151,7 +151,7 @@ class Hyperbolic_surface_triangulation_2{ /// \name Lifting /// @{ /*! - Lifts the triangulation in the hyperbolic plane. + lifts the triangulation in the hyperbolic plane. Returns, for every triangle \f$ t \f$ of the triangulation, one of the darts of \f$ t \f$ in the combinatorial map of the triangulation, together with a triple \f$ p,q,r \f$ of points in the hyperbolic plane. The points \f$ p,q,r \f$ are the vertices of a lift of \f$ t \f$ in the hyperbolic plane. If the center parameter is set to true, then one of the lifted triangles admits the origin \f$ 0 \f$ as a vertex. @@ -174,7 +174,7 @@ class Hyperbolic_surface_triangulation_2{ /// \name Input/output /// @{ /*! - Writes the triangulation in a stream. + writes the triangulation in a stream. The format of the output is the following. Each dart of the triangulation is given an index between \f$ 0 \f$ and \f$ n-1 \f$, where \f$ n \f$ is the number of darts of the triangulation. The first line contains the number \f$ n \f$ of darts. @@ -188,7 +188,7 @@ class Hyperbolic_surface_triangulation_2{ std::ostream& operator<<(std::ostream& s, Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2); /*! - Reads the triangulation from a stream. + reads the triangulation from a stream. The format of the input should be the same as the format of the output of the '<<' operator. \pre is_valid() diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 7a2bf9c252db..088235cbfd3f 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -81,7 +81,7 @@ class Hyperbolic_surface_triangulation_2{ //Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2&& other); Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); - Combinatorial_map_with_cross_ratios& get_combinatorial_map_ref(); + Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; Anchor& anchor() const; @@ -219,10 +219,10 @@ template //Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2&& other){ Hyperbolic_surface_triangulation_2& Hyperbolic_surface_triangulation_2::operator=(Hyperbolic_surface_triangulation_2 other){ if (other.has_anchor()){ - copy_from(other.get_combinatorial_map_ref(), other.anchor()); + copy_from(other.combinatorial_map(), other.anchor()); } else { - copy_from(other.get_combinatorial_map_ref()); + copy_from(other.combinatorial_map()); } return *this; } @@ -230,7 +230,7 @@ template //////////////////////////////////////////////////////////////////////////////// template -typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::get_combinatorial_map_ref(){ +typename Hyperbolic_surface_triangulation_2::Combinatorial_map_with_cross_ratios& Hyperbolic_surface_triangulation_2::combinatorial_map(){ return _combinatorial_map; } @@ -239,7 +239,7 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const return _has_anchor; } - template +template typename Hyperbolic_surface_triangulation_2::Anchor& Hyperbolic_surface_triangulation_2::anchor() const{ return _anchor; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index 058ea564090c..1fa5cd79a432 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -31,7 +31,7 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); assert( ! triangulation1.has_anchor() ); Triangulation triangulation (triangulation0); @@ -57,8 +57,8 @@ int main() { output_not_centered = triangulation.lift(false); output_centered = triangulation.lift(); - Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index a8d30e3b4a3f..29420b0bd30c 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -28,7 +28,7 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); assert( ! triangulation1.has_anchor() ); Triangulation triangulation (triangulation0); @@ -54,8 +54,8 @@ int main() { output_not_centered = triangulation.lift(false); output_centered = triangulation.lift(); - Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index fb72db65b90a..d191c01f2c00 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -38,7 +38,7 @@ Domain build_domain(){ pairings.push_back((k+4)%8); } - return Domain(vertices, pairings); + return Domain(vertices.begin(),vertices.end(), pairings.begin(),pairings.end()); } int main() { @@ -47,7 +47,7 @@ int main() { assert( triangulation0.is_valid() ); - Triangulation triangulation1 = Triangulation(triangulation0.get_combinatorial_map_ref()); + Triangulation triangulation1 = Triangulation(triangulation0.combinatorial_map()); assert( ! triangulation1.has_anchor() ); Triangulation triangulation (triangulation0); @@ -73,8 +73,8 @@ int main() { output_not_centered = triangulation.lift(false); output_centered = triangulation.lift(); - Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.combinatorial_map(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; From 4d85c820514e1b2e57b547b64b7a0f776e485bc8 Mon Sep 17 00:00:00 2001 From: vdespre Date: Thu, 25 Jul 2024 16:04:01 +0200 Subject: [PATCH 45/97] tests --- .../hs_test_circular_kernel.cpp | 2 +- .../hs_test_lazy_exact_nt.cpp | 2 +- .../hs_test_triangulation.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp index 058ea564090c..6325cb82cd4d 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_circular_kernel.cpp @@ -58,7 +58,7 @@ int main() { output_centered = triangulation.lift(); Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp index a8d30e3b4a3f..7afc844898cf 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt.cpp @@ -55,7 +55,7 @@ int main() { output_centered = triangulation.lift(); Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp index fb72db65b90a..074107d7245a 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_triangulation.cpp @@ -74,7 +74,7 @@ int main() { output_centered = triangulation.lift(); Triangulation::Combinatorial_map_with_cross_ratios& cmap = triangulation.get_combinatorial_map_ref(); - Triangulation::Anchor& anchor = triangulation.get_anchor_ref(); + Triangulation::Anchor& anchor = triangulation.anchor(); assert( cmap.is_dart_used(anchor.dart) ); std::cout << "printing triangulation for test purposes : " << std::endl << triangulation; From 278930ff29f1527b95dd35fcc678b2be1032f42c Mon Sep 17 00:00:00 2001 From: vdespre Date: Thu, 25 Jul 2024 16:40:44 +0200 Subject: [PATCH 46/97] =?UTF-8?q?On=20enl=C3=A8ve=20des=20const?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CGAL/Hyperbolic_fundamental_domain_2.h | 5 +++++ .../CGAL/Hyperbolic_surface_triangulation_2.h | 20 +++++++++--------- .../hs_test_domain.cpp | 5 ++--- .../hs_test_isometry.cpp | 6 +++--- .../hs_test_lazy_exact_nt | Bin 742000 -> 406128 bytes 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h index 845e937cc2d5..f3a0dbf2b5e4 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_fundamental_domain_2.h @@ -36,6 +36,8 @@ class Hyperbolic_fundamental_domain_2 { public: typedef typename Traits::Hyperbolic_point_2 Point; + Hyperbolic_fundamental_domain_2(); + Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, typename std::vector::iterator vlast, typename std::vector::iterator pfirst, @@ -65,6 +67,9 @@ template void operator>>(std::istream& s, Hyperbolic_fundamental_d //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// +template + Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(){} + template Hyperbolic_fundamental_domain_2::Hyperbolic_fundamental_domain_2(typename std::vector::iterator vfirst, typename std::vector::iterator vlast, diff --git a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h index 088235cbfd3f..c2469fa9dcd7 100644 --- a/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h +++ b/Hyperbolic_surface_triangulation_2/include/CGAL/Hyperbolic_surface_triangulation_2.h @@ -75,15 +75,15 @@ class Hyperbolic_surface_triangulation_2{ Hyperbolic_surface_triangulation_2() {}; Hyperbolic_surface_triangulation_2(const Hyperbolic_fundamental_domain_2& domain); - Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap); - Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap); + Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor); //Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2&& other); Hyperbolic_surface_triangulation_2& operator=(Hyperbolic_surface_triangulation_2 other); Combinatorial_map_with_cross_ratios& combinatorial_map(); bool has_anchor() const; - Anchor& anchor() const; + Anchor& anchor(); void to_stream(std::ostream& s) const; void from_stream(std::istream& s); @@ -113,8 +113,8 @@ class Hyperbolic_surface_triangulation_2{ Dart_handle pick_edge_to_flip(); Dart_const_handle pick_edge_to_flip() const; - void copy_from(const Combinatorial_map_with_cross_ratios& cmap); - void copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); + void copy_from(Combinatorial_map_with_cross_ratios& cmap); + void copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor); // Returns the cross ratio of the points a,b,c,d ComplexNumber cross_ratio(const Point& a, const Point& b, const Point& c, const Point& d) const; @@ -204,12 +204,12 @@ Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triang } template - Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap){ + Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap){ copy_from(cmap); } template - Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ + Hyperbolic_surface_triangulation_2::Hyperbolic_surface_triangulation_2(Combinatorial_map_with_cross_ratios& cmap, Anchor& anchor){ copy_from(cmap, anchor); } @@ -241,7 +241,7 @@ bool Hyperbolic_surface_triangulation_2::has_anchor() const template typename Hyperbolic_surface_triangulation_2::Anchor& -Hyperbolic_surface_triangulation_2::anchor() const{ +Hyperbolic_surface_triangulation_2::anchor(){ return _anchor; } @@ -675,14 +675,14 @@ template //////////////////////////////////////////////////////////////////////////////// template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap){ +void Hyperbolic_surface_triangulation_2::copy_from(Combinatorial_map_with_cross_ratios& cmap){ //_combinatorial_map.copy_from_const(cmap); _combinatorial_map.copy(cmap); _has_anchor = false; } template -void Hyperbolic_surface_triangulation_2::copy_from(const Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ +void Hyperbolic_surface_triangulation_2::copy_from(Combinatorial_map_with_cross_ratios& cmap, const Anchor& anchor){ // Because of the anchor, we must operate the copy ourself _combinatorial_map.clear(); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp index 549fb69aaade..60aecdd76226 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_domain.cpp @@ -43,7 +43,7 @@ int main() { pairings.push_back((k+4)%8); } - Domain domain = Domain(vertices, pairings); + Domain domain = Domain(vertices.begin(),vertices.end(),pairings.begin(),pairings.end()); assert( domain.size()==8 ); for (int k=0; k<8; k++){ assert( domain.vertex(k)==vertices[k] ); @@ -55,8 +55,7 @@ int main() { assert( domain.is_valid() ); - Domain domain_prime; - domain_prime.set(vertices, pairings); + Domain domain_prime = Domain(vertices.begin(),vertices.end(),pairings.begin(),pairings.end());; assert( domain_prime.size()==8 ); for (int k=0; k<8; k++){ assert( domain_prime.vertex(k)==vertices[k]); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp index df56332b02d1..f22dcfd23073 100644 --- a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp +++ b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_isometry.cpp @@ -50,7 +50,7 @@ int main() { assert( g.get_coefficient(2)==Complex(FT(56,7), FT(-21,5)) ); assert( g.get_coefficient(3)==Complex(FT(-12,17), FT(-1,3)) ); - Isometry h = f.compose(g); + Isometry h = f*g; assert( h.get_coefficient(0) == Complex(FT(5333816,65025),FT(-8,17)) ); assert( h.get_coefficient(1) == Complex(FT(-192,17),FT(-504,85)) ); assert( h.get_coefficient(2) == Complex(FT(-192,17),FT(504,85)) ); @@ -66,7 +66,7 @@ int main() { Isometry tau_1_prime = hyperbolic_translation(Point (FT(-3,11),FT(1,73)), true); Isometry tau_1_inv = hyperbolic_translation(point, true); assert( tau_1.evaluate(image_point) == tau_1_prime.evaluate(image_point) ); - assert( tau_1.compose(tau_1_inv).evaluate(image_point) == image_point ); + assert( (tau_1*tau_1_inv).evaluate(image_point) == image_point ); Point p (FT(2,15),FT(0)); Point q (FT(0),FT(17,93)); @@ -74,7 +74,7 @@ int main() { Isometry rotation_prime = hyperbolic_rotation(q, p, true); Isometry rotation_inv = hyperbolic_rotation(p, q, true); assert( rotation.evaluate(image_point) == rotation_prime.evaluate(image_point) ); - assert( rotation.compose(rotation_inv).evaluate(image_point) == image_point ); + assert( (rotation*rotation_inv).evaluate(image_point) == image_point ); Point p_imag = rotation.evaluate(p); Point q_imag = rotation.evaluate(q); diff --git a/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt b/Hyperbolic_surface_triangulation_2/test/Hyperbolic_surface_triangulation_2/hs_test_lazy_exact_nt index 3d9801056ce293dbd14545721f6fbd32ce2a6bb0..1ff5ce9a778469010a03ca030abe2eb9cd3473ec 100755 GIT binary patch literal 406128 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%0AHIrpKx=`sp0gyMJc55G^jWrX>8M9EfBXEJ4>;># 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 F`+o*mVvnEF^^_LzqCoB7-3| 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½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