snappy 3.3__cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- snappy/CyOpenGL.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/SnapPy.ico +0 -0
- snappy/SnapPy.png +0 -0
- snappy/SnapPyHP.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/__init__.py +534 -0
- snappy/app.py +604 -0
- snappy/app_menus.py +372 -0
- snappy/browser.py +998 -0
- snappy/cache.py +25 -0
- snappy/canonical.py +249 -0
- snappy/cusps/__init__.py +280 -0
- snappy/cusps/cusp_area_matrix.py +98 -0
- snappy/cusps/cusp_areas_from_matrix.py +96 -0
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/short_slopes_for_cusp.py +217 -0
- snappy/cusps/test.py +22 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +454 -0
- snappy/db_utilities.py +79 -0
- snappy/decorated_isosig.py +717 -0
- snappy/dev/__init__.py +0 -0
- snappy/dev/extended_ptolemy/__init__.py +8 -0
- snappy/dev/extended_ptolemy/closed.py +106 -0
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +149 -0
- snappy/dev/extended_ptolemy/direct.py +42 -0
- snappy/dev/extended_ptolemy/extended.py +406 -0
- snappy/dev/extended_ptolemy/giac_helper.py +43 -0
- snappy/dev/extended_ptolemy/giac_rur.py +129 -0
- snappy/dev/extended_ptolemy/gluing.py +46 -0
- snappy/dev/extended_ptolemy/phc_wrapper.py +220 -0
- snappy/dev/extended_ptolemy/printMatrices.py +70 -0
- snappy/dev/vericlosed/__init__.py +1 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureNew.py +159 -0
- snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +90 -0
- snappy/dev/vericlosed/computeVerifiedHyperbolicStructure.py +111 -0
- snappy/dev/vericlosed/gimbalLoopFinder.py +130 -0
- snappy/dev/vericlosed/hyperbolicStructure.py +313 -0
- snappy/dev/vericlosed/krawczykCertifiedEdgeLengthsEngine.py +165 -0
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +122 -0
- snappy/dev/vericlosed/orb/__init__.py +1 -0
- snappy/dev/vericlosed/orb/orb_solution_for_snappea_finite_triangulation_mac +0 -0
- snappy/dev/vericlosed/parseVertexGramMatrixFile.py +47 -0
- snappy/dev/vericlosed/polishApproxHyperbolicStructure.py +61 -0
- snappy/dev/vericlosed/test.py +54 -0
- snappy/dev/vericlosed/truncatedComplex.py +176 -0
- snappy/dev/vericlosed/verificationError.py +58 -0
- snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +177 -0
- snappy/doc/_images/SnapPy-196.png +0 -0
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +0 -0
- snappy/doc/_images/mac.png +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
- snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
- snappy/doc/_images/plink-action.png +0 -0
- snappy/doc/_images/ubuntu.png +0 -0
- snappy/doc/_images/win7.png +0 -0
- snappy/doc/_sources/additional_classes.rst.txt +40 -0
- snappy/doc/_sources/bugs.rst.txt +14 -0
- snappy/doc/_sources/censuses.rst.txt +52 -0
- snappy/doc/_sources/credits.rst.txt +81 -0
- snappy/doc/_sources/development.rst.txt +261 -0
- snappy/doc/_sources/index.rst.txt +215 -0
- snappy/doc/_sources/installing.rst.txt +249 -0
- snappy/doc/_sources/manifold.rst.txt +6 -0
- snappy/doc/_sources/manifoldhp.rst.txt +46 -0
- snappy/doc/_sources/news.rst.txt +425 -0
- snappy/doc/_sources/other.rst.txt +25 -0
- snappy/doc/_sources/platonic_census.rst.txt +20 -0
- snappy/doc/_sources/plink.rst.txt +102 -0
- snappy/doc/_sources/ptolemy.rst.txt +66 -0
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -0
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -0
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -0
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -0
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -0
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -0
- snappy/doc/_sources/screenshots.rst.txt +21 -0
- snappy/doc/_sources/snap.rst.txt +87 -0
- snappy/doc/_sources/snappy.rst.txt +28 -0
- snappy/doc/_sources/spherogram.rst.txt +103 -0
- snappy/doc/_sources/todo.rst.txt +47 -0
- snappy/doc/_sources/triangulation.rst.txt +11 -0
- snappy/doc/_sources/tutorial.rst.txt +49 -0
- snappy/doc/_sources/verify.rst.txt +210 -0
- snappy/doc/_sources/verify_internals.rst.txt +79 -0
- snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
- snappy/doc/_static/SnapPy.ico +0 -0
- snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- snappy/doc/_static/basic.css +906 -0
- snappy/doc/_static/css/badge_only.css +1 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
- snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
- snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
- snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
- snappy/doc/_static/css/theme.css +4 -0
- snappy/doc/_static/doctools.js +149 -0
- snappy/doc/_static/documentation_options.js +13 -0
- snappy/doc/_static/file.png +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
- snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- snappy/doc/_static/jquery.js +2 -0
- snappy/doc/_static/js/badge_only.js +1 -0
- snappy/doc/_static/js/theme.js +1 -0
- snappy/doc/_static/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +192 -0
- snappy/doc/_static/minus.png +0 -0
- snappy/doc/_static/plus.png +0 -0
- snappy/doc/_static/pygments.css +75 -0
- snappy/doc/_static/searchtools.js +635 -0
- snappy/doc/_static/snappy_furo.css +33 -0
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
- snappy/doc/_static/sphinx_highlight.js +154 -0
- snappy/doc/additional_classes.html +1500 -0
- snappy/doc/bugs.html +132 -0
- snappy/doc/censuses.html +453 -0
- snappy/doc/credits.html +184 -0
- snappy/doc/development.html +385 -0
- snappy/doc/doc-latest/additional_classes.html +1500 -0
- snappy/doc/doc-latest/bugs.html +132 -0
- snappy/doc/doc-latest/censuses.html +453 -0
- snappy/doc/doc-latest/credits.html +184 -0
- snappy/doc/doc-latest/development.html +385 -0
- snappy/doc/doc-latest/genindex.html +1349 -0
- snappy/doc/doc-latest/index.html +287 -0
- snappy/doc/doc-latest/installing.html +346 -0
- snappy/doc/doc-latest/manifold.html +3632 -0
- snappy/doc/doc-latest/manifoldhp.html +180 -0
- snappy/doc/doc-latest/news.html +438 -0
- snappy/doc/doc-latest/objects.inv +0 -0
- snappy/doc/doc-latest/other.html +160 -0
- snappy/doc/doc-latest/platonic_census.html +376 -0
- snappy/doc/doc-latest/plink.html +210 -0
- snappy/doc/doc-latest/ptolemy.html +253 -0
- snappy/doc/doc-latest/ptolemy_classes.html +1144 -0
- snappy/doc/doc-latest/ptolemy_examples1.html +409 -0
- snappy/doc/doc-latest/ptolemy_examples2.html +471 -0
- snappy/doc/doc-latest/ptolemy_examples3.html +414 -0
- snappy/doc/doc-latest/ptolemy_examples4.html +195 -0
- snappy/doc/doc-latest/ptolemy_prelim.html +248 -0
- snappy/doc/doc-latest/py-modindex.html +165 -0
- snappy/doc/doc-latest/screenshots.html +141 -0
- snappy/doc/doc-latest/search.html +135 -0
- snappy/doc/doc-latest/searchindex.js +1 -0
- snappy/doc/doc-latest/snap.html +202 -0
- snappy/doc/doc-latest/snappy.html +181 -0
- snappy/doc/doc-latest/spherogram.html +1346 -0
- snappy/doc/doc-latest/todo.html +166 -0
- snappy/doc/doc-latest/triangulation.html +1676 -0
- snappy/doc/doc-latest/tutorial.html +159 -0
- snappy/doc/doc-latest/verify.html +330 -0
- snappy/doc/doc-latest/verify_internals.html +1235 -0
- snappy/doc/genindex.html +1349 -0
- snappy/doc/index.html +287 -0
- snappy/doc/installing.html +346 -0
- snappy/doc/manifold.html +3632 -0
- snappy/doc/manifoldhp.html +180 -0
- snappy/doc/news.html +438 -0
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -0
- snappy/doc/platonic_census.html +376 -0
- snappy/doc/plink.html +210 -0
- snappy/doc/ptolemy.html +253 -0
- snappy/doc/ptolemy_classes.html +1144 -0
- snappy/doc/ptolemy_examples1.html +409 -0
- snappy/doc/ptolemy_examples2.html +471 -0
- snappy/doc/ptolemy_examples3.html +414 -0
- snappy/doc/ptolemy_examples4.html +195 -0
- snappy/doc/ptolemy_prelim.html +248 -0
- snappy/doc/py-modindex.html +165 -0
- snappy/doc/screenshots.html +141 -0
- snappy/doc/search.html +135 -0
- snappy/doc/searchindex.js +1 -0
- snappy/doc/snap.html +202 -0
- snappy/doc/snappy.html +181 -0
- snappy/doc/spherogram.html +1346 -0
- snappy/doc/todo.html +166 -0
- snappy/doc/triangulation.html +1676 -0
- snappy/doc/tutorial.html +159 -0
- snappy/doc/verify.html +330 -0
- snappy/doc/verify_internals.html +1235 -0
- snappy/drilling/__init__.py +456 -0
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +5 -0
- snappy/drilling/crush.py +270 -0
- snappy/drilling/cusps.py +125 -0
- snappy/drilling/debug.py +242 -0
- snappy/drilling/epsilons.py +6 -0
- snappy/drilling/exceptions.py +55 -0
- snappy/drilling/moves.py +620 -0
- snappy/drilling/peripheral_curves.py +210 -0
- snappy/drilling/perturb.py +188 -0
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +274 -0
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +132 -0
- snappy/drilling/tracing.py +351 -0
- snappy/exceptions.py +26 -0
- snappy/export_stl.py +120 -0
- snappy/exterior_to_link/__init__.py +2 -0
- snappy/exterior_to_link/barycentric_geometry.py +463 -0
- snappy/exterior_to_link/exceptions.py +6 -0
- snappy/exterior_to_link/geodesic_map.json +14408 -0
- snappy/exterior_to_link/hyp_utils.py +112 -0
- snappy/exterior_to_link/link_projection.py +323 -0
- snappy/exterior_to_link/main.py +198 -0
- snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
- snappy/exterior_to_link/mcomplex_with_link.py +687 -0
- snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
- snappy/exterior_to_link/pl_utils.py +491 -0
- snappy/exterior_to_link/put_in_S3.py +156 -0
- snappy/exterior_to_link/rational_linear_algebra.py +130 -0
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
- snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
- snappy/exterior_to_link/stored_moves.py +475 -0
- snappy/exterior_to_link/test.py +31 -0
- snappy/filedialog.py +28 -0
- snappy/geometric_structure/__init__.py +212 -0
- snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
- snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +691 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +480 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +41 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +294 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +156 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +35 -0
- snappy/geometric_structure/geodesic/__init__.py +0 -0
- snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
- snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
- snappy/geometric_structure/geodesic/canonical_representatives.py +52 -0
- snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
- snappy/geometric_structure/geodesic/constants.py +6 -0
- snappy/geometric_structure/geodesic/exceptions.py +22 -0
- snappy/geometric_structure/geodesic/fixed_points.py +106 -0
- snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
- snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
- snappy/geometric_structure/geodesic/line.py +30 -0
- snappy/geometric_structure/geodesic/multiplicity.py +127 -0
- snappy/geometric_structure/geodesic/tiles_for_geodesic.py +128 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +121 -0
- snappy/horoviewer.py +443 -0
- snappy/hyperboloid/__init__.py +212 -0
- snappy/hyperboloid/distances.py +259 -0
- snappy/hyperboloid/horoball.py +19 -0
- snappy/hyperboloid/line.py +35 -0
- snappy/hyperboloid/point.py +9 -0
- snappy/hyperboloid/triangle.py +29 -0
- snappy/info_icon.gif +0 -0
- snappy/infowindow.py +65 -0
- snappy/isometry_signature.py +389 -0
- snappy/len_spec/__init__.py +609 -0
- snappy/len_spec/geodesic_info.py +129 -0
- snappy/len_spec/geodesic_key_info_dict.py +116 -0
- snappy/len_spec/geodesic_piece.py +146 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +136 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +185 -0
- snappy/len_spec/spine.py +128 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +276 -0
- snappy/len_spec/word.py +86 -0
- snappy/manifolds/HTWKnots/alternating.gz +0 -0
- snappy/manifolds/HTWKnots/nonalternating.gz +0 -0
- snappy/manifolds/__init__.py +3 -0
- snappy/margulis/__init__.py +332 -0
- snappy/margulis/cusp_neighborhood_neighborhood.py +66 -0
- snappy/margulis/geodesic_neighborhood.py +152 -0
- snappy/margulis/margulis_info.py +21 -0
- snappy/margulis/mu_from_neighborhood_pair.py +175 -0
- snappy/margulis/neighborhood.py +29 -0
- snappy/margulis/test.py +22 -0
- snappy/math_basics.py +187 -0
- snappy/matrix.py +525 -0
- snappy/number.py +657 -0
- snappy/numeric_output_checker.py +345 -0
- snappy/pari.py +41 -0
- snappy/phone_home.py +57 -0
- snappy/polyviewer.py +259 -0
- snappy/ptolemy/__init__.py +17 -0
- snappy/ptolemy/component.py +103 -0
- snappy/ptolemy/coordinates.py +2290 -0
- snappy/ptolemy/fieldExtensions.py +153 -0
- snappy/ptolemy/findLoops.py +473 -0
- snappy/ptolemy/geometricRep.py +59 -0
- snappy/ptolemy/homology.py +165 -0
- snappy/ptolemy/magma/default.magma_template +229 -0
- snappy/ptolemy/magma/radicalsOfPrimaryDecomposition.magma_template +79 -0
- snappy/ptolemy/manifoldMethods.py +395 -0
- snappy/ptolemy/matrix.py +350 -0
- snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +113 -0
- snappy/ptolemy/polynomial.py +856 -0
- snappy/ptolemy/processComponents.py +173 -0
- snappy/ptolemy/processFileBase.py +247 -0
- snappy/ptolemy/processFileDispatch.py +46 -0
- snappy/ptolemy/processMagmaFile.py +392 -0
- snappy/ptolemy/processRurFile.py +150 -0
- snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +102 -0
- snappy/ptolemy/ptolemyObstructionClass.py +64 -0
- snappy/ptolemy/ptolemyVariety.py +995 -0
- snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +140 -0
- snappy/ptolemy/reginaWrapper.py +698 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/regina_testing_files_generalized/m015__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/rur.py +545 -0
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +277 -0
- snappy/ptolemy/test.py +1126 -0
- snappy/ptolemy/testing_files/3_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/3_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/4_1__sl4_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/5_2__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/DT_mcbbiceaibjklmdfgh__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c0.magma_out +95 -0
- snappy/ptolemy/testing_files/data/pgl2/OrientableCuspedCensus/03_tetrahedra/m019__sl2_c1.magma_out +95 -0
- snappy/ptolemy/testing_files/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c4.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c5.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c6.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/m135__sl2_c7.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/s000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/t00000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c2.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files/v0000__sl2_c3.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m003__sl3_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m004__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl2_c1.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_generalized/m015__sl3_c0.magma_out.bz2 +0 -0
- snappy/ptolemy/testing_files_rur/m052__sl3_c0.rur.bz2 +0 -0
- snappy/ptolemy/utilities.py +236 -0
- snappy/raytracing/__init__.py +64 -0
- snappy/raytracing/additional_horospheres.py +64 -0
- snappy/raytracing/additional_len_spec_choices.py +63 -0
- snappy/raytracing/cohomology_fractal.py +197 -0
- snappy/raytracing/eyeball.py +124 -0
- snappy/raytracing/finite_raytracing_data.py +237 -0
- snappy/raytracing/finite_viewer.py +590 -0
- snappy/raytracing/geodesic_tube_info.py +174 -0
- snappy/raytracing/geodesics.py +246 -0
- snappy/raytracing/geodesics_window.py +258 -0
- snappy/raytracing/gui_utilities.py +293 -0
- snappy/raytracing/hyperboloid_navigation.py +556 -0
- snappy/raytracing/hyperboloid_utilities.py +234 -0
- snappy/raytracing/ideal_raytracing_data.py +592 -0
- snappy/raytracing/inside_viewer.py +974 -0
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +126 -0
- snappy/raytracing/raytracing_view.py +454 -0
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +101 -0
- snappy/raytracing/shaders/fragment.glsl +1744 -0
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +98 -0
- snappy/raytracing/view_scale_controller.py +98 -0
- snappy/raytracing/zoom_slider/__init__.py +263 -0
- snappy/raytracing/zoom_slider/inward.png +0 -0
- snappy/raytracing/zoom_slider/inward18.png +0 -0
- snappy/raytracing/zoom_slider/outward.png +0 -0
- snappy/raytracing/zoom_slider/outward18.png +0 -0
- snappy/raytracing/zoom_slider/test.py +20 -0
- snappy/sage_helper.py +119 -0
- snappy/settings.py +407 -0
- snappy/shell.py +53 -0
- snappy/snap/__init__.py +117 -0
- snappy/snap/character_varieties.py +375 -0
- snappy/snap/find_field.py +372 -0
- snappy/snap/fox_milnor.py +271 -0
- snappy/snap/fundamental_polyhedron.py +569 -0
- snappy/snap/generators.py +39 -0
- snappy/snap/interval_reps.py +81 -0
- snappy/snap/kernel_structures.py +128 -0
- snappy/snap/mcomplex_base.py +18 -0
- snappy/snap/nsagetools.py +716 -0
- snappy/snap/peripheral/__init__.py +1 -0
- snappy/snap/peripheral/dual_cellulation.py +219 -0
- snappy/snap/peripheral/link.py +127 -0
- snappy/snap/peripheral/peripheral.py +159 -0
- snappy/snap/peripheral/surface.py +522 -0
- snappy/snap/peripheral/test.py +35 -0
- snappy/snap/polished_reps.py +335 -0
- snappy/snap/shapes.py +152 -0
- snappy/snap/slice_obs_HKL/__init__.py +194 -0
- snappy/snap/slice_obs_HKL/basics.py +236 -0
- snappy/snap/slice_obs_HKL/direct.py +217 -0
- snappy/snap/slice_obs_HKL/poly_norm.py +212 -0
- snappy/snap/slice_obs_HKL/rep_theory.py +424 -0
- snappy/snap/t3mlite/__init__.py +2 -0
- snappy/snap/t3mlite/arrow.py +243 -0
- snappy/snap/t3mlite/corner.py +22 -0
- snappy/snap/t3mlite/edge.py +172 -0
- snappy/snap/t3mlite/face.py +37 -0
- snappy/snap/t3mlite/files.py +211 -0
- snappy/snap/t3mlite/homology.py +53 -0
- snappy/snap/t3mlite/linalg.py +419 -0
- snappy/snap/t3mlite/mcomplex.py +1499 -0
- snappy/snap/t3mlite/perm4.py +320 -0
- snappy/snap/t3mlite/setup.py +12 -0
- snappy/snap/t3mlite/simplex.py +199 -0
- snappy/snap/t3mlite/spun.py +297 -0
- snappy/snap/t3mlite/surface.py +519 -0
- snappy/snap/t3mlite/test.py +20 -0
- snappy/snap/t3mlite/test_vs_regina.py +86 -0
- snappy/snap/t3mlite/tetrahedron.py +109 -0
- snappy/snap/t3mlite/vertex.py +42 -0
- snappy/snap/test.py +139 -0
- snappy/snap/utilities.py +288 -0
- snappy/test.py +213 -0
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/dict_based_set.py +79 -0
- snappy/tiling/floor.py +49 -0
- snappy/tiling/hyperboloid_dict.py +54 -0
- snappy/tiling/iter_utils.py +78 -0
- snappy/tiling/lifted_tetrahedron.py +22 -0
- snappy/tiling/lifted_tetrahedron_set.py +54 -0
- snappy/tiling/quotient_dict.py +70 -0
- snappy/tiling/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +224 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +920 -0
- snappy/twister/__init__.py +20 -0
- snappy/twister/main.py +646 -0
- snappy/twister/surfaces/S_0_1 +3 -0
- snappy/twister/surfaces/S_0_2 +3 -0
- snappy/twister/surfaces/S_0_4 +7 -0
- snappy/twister/surfaces/S_0_4_Lantern +8 -0
- snappy/twister/surfaces/S_1 +3 -0
- snappy/twister/surfaces/S_1_1 +4 -0
- snappy/twister/surfaces/S_1_2 +5 -0
- snappy/twister/surfaces/S_1_2_5 +6 -0
- snappy/twister/surfaces/S_2 +6 -0
- snappy/twister/surfaces/S_2_1 +8 -0
- snappy/twister/surfaces/S_2_heeg +10 -0
- snappy/twister/surfaces/S_3 +8 -0
- snappy/twister/surfaces/S_3_1 +10 -0
- snappy/twister/surfaces/S_4_1 +12 -0
- snappy/twister/surfaces/S_5_1 +14 -0
- snappy/twister/surfaces/heeg_fig8 +9 -0
- snappy/twister/twister_core.cpython-310-aarch64-linux-gnu.so +0 -0
- snappy/upper_halfspace/__init__.py +146 -0
- snappy/upper_halfspace/ideal_point.py +29 -0
- snappy/verify/__init__.py +13 -0
- snappy/verify/canonical.py +542 -0
- snappy/verify/complex_volume/__init__.py +18 -0
- snappy/verify/complex_volume/adjust_torsion.py +86 -0
- snappy/verify/complex_volume/closed.py +168 -0
- snappy/verify/complex_volume/compute_ptolemys.py +90 -0
- snappy/verify/complex_volume/cusped.py +56 -0
- snappy/verify/complex_volume/extended_bloch.py +201 -0
- snappy/verify/cusp_translations.py +85 -0
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +254 -0
- snappy/verify/hyperbolicity.py +224 -0
- snappy/verify/interval_newton_shapes_engine.py +523 -0
- snappy/verify/interval_tree.py +400 -0
- snappy/verify/krawczyk_shapes_engine.py +518 -0
- snappy/verify/real_algebra.py +286 -0
- snappy/verify/shapes.py +25 -0
- snappy/verify/square_extensions.py +1005 -0
- snappy/verify/test.py +72 -0
- snappy/verify/volume.py +128 -0
- snappy/version.py +2 -0
- snappy-3.3.dist-info/METADATA +58 -0
- snappy-3.3.dist-info/RECORD +541 -0
- snappy-3.3.dist-info/WHEEL +6 -0
- snappy-3.3.dist-info/entry_points.txt +2 -0
- snappy-3.3.dist-info/top_level.txt +28 -0
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
from .hyperboloid_utilities import *
|
|
2
|
+
from ..matrix import matrix
|
|
3
|
+
import time
|
|
4
|
+
import sys
|
|
5
|
+
import tempfile
|
|
6
|
+
import png
|
|
7
|
+
|
|
8
|
+
__all__ = ['HyperboloidNavigation']
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _move_left(rot_amount, trans_amount):
|
|
12
|
+
RF = trans_amount.parent()
|
|
13
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
14
|
+
[ RF(-1), RF(0), RF(0) ], trans_amount) # a
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _move_right(rot_amount, trans_amount):
|
|
18
|
+
RF = trans_amount.parent()
|
|
19
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
20
|
+
[ RF(+1), RF(0), RF(0) ], trans_amount) # d
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _move_up(rot_amount, trans_amount):
|
|
24
|
+
RF = trans_amount.parent()
|
|
25
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
26
|
+
[ RF(0), RF(+1), RF(0) ], trans_amount) # e
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _move_down(rot_amount, trans_amount):
|
|
30
|
+
RF = trans_amount.parent()
|
|
31
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
32
|
+
[ RF(0), RF(-1), RF(0) ], trans_amount) # c
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _move_forward(rot_amount, trans_amount):
|
|
36
|
+
RF = trans_amount.parent()
|
|
37
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
38
|
+
[ RF(0), RF(0), RF(-1) ], trans_amount) # w
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _move_backward(rot_amount, trans_amount):
|
|
42
|
+
RF = trans_amount.parent()
|
|
43
|
+
return unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
44
|
+
[ RF(0), RF(0), RF(+1) ], trans_amount) # s
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _turn_left(rot_amount, trans_amount):
|
|
48
|
+
return O13_y_rotation(-rot_amount)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _turn_right(rot_amount, trans_amount):
|
|
52
|
+
return O13_y_rotation(rot_amount)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _turn_up(rot_amount, trans_amount):
|
|
56
|
+
return O13_x_rotation(-rot_amount)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _turn_down(rot_amount, trans_amount):
|
|
60
|
+
return O13_x_rotation(rot_amount)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _turn_cw(rot_amount, trans_amount): # x
|
|
64
|
+
return O13_z_rotation(-rot_amount)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _turn_ccw(rot_amount, trans_amount): # z
|
|
68
|
+
return O13_z_rotation(rot_amount)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _add_cursor_keys(d):
|
|
72
|
+
d['left'] = _turn_left
|
|
73
|
+
d['right'] = _turn_right
|
|
74
|
+
d['up'] = _turn_up
|
|
75
|
+
d['down'] = _turn_down
|
|
76
|
+
return d
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
_keymappings = {
|
|
80
|
+
'QWERTY' : _add_cursor_keys(
|
|
81
|
+
{ 'a' : _move_left,
|
|
82
|
+
'd' : _move_right,
|
|
83
|
+
'e' : _move_up,
|
|
84
|
+
'c' : _move_down,
|
|
85
|
+
'w' : _move_forward,
|
|
86
|
+
's' : _move_backward,
|
|
87
|
+
'x' : _turn_cw,
|
|
88
|
+
'z' : _turn_ccw }),
|
|
89
|
+
'AZERTY' : _add_cursor_keys(
|
|
90
|
+
{ 'q' : _move_left,
|
|
91
|
+
'd' : _move_right,
|
|
92
|
+
'e' : _move_up,
|
|
93
|
+
'c' : _move_down,
|
|
94
|
+
'z' : _move_forward,
|
|
95
|
+
's' : _move_backward,
|
|
96
|
+
'x' : _turn_cw,
|
|
97
|
+
'w' : _turn_ccw }),
|
|
98
|
+
'QWERTZ' : _add_cursor_keys(
|
|
99
|
+
{ 'a' : _move_left,
|
|
100
|
+
'd' : _move_right,
|
|
101
|
+
'e' : _move_up,
|
|
102
|
+
'c' : _move_down,
|
|
103
|
+
'w' : _move_forward,
|
|
104
|
+
's' : _move_backward,
|
|
105
|
+
'x' : _turn_cw,
|
|
106
|
+
'y' : _turn_ccw })
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if sys.platform == 'linux2' or sys.platform == 'linux':
|
|
110
|
+
_closed_hand_cursor = 'fleur'
|
|
111
|
+
_open_hand_cursor = 'hand1'
|
|
112
|
+
elif sys.platform == 'darwin':
|
|
113
|
+
_closed_hand_cursor = 'closedhand'
|
|
114
|
+
_open_hand_cursor = 'openhand'
|
|
115
|
+
else:
|
|
116
|
+
_closed_hand_cursor = 'hand2'
|
|
117
|
+
_open_hand_cursor = 'hand1'
|
|
118
|
+
|
|
119
|
+
_default_cursor = _open_hand_cursor
|
|
120
|
+
_default_move_cursor = _closed_hand_cursor
|
|
121
|
+
|
|
122
|
+
_cursor_mappings = {
|
|
123
|
+
'shift_l' : 'exchange',
|
|
124
|
+
'shift_r' : 'exchange',
|
|
125
|
+
'alt_l' : 'tcross',
|
|
126
|
+
'alt_r' : 'tcross',
|
|
127
|
+
'meta_l' : 'tcross',
|
|
128
|
+
'meta_r' : 'tcross'
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_refresh_delay_ms = 10
|
|
132
|
+
|
|
133
|
+
# Some systems report key repeats as key release immediately followed by key press.
|
|
134
|
+
# We ignore such key release events if the time passed since the key press
|
|
135
|
+
# is less than this:
|
|
136
|
+
_ignore_key_release_time_s = 0.005
|
|
137
|
+
|
|
138
|
+
_viewModes = [ 'Weight', 'Distance', 'Tet Num' ]
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class HyperboloidNavigation:
|
|
142
|
+
"""
|
|
143
|
+
A mixin class for a Tk widget that binds some key and mouse events
|
|
144
|
+
to navigate through the hyperboloid model of hyperbolic 3-space.
|
|
145
|
+
|
|
146
|
+
This is a mixin class and some other class in the class hierarchy
|
|
147
|
+
is expected to provide the following attributes and methods:
|
|
148
|
+
|
|
149
|
+
- self.raytracing_data has to be an instance of, e.g.,
|
|
150
|
+
IdealRaytracingData. This is needed to update data
|
|
151
|
+
such as the view matrix
|
|
152
|
+
using self.raytracing_data.update_view_state(...).
|
|
153
|
+
- self.draw() to redraw.
|
|
154
|
+
- self.read_depth_value(x, y) to return the depth value at a pixel.
|
|
155
|
+
It is used for orbiting about that point.
|
|
156
|
+
- self.compute_translation_and_inverse_from_pick_point(size, xy, depth)
|
|
157
|
+
returning the SO(1,3)-matrices for conjugating to orbit with a certain
|
|
158
|
+
speed about the point with frag coord xy and depth given a viewport of
|
|
159
|
+
size size.
|
|
160
|
+
|
|
161
|
+
The mixin class will provide the attribute self.view_state (e.g.,
|
|
162
|
+
pair of view matrix and tetrahedron we are in).
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
def __init__(self):
|
|
166
|
+
# Mouse position/view state (e.g., view matrix)
|
|
167
|
+
# when mouse button was pressed
|
|
168
|
+
self.mouse_pos_when_pressed = None
|
|
169
|
+
self.view_state_when_pressed = None
|
|
170
|
+
# Mouse position last time a mouse event was processed
|
|
171
|
+
self.last_mouse_pos = None
|
|
172
|
+
|
|
173
|
+
# What mouse movements should do (move, rotate, orbit),
|
|
174
|
+
# recorded when user clicks mouse by looking at modifiers
|
|
175
|
+
# (alt, shift, ...).
|
|
176
|
+
self.mouse_mode = None
|
|
177
|
+
|
|
178
|
+
self.setup_keymapping()
|
|
179
|
+
|
|
180
|
+
# Is a call to process_keys_and_redraw scheduled with
|
|
181
|
+
# Tk's after(...).
|
|
182
|
+
self.process_keys_and_redraw_scheduled = False
|
|
183
|
+
|
|
184
|
+
# The view state (e.g., pair of view matrix and tetrahedron
|
|
185
|
+
# the camera is in).
|
|
186
|
+
self.view_state = self.raytracing_data.initial_view_state()
|
|
187
|
+
|
|
188
|
+
self.cursor = _default_cursor
|
|
189
|
+
self.configure(cursor=self.cursor)
|
|
190
|
+
|
|
191
|
+
# Parameters controlling navigation in the same format that
|
|
192
|
+
# get_uniform_binding returns..
|
|
193
|
+
self.navigation_dict = {
|
|
194
|
+
'translationVelocity' : ['float', 0.4],
|
|
195
|
+
'rotationVelocity' : ['float', 0.4]
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
self.bind('<KeyPress>', self.tkKeyPress)
|
|
199
|
+
self.bind('<KeyRelease>', self.tkKeyRelease)
|
|
200
|
+
self.bind_class('inside', '<KeyPress>', self.tkKeyPress)
|
|
201
|
+
self.bind_class('inside', '<KeyRelease>', self.tkKeyRelease)
|
|
202
|
+
|
|
203
|
+
self.bind('<Button-1>', self.tkButton1)
|
|
204
|
+
self.bind('<Shift-Button-1>', self.tkShiftButton1)
|
|
205
|
+
self.bind('<Alt-Button-1>', self.tkAltButton1)
|
|
206
|
+
# According to https://wiki.tcl-lang.org/page/Modifier+Keys,
|
|
207
|
+
# Alt-Click on Mac OS X Aqua causes <Option-...> event.
|
|
208
|
+
if sys.platform == 'darwin':
|
|
209
|
+
self.bind('<Option-Button-1>', self.tkAltButton1)
|
|
210
|
+
# We also provide the command key since native Mac apps tend
|
|
211
|
+
# to use the command key where PC apps use the Alt key.
|
|
212
|
+
self.bind('<Command-Button-1>', self.tkAltButton1)
|
|
213
|
+
|
|
214
|
+
self.bind('<B1-Motion>', self.tkButtonMotion1)
|
|
215
|
+
self.bind('<ButtonRelease-1>', self.tkButtonRelease1)
|
|
216
|
+
|
|
217
|
+
def reset_view_state(self):
|
|
218
|
+
"""
|
|
219
|
+
Resets view state.
|
|
220
|
+
"""
|
|
221
|
+
self.view_state = self.raytracing_data.initial_view_state()
|
|
222
|
+
|
|
223
|
+
def fix_view_state(self):
|
|
224
|
+
"""
|
|
225
|
+
Fixes view state. Implementation resides with self.raytracing_data,
|
|
226
|
+
e.g., if the view matrix takes the camera outside of the current
|
|
227
|
+
tetrahedron, it would change the view matrix and current tetrahedron
|
|
228
|
+
to fix it.
|
|
229
|
+
"""
|
|
230
|
+
self.view_state = self.raytracing_data.update_view_state(
|
|
231
|
+
self.view_state)
|
|
232
|
+
|
|
233
|
+
def schedule_process_key_events_and_redraw(self, time_ms):
|
|
234
|
+
"""
|
|
235
|
+
Schedule call to process_key_events_and_redraw in given time
|
|
236
|
+
(milliseconds) if not scheduled already.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
if self.process_keys_and_redraw_scheduled:
|
|
240
|
+
return
|
|
241
|
+
self.process_keys_and_redraw_scheduled = True
|
|
242
|
+
self.after(time_ms, self.process_key_events_and_redraw)
|
|
243
|
+
|
|
244
|
+
def process_key_events_and_redraw(self):
|
|
245
|
+
"""
|
|
246
|
+
Go through the recorded time stamps of the key press and release
|
|
247
|
+
events and update the view accordingly.
|
|
248
|
+
"""
|
|
249
|
+
|
|
250
|
+
self.process_keys_and_redraw_scheduled = False
|
|
251
|
+
|
|
252
|
+
t = time.time()
|
|
253
|
+
|
|
254
|
+
# Compute the matrix to update the view
|
|
255
|
+
m = matrix.identity(self.raytracing_data.RF, 4)
|
|
256
|
+
|
|
257
|
+
# Is there any key event that needs processing so we need to
|
|
258
|
+
# redraw.
|
|
259
|
+
any_key = False
|
|
260
|
+
|
|
261
|
+
# For each key k we are interested in (wasd, ...), look at the
|
|
262
|
+
# time stamps when key was pressed or released.
|
|
263
|
+
for k, last_and_release in (
|
|
264
|
+
self.key_to_last_accounted_and_release_time.items()):
|
|
265
|
+
|
|
266
|
+
# The amount of key press time we need to account for when
|
|
267
|
+
# updating the view (this is either the amount time passed since
|
|
268
|
+
# the key was or the amount of time since we last processed the
|
|
269
|
+
# key events).
|
|
270
|
+
dT = None
|
|
271
|
+
|
|
272
|
+
if last_and_release[0] is None:
|
|
273
|
+
# If there is no time stamp for a key press, erase time
|
|
274
|
+
# stamp for key release - just for sanity.
|
|
275
|
+
last_and_release[1] = None
|
|
276
|
+
else:
|
|
277
|
+
# Check whether the key was released. Note that we get
|
|
278
|
+
# key repeats on Mac: we get a key release event immediately
|
|
279
|
+
# followed by a key press event. If we happen to be called
|
|
280
|
+
# between these two key events, we pretend the key release
|
|
281
|
+
# never happened.
|
|
282
|
+
if ((not last_and_release[1] is None)
|
|
283
|
+
# Pretend there was no key release if key release
|
|
284
|
+
# was less than _ignore_relase_time_s seconds ago.
|
|
285
|
+
and t - last_and_release[1] > _ignore_key_release_time_s):
|
|
286
|
+
|
|
287
|
+
# Compute amount of time until the key release happened
|
|
288
|
+
dT = last_and_release[1] - last_and_release[0]
|
|
289
|
+
|
|
290
|
+
# Erase record of key press and release event
|
|
291
|
+
last_and_release[0] = None
|
|
292
|
+
last_and_release[1] = None
|
|
293
|
+
else:
|
|
294
|
+
# key is currently pressed.
|
|
295
|
+
# Compute amount of time that passed since the last time
|
|
296
|
+
# we processed key events or the key was pressed originally
|
|
297
|
+
# if not processed yet.
|
|
298
|
+
dT = t - last_and_release[0]
|
|
299
|
+
# Record the current time stamp for the next call
|
|
300
|
+
# to process_key_events_and_redraw.
|
|
301
|
+
last_and_release[0] = t
|
|
302
|
+
|
|
303
|
+
# If there is key press time we need to account for
|
|
304
|
+
if dT is not None:
|
|
305
|
+
RF = m.base_ring()
|
|
306
|
+
# Compute effect on view matrix
|
|
307
|
+
m = m * self.keymapping[k](
|
|
308
|
+
RF(dT * self.navigation_dict['rotationVelocity'][1]),
|
|
309
|
+
RF(dT * self.navigation_dict['translationVelocity'][1]))
|
|
310
|
+
any_key = True
|
|
311
|
+
|
|
312
|
+
if not any_key:
|
|
313
|
+
# No need to update view, bail
|
|
314
|
+
return
|
|
315
|
+
|
|
316
|
+
# Update view
|
|
317
|
+
self.view_state = self.raytracing_data.update_view_state(
|
|
318
|
+
self.view_state, m)
|
|
319
|
+
|
|
320
|
+
# Redraw
|
|
321
|
+
self.draw()
|
|
322
|
+
|
|
323
|
+
# And schedule another call of this function.
|
|
324
|
+
# If we don't leave Tk a couple of milliseconds in between,
|
|
325
|
+
# the system behaves weird.
|
|
326
|
+
self.schedule_process_key_events_and_redraw(_refresh_delay_ms)
|
|
327
|
+
|
|
328
|
+
def tkKeyRelease(self, event):
|
|
329
|
+
# Record key release
|
|
330
|
+
k = event.keysym.lower()
|
|
331
|
+
t = time.time()
|
|
332
|
+
|
|
333
|
+
last_and_release = self.key_to_last_accounted_and_release_time.get(k)
|
|
334
|
+
if last_and_release:
|
|
335
|
+
# This is an interesting key (wasd, ...), record release event.
|
|
336
|
+
last_and_release[1] = t
|
|
337
|
+
|
|
338
|
+
if k in _cursor_mappings:
|
|
339
|
+
self.cursor = _default_cursor
|
|
340
|
+
|
|
341
|
+
if not self.mouse_mode:
|
|
342
|
+
self.configure(cursor=self.cursor)
|
|
343
|
+
|
|
344
|
+
def tkKeyPress(self, event):
|
|
345
|
+
if self.mouse_mode:
|
|
346
|
+
# Ignore key events when user is dragging mouse
|
|
347
|
+
return
|
|
348
|
+
k = event.keysym.lower()
|
|
349
|
+
t = time.time()
|
|
350
|
+
|
|
351
|
+
cursor = _cursor_mappings.get(k)
|
|
352
|
+
if cursor:
|
|
353
|
+
self.configure(cursor=cursor)
|
|
354
|
+
|
|
355
|
+
last_and_release = self.key_to_last_accounted_and_release_time.get(k)
|
|
356
|
+
if last_and_release:
|
|
357
|
+
# This is an interesting key (wasd, ...).
|
|
358
|
+
if last_and_release[0] is None:
|
|
359
|
+
# Only record time stamp if there was no previous time stamp.
|
|
360
|
+
# E.g., on some systems we get key repeats, that is
|
|
361
|
+
# several press events when the key is held and we only want
|
|
362
|
+
# to take the first of these press events.
|
|
363
|
+
last_and_release[0] = t
|
|
364
|
+
# Erase the time stamp marking the erase. If we get a key repeat,
|
|
365
|
+
# that is a release event immediately following a press event,
|
|
366
|
+
# we want to ignore the release event.
|
|
367
|
+
last_and_release[1] = None
|
|
368
|
+
|
|
369
|
+
# Schedule to process the time stamps we just recorded.
|
|
370
|
+
self.schedule_process_key_events_and_redraw(1)
|
|
371
|
+
|
|
372
|
+
if event.keysym == 'u':
|
|
373
|
+
print("View SO(1,3)-matrix and current tetrahedron:",
|
|
374
|
+
self.view_state)
|
|
375
|
+
|
|
376
|
+
# Hack: Hyperboloid_Navigation should not know about
|
|
377
|
+
# the view mode (by weight, by distance, ...)
|
|
378
|
+
#
|
|
379
|
+
# We do not compute weight correctly for now and thus
|
|
380
|
+
# cannot render the "cohomology fractals".
|
|
381
|
+
# We need to revisit this at some point.
|
|
382
|
+
# Leaving it in here for now.
|
|
383
|
+
if event.keysym == 'v':
|
|
384
|
+
self.view = (self.view + 1) % 3
|
|
385
|
+
print("Color for rays that have not hit geometry:",
|
|
386
|
+
_viewModes[self.view])
|
|
387
|
+
self.draw()
|
|
388
|
+
|
|
389
|
+
if event.keysym == 'p':
|
|
390
|
+
from snappy.CyOpenGL import get_gl_string
|
|
391
|
+
self.make_current()
|
|
392
|
+
for k in ['GL_VERSION', 'GL_SHADING_LANGUAGE_VERSION']:
|
|
393
|
+
print("%s: %s" % (k, get_gl_string(k)))
|
|
394
|
+
|
|
395
|
+
if event.keysym == 'm':
|
|
396
|
+
# Saving image
|
|
397
|
+
#
|
|
398
|
+
# Ideally, this would be a menu item and create a dialog
|
|
399
|
+
# allowing the user to specify the resolution and the file path.
|
|
400
|
+
#
|
|
401
|
+
# Hard-coding this for now to fixed resolution and temporary file.
|
|
402
|
+
|
|
403
|
+
width = 1000
|
|
404
|
+
height = 1000
|
|
405
|
+
|
|
406
|
+
f = tempfile.NamedTemporaryFile(
|
|
407
|
+
suffix='.png', delete=False)
|
|
408
|
+
|
|
409
|
+
self.save_image(width, height, f)
|
|
410
|
+
|
|
411
|
+
print("Image saved to: ", f.name)
|
|
412
|
+
|
|
413
|
+
def tkButton1(self, event):
|
|
414
|
+
# Ignore mouse-clicks when user is navigating with keys
|
|
415
|
+
for last, release in (
|
|
416
|
+
self.key_to_last_accounted_and_release_time.values()):
|
|
417
|
+
if last or release:
|
|
418
|
+
return
|
|
419
|
+
|
|
420
|
+
self.configure(cursor=_default_move_cursor)
|
|
421
|
+
|
|
422
|
+
self.mouse_pos_when_pressed = (event.x, event.y)
|
|
423
|
+
self.view_state_when_pressed = self.view_state
|
|
424
|
+
self.mouse_mode = 'move'
|
|
425
|
+
|
|
426
|
+
def tkShiftButton1(self, event):
|
|
427
|
+
# Ignore mouse-clicks when user is navigating with keys
|
|
428
|
+
for last, release in (
|
|
429
|
+
self.key_to_last_accounted_and_release_time.values()):
|
|
430
|
+
if last or release:
|
|
431
|
+
return
|
|
432
|
+
|
|
433
|
+
self.mouse_pos_when_pressed = (event.x, event.y)
|
|
434
|
+
self.view_state_when_pressed = self.view_state
|
|
435
|
+
self.mouse_mode = 'rotate'
|
|
436
|
+
|
|
437
|
+
def tkAltButton1(self, event):
|
|
438
|
+
# Ignore mouse-clicks when user is navigating with keys
|
|
439
|
+
for last, release in (
|
|
440
|
+
self.key_to_last_accounted_and_release_time.values()):
|
|
441
|
+
if last or release:
|
|
442
|
+
return
|
|
443
|
+
|
|
444
|
+
self.make_current()
|
|
445
|
+
|
|
446
|
+
depth, width, height = self.read_depth_value(event.x, event.y)
|
|
447
|
+
|
|
448
|
+
self.orbit_translation, self.orbit_inv_translation, self.orbit_speed = (
|
|
449
|
+
self.compute_translation_and_inverse_from_pick_point(
|
|
450
|
+
(width, height), (event.x, height - event.y), depth))
|
|
451
|
+
|
|
452
|
+
self.last_mouse_pos = (event.x, event.y)
|
|
453
|
+
self.view_state_when_pressed = self.view_state
|
|
454
|
+
|
|
455
|
+
self.orbit_rotation = matrix.identity(self.raytracing_data.RF, 4)
|
|
456
|
+
|
|
457
|
+
self.mouse_mode = 'orbit'
|
|
458
|
+
|
|
459
|
+
def tkButtonMotion1(self, event):
|
|
460
|
+
if self.mouse_mode == 'orbit':
|
|
461
|
+
delta_x = event.x - self.last_mouse_pos[0]
|
|
462
|
+
delta_y = event.y - self.last_mouse_pos[1]
|
|
463
|
+
|
|
464
|
+
RF = self.raytracing_data.RF
|
|
465
|
+
|
|
466
|
+
angle_x = RF(delta_x * self.orbit_speed * 0.01)
|
|
467
|
+
angle_y = RF(delta_y * self.orbit_speed * 0.01)
|
|
468
|
+
|
|
469
|
+
m = O13_y_rotation(angle_x) * O13_x_rotation(angle_y)
|
|
470
|
+
self.orbit_rotation = self.orbit_rotation * m
|
|
471
|
+
|
|
472
|
+
self.view_state = self.raytracing_data.update_view_state(
|
|
473
|
+
self.view_state_when_pressed,
|
|
474
|
+
self.orbit_translation * self.orbit_rotation * self.orbit_inv_translation)
|
|
475
|
+
|
|
476
|
+
self.last_mouse_pos = (event.x, event.y)
|
|
477
|
+
elif self.mouse_mode == 'move':
|
|
478
|
+
RF = self.raytracing_data.RF
|
|
479
|
+
|
|
480
|
+
delta_x = RF(event.x - self.mouse_pos_when_pressed[0])
|
|
481
|
+
delta_y = RF(event.y - self.mouse_pos_when_pressed[1])
|
|
482
|
+
|
|
483
|
+
amt = (delta_x ** 2 + delta_y ** 2).sqrt()
|
|
484
|
+
|
|
485
|
+
if amt == 0:
|
|
486
|
+
self.view_state = self.view_state_when_pressed
|
|
487
|
+
else:
|
|
488
|
+
m = unit_3_vector_and_distance_to_O13_hyperbolic_translation(
|
|
489
|
+
[-delta_x / amt, delta_y / amt, RF(0)], amt * RF(0.01))
|
|
490
|
+
|
|
491
|
+
self.view_state = self.raytracing_data.update_view_state(
|
|
492
|
+
self.view_state_when_pressed, m)
|
|
493
|
+
elif self.mouse_mode == 'rotate':
|
|
494
|
+
RF = self.raytracing_data.RF
|
|
495
|
+
|
|
496
|
+
delta_x = event.x - self.mouse_pos_when_pressed[0]
|
|
497
|
+
delta_y = event.y - self.mouse_pos_when_pressed[1]
|
|
498
|
+
|
|
499
|
+
angle_x = RF(-delta_x * 0.01)
|
|
500
|
+
angle_y = RF(-delta_y * 0.01)
|
|
501
|
+
|
|
502
|
+
m = O13_y_rotation(angle_x) * O13_x_rotation(angle_y)
|
|
503
|
+
|
|
504
|
+
self.view_state = self.raytracing_data.update_view_state(
|
|
505
|
+
self.view_state, m)
|
|
506
|
+
|
|
507
|
+
self.mouse_pos_when_pressed = (event.x, event.y)
|
|
508
|
+
else:
|
|
509
|
+
return
|
|
510
|
+
|
|
511
|
+
self.draw()
|
|
512
|
+
|
|
513
|
+
def tkButtonRelease1(self, event):
|
|
514
|
+
self.mouse_mode = None
|
|
515
|
+
self.configure(cursor=self.cursor)
|
|
516
|
+
|
|
517
|
+
def setup_keymapping(self, keyboard='QWERTY'):
|
|
518
|
+
self.keymapping = _keymappings[keyboard]
|
|
519
|
+
|
|
520
|
+
# Key (e.g., 'w', 'a', ...) to pair of time stamps.
|
|
521
|
+
# The first time stamps records when the key was pressed
|
|
522
|
+
# or the time when we last were processing key events.
|
|
523
|
+
# The second time stamp records when the key was released.
|
|
524
|
+
# Time stamps can be None to indicate that there are no
|
|
525
|
+
# press or release events for this key that need processing.
|
|
526
|
+
self.key_to_last_accounted_and_release_time = {
|
|
527
|
+
k : [ None, None ]
|
|
528
|
+
for k in self.keymapping
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
def apply_settings(self, settings):
|
|
532
|
+
self.setup_keymapping(settings.get('keyboard', 'QWERTY'))
|
|
533
|
+
|
|
534
|
+
def _start_flight_for_debugging_hitch(self):
|
|
535
|
+
"""
|
|
536
|
+
On Mac OS, there is a hitch when flying. It is subtle, but when
|
|
537
|
+
keeping, say the w key pressed, every second or so there a brief
|
|
538
|
+
moment where we are not moving.
|
|
539
|
+
|
|
540
|
+
I couldn't figure out whether this is due to how we are processing
|
|
541
|
+
the key events or already a problem with calling self.after from
|
|
542
|
+
within the redraw code.
|
|
543
|
+
|
|
544
|
+
This function initiates a flight to isolate the problem to the
|
|
545
|
+
latter.
|
|
546
|
+
|
|
547
|
+
To use it, do:
|
|
548
|
+
>>> M = Manifold("m004") # doctest: +SKIP
|
|
549
|
+
>>> v = M.inside_view()
|
|
550
|
+
>>> v.view.widget._start_flight_for_debugging_hitch()
|
|
551
|
+
|
|
552
|
+
"""
|
|
553
|
+
|
|
554
|
+
self.key_to_last_accounted_and_release_time['w'][0] = time.time()
|
|
555
|
+
self.schedule_process_key_events_and_redraw(1)
|
|
556
|
+
|