From b50fda7eefee9c111a07864e2b778857dfd46afa Mon Sep 17 00:00:00 2001 From: Iordan Iordanov Date: Fri, 7 Sep 2018 11:23:10 +0200 Subject: [PATCH] modified hyperbolic translation class to expose get_generator functions as static members --- .../internal/Qt/TriangulationGraphicsItem.h | 2 +- .../internal/hyperbolic_billiards_animation.h | 2 +- .../CGAL/Hyperbolic_octagon_translation.h | 177 ++++++++++++------ .../Hyperbolic_octagon_translation_matrix.h | 28 --- 4 files changed, 118 insertions(+), 91 deletions(-) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/TriangulationGraphicsItem.h b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/TriangulationGraphicsItem.h index eb586fa0c44..ddf2e948f51 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/TriangulationGraphicsItem.h +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/Qt/TriangulationGraphicsItem.h @@ -146,7 +146,7 @@ public: void initializeTranslations() { std::vector gens; - get_generators(gens); + T::Hyperbolic_translation::get_generators(gens); std::vector tmp; for (int j = 0; j < gens.size(); j++) { tmp.push_back(gens[j]); diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_billiards_animation.h b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_billiards_animation.h index 99f747455b7..c2defcd932e 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_billiards_animation.h +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/include/internal/hyperbolic_billiards_animation.h @@ -187,7 +187,7 @@ MainWindow::animate() { // in this set with high probability. //std::cout << " ..checking generators "; std::cout.flush(); std::vector gens; - get_generators(gens); + Hyperbolic_translation::get_generators(gens); for (int i = 0; i < gens.size(); i++) { o = gens[i]; if (check(Make_point()(p,o)) == CGAL::ON_BOUNDED_SIDE) { diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h index a7225253317..0880d56e9c3 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_octagon_translation.h @@ -35,6 +35,17 @@ class Hyperbolic_octagon_translation { public: typedef unsigned short int Word_letter; + enum Generator { + A = 0, + B_BAR, + C, + D_BAR, + A_BAR, + B, + C_BAR, + D + }; + private: typedef Exact_complex ECplx; typedef Hyperbolic_octagon_translation Self; @@ -46,67 +57,81 @@ private: static std::map gmap; static std::map init_gmap() { + typedef typename std::pair Complex; + typedef typename std::pair Coefficient; + std::vector mcf; + + get_generator_coefficients(mcf); + + std::map m; vector g; - get_generators(g); + for (int i = 0; i < mcf.size(); i++) { + Complex a = mcf[i].first; + Complex b = mcf[i].second; + ECplx alpha(a.first, a.second); + ECplx beta(b.first, b.second); + g.push_back( Matrix(alpha, beta) ); + } + m["_"] = Matrix(); - m["0527"] = g[0]*g[5]*g[2]*g[7]; - m["052"] = g[0]*g[5]*g[2]; - m["05"] = g[0]*g[5]; - m["0"] = g[0]; - m["03"] = g[0]*g[3]; - m["036"] = g[0]*g[3]*g[6]; + m["0527"] = g[A]*g[B]*g[C]*g[D]; + m["052"] = g[A]*g[B]*g[C]; + m["05"] = g[A]*g[B]; + m["0"] = g[A]; + m["03"] = g[A]*g[D_BAR]; + m["036"] = g[A]*g[D_BAR]*g[C_BAR]; - m["1630"] = g[1]*g[6]*g[3]*g[0]; - m["163"] = g[1]*g[6]*g[3]; - m["16"] = g[1]*g[6]; - m["1"] = g[1]; - m["14"] = g[1]*g[4]; - m["147"] = g[1]*g[4]*g[7]; + m["1630"] = g[B_BAR]*g[C_BAR]*g[D_BAR]*g[A]; + m["163"] = g[B_BAR]*g[C_BAR]*g[D_BAR]; + m["16"] = g[B_BAR]*g[C_BAR]; + m["1"] = g[B_BAR]; + m["14"] = g[B_BAR]*g[A_BAR]; + m["147"] = g[B_BAR]*g[A_BAR]*g[D]; - m["2741"] = g[2]*g[7]*g[4]*g[1]; - m["274"] = g[2]*g[7]*g[4]; - m["27"] = g[2]*g[7]; - m["2"] = g[2]; - m["25"] = g[2]*g[5]; - m["250"] = g[2]*g[5]*g[0]; + m["2741"] = g[C]*g[D]*g[A_BAR]*g[B_BAR]; + m["274"] = g[C]*g[D]*g[A_BAR]; + m["27"] = g[C]*g[D]; + m["2"] = g[C]; + m["25"] = g[C]*g[B]; + m["250"] = g[C]*g[B]*g[A]; - m["3052"] = g[3]*g[0]*g[5]*g[2]; - m["305"] = g[3]*g[0]*g[5]; - m["30"] = g[3]*g[0]; - m["3"] = g[3]; - m["36"] = g[3]*g[6]; - m["361"] = g[3]*g[6]*g[1]; + m["3052"] = g[D_BAR]*g[A]*g[B]*g[C]; + m["305"] = g[D_BAR]*g[A]*g[B]; + m["30"] = g[D_BAR]*g[A]; + m["3"] = g[D_BAR]; + m["36"] = g[D_BAR]*g[C_BAR]; + m["361"] = g[D_BAR]*g[C_BAR]*g[B_BAR]; - m["4163"] = g[4]*g[1]*g[6]*g[3]; - m["416"] = g[4]*g[1]*g[6]; - m["41"] = g[4]*g[1]; - m["4"] = g[4]; - m["47"] = g[4]*g[7]; - m["472"] = g[4]*g[7]*g[2]; + m["4163"] = g[A_BAR]*g[B_BAR]*g[C_BAR]*g[D_BAR]; + m["416"] = g[A_BAR]*g[B_BAR]*g[C_BAR]; + m["41"] = g[A_BAR]*g[B_BAR]; + m["4"] = g[A_BAR]; + m["47"] = g[A_BAR]*g[D]; + m["472"] = g[A_BAR]*g[D]*g[C]; - m["5274"] = g[5]*g[2]*g[7]*g[4]; - m["527"] = g[5]*g[2]*g[7]; - m["52"] = g[5]*g[2]; - m["5"] = g[5]; - m["50"] = g[5]*g[0]; - m["503"] = g[5]*g[0]*g[3]; + m["5274"] = g[B]*g[C]*g[D]*g[A_BAR]; + m["527"] = g[B]*g[C]*g[D]; + m["52"] = g[B]*g[C]; + m["5"] = g[B]; + m["50"] = g[B]*g[A]; + m["503"] = g[B]*g[A]*g[D_BAR]; - m["6305"] = g[6]*g[3]*g[0]*g[5]; - m["630"] = g[6]*g[3]*g[0]; - m["63"] = g[6]*g[3]; - m["6"] = g[6]; - m["61"] = g[6]*g[1]; - m["614"] = g[6]*g[1]*g[4]; + m["6305"] = g[C_BAR]*g[D_BAR]*g[A]*g[B]; + m["630"] = g[C_BAR]*g[D_BAR]*g[A]; + m["63"] = g[C_BAR]*g[D_BAR]; + m["6"] = g[C_BAR]; + m["61"] = g[C_BAR]*g[B_BAR]; + m["614"] = g[C_BAR]*g[B_BAR]*g[A_BAR]; - m["7416"] = g[7]*g[4]*g[1]*g[6]; - m["741"] = g[7]*g[4]*g[1]; - m["74"] = g[7]*g[4]; - m["7"] = g[7]; - m["72"] = g[7]*g[2]; - m["725"] = g[7]*g[2]*g[5]; + m["7416"] = g[D]*g[A_BAR]*g[B_BAR]*g[C_BAR]; + m["741"] = g[D]*g[A_BAR]*g[B_BAR]; + m["74"] = g[D]*g[A_BAR]; + m["7"] = g[D]; + m["72"] = g[D]*g[C]; + m["725"] = g[D]*g[C]*g[B]; return m; } @@ -188,6 +213,47 @@ public: std::string to_string() const { return _wrd.to_string(); } + + + static void get_generators(std::vector& gens) { + gens.push_back(Self(A)); + gens.push_back(Self(B_BAR)); + gens.push_back(Self(C)); + gens.push_back(Self(D_BAR)); + gens.push_back(Self(A_BAR)); + gens.push_back(Self(B)); + gens.push_back(Self(C_BAR)); + gens.push_back(Self(D)); + } + + static void get_generator_coefficients(std::vector< std::pair< std::pair, + std::pair > >& gens) { + typedef typename std::pair Complex; + typedef typename std::pair Matrix; + + NT sq2 = CGAL::sqrt(NT(2)); + NT xi = NT(1) + sq2; + NT rxi = CGAL::sqrt(xi); + + Complex alpha(xi,NT(0)); // all matrices have the same _alpha + + // This vector holds the different _betas + std::vector< Complex > beta; + + beta.push_back( Complex( sq2 * rxi, 0 ) ); + beta.push_back( Complex( rxi, rxi ) ); + beta.push_back( Complex( 0, sq2 * rxi ) ); + beta.push_back( Complex( -rxi, rxi ) ); + beta.push_back( Complex( -sq2 * rxi, 0 ) ); + beta.push_back( Complex( -rxi, -rxi ) ); + beta.push_back( Complex( 0, -sq2 * rxi ) ); + beta.push_back( Complex( rxi, -rxi ) ); + + for (int i = 0; i < 8; i++) { + gens.push_back(Matrix(alpha, beta[i])); + } + } + }; @@ -202,18 +268,7 @@ std::ostream& operator<<(std::ostream& s, const Hyperbolic_octagon_translation -void get_generators(std::vector< Hyperbolic_octagon_translation >& gens) { - typedef Hyperbolic_octagon_translation Translation; - gens.push_back(Translation(0)); - gens.push_back(Translation(1)); - gens.push_back(Translation(2)); - gens.push_back(Translation(3)); - gens.push_back(Translation(4)); - gens.push_back(Translation(5)); - gens.push_back(Translation(6)); - gens.push_back(Translation(7)); -} + } // namespace CGAL diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/internal/Hyperbolic_octagon_translation_matrix.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/internal/Hyperbolic_octagon_translation_matrix.h index 297442534bd..28acb4e7aaf 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/internal/Hyperbolic_octagon_translation_matrix.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/internal/Hyperbolic_octagon_translation_matrix.h @@ -104,34 +104,6 @@ std::ostream& operator<<(std::ostream& os, const Hyperbolic_octagon_translation_ } -template < class ECplx > -void get_generators(std::vector< Hyperbolic_octagon_translation_matrix >& gens) { - typedef Hyperbolic_octagon_translation_matrix Matrix; - typedef typename Matrix::NT NT; - typedef typename Matrix::Matrix_element Matrix_element; - - NT sq2 = CGAL::sqrt(NT(2)); - NT xi = NT(1) + sq2; - NT rxi = CGAL::sqrt(xi); - - Matrix_element A = Matrix_element(xi, 0); // all matrices have the same _alpha - - // This vector holds the different _betas - std::vector B(8, Matrix_element()); - - B[0] = Matrix_element(sq2 * rxi, 0 ); - B[1] = Matrix_element(rxi, rxi ); - B[2] = Matrix_element(0, sq2 * rxi ); - B[3] = Matrix_element(-rxi, rxi ); - B[4] = Matrix_element(-sq2 * rxi, 0 ); - B[5] = Matrix_element(-rxi, -rxi ); - B[6] = Matrix_element(0, -sq2 * rxi ); - B[7] = Matrix_element(rxi, -rxi ); - - for (int i = 0; i < 8; i++) { - gens.push_back(Matrix(A, B[i])); - } -} } // namespace CGAL