snappy 3.1.1__cp311-cp311-macosx_11_0_arm64.whl → 3.2__cp311-cp311-macosx_11_0_arm64.whl
Sign up to get free protection for your applications and to get access to all the features.
- snappy/CyOpenGL.cpython-311-darwin.so +0 -0
- snappy/SnapPy.cpython-311-darwin.so +0 -0
- snappy/SnapPyHP.cpython-311-darwin.so +0 -0
- snappy/__init__.py +299 -402
- snappy/app.py +70 -20
- snappy/browser.py +18 -17
- snappy/canonical.py +249 -0
- snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
- snappy/cusps/cusp_area_matrix.py +101 -0
- snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
- snappy/cusps/maximal_cusp_area_matrix.py +136 -0
- snappy/cusps/test.py +21 -0
- snappy/cusps/trig_cusp_area_matrix.py +63 -0
- snappy/database.py +10 -9
- snappy/decorated_isosig.py +337 -114
- snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
- snappy/dev/extended_ptolemy/extended.py +3 -3
- snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
- snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
- snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
- snappy/doc/_images/m125_paper_plane.jpg +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/_sources/development.rst.txt +66 -46
- snappy/doc/_sources/index.rst.txt +72 -5
- snappy/doc/_sources/installing.rst.txt +145 -162
- snappy/doc/_sources/news.rst.txt +73 -1
- snappy/doc/_sources/ptolemy_examples1.rst.txt +8 -7
- snappy/doc/_sources/ptolemy_examples3.rst.txt +2 -2
- snappy/doc/_sources/triangulation.rst.txt +2 -2
- snappy/doc/_sources/verify.rst.txt +89 -29
- snappy/doc/_sources/verify_internals.rst.txt +5 -16
- snappy/doc/_static/basic.css +23 -1
- snappy/doc/_static/css/badge_only.css +1 -1
- snappy/doc/_static/css/theme.css +1 -1
- snappy/doc/_static/doctools.js +1 -1
- snappy/doc/_static/documentation_options.js +2 -3
- 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/js/versions.js +228 -0
- snappy/doc/_static/language_data.js +2 -2
- snappy/doc/_static/pygments.css +1 -0
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +291 -122
- snappy/doc/bugs.html +17 -20
- snappy/doc/censuses.html +34 -53
- snappy/doc/credits.html +18 -21
- snappy/doc/development.html +88 -68
- snappy/doc/genindex.html +66 -145
- snappy/doc/index.html +86 -31
- snappy/doc/installing.html +164 -182
- snappy/doc/manifold.html +1168 -556
- snappy/doc/manifoldhp.html +18 -21
- snappy/doc/news.html +91 -33
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +20 -22
- snappy/doc/platonic_census.html +31 -34
- snappy/doc/plink.html +19 -22
- snappy/doc/ptolemy.html +20 -22
- snappy/doc/ptolemy_classes.html +102 -105
- snappy/doc/ptolemy_examples1.html +34 -36
- snappy/doc/ptolemy_examples2.html +28 -31
- snappy/doc/ptolemy_examples3.html +26 -29
- snappy/doc/ptolemy_examples4.html +20 -23
- snappy/doc/ptolemy_prelim.html +25 -28
- snappy/doc/py-modindex.html +16 -19
- snappy/doc/screenshots.html +22 -24
- snappy/doc/search.html +15 -18
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +18 -21
- snappy/doc/snappy.html +18 -20
- snappy/doc/spherogram.html +84 -87
- snappy/doc/todo.html +17 -20
- snappy/doc/triangulation.html +324 -215
- snappy/doc/tutorial.html +17 -20
- snappy/doc/verify.html +100 -46
- snappy/doc/verify_internals.html +106 -563
- snappy/drilling/__init__.py +153 -235
- snappy/drilling/barycentric.py +103 -0
- snappy/drilling/constants.py +0 -2
- snappy/drilling/crush.py +56 -130
- snappy/drilling/cusps.py +12 -6
- snappy/drilling/debug.py +2 -1
- snappy/drilling/exceptions.py +7 -40
- snappy/drilling/moves.py +302 -243
- snappy/drilling/perturb.py +63 -37
- snappy/drilling/shorten.py +36 -0
- snappy/drilling/subdivide.py +0 -5
- snappy/drilling/test.py +23 -0
- snappy/drilling/test_cases.py +126 -0
- snappy/drilling/tracing.py +9 -37
- snappy/exceptions.py +18 -5
- snappy/exterior_to_link/barycentric_geometry.py +2 -4
- snappy/exterior_to_link/main.py +8 -7
- snappy/exterior_to_link/mcomplex_with_link.py +2 -2
- snappy/exterior_to_link/rational_linear_algebra.py +1 -1
- snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
- snappy/exterior_to_link/test.py +21 -33
- 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 +697 -0
- snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
- snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
- snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
- snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
- snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -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_keys.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/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
- snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
- 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 +101 -0
- snappy/geometric_structure/test.py +22 -0
- snappy/gui.py +23 -13
- snappy/horoviewer.py +7 -7
- snappy/hyperboloid/__init__.py +96 -31
- snappy/hyperboloid/distances.py +245 -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/isometry_signature.py +382 -0
- snappy/len_spec/__init__.py +596 -0
- snappy/len_spec/geodesic_info.py +110 -0
- snappy/len_spec/geodesic_key_info_dict.py +117 -0
- snappy/len_spec/geodesic_piece.py +143 -0
- snappy/len_spec/geometric_structure.py +182 -0
- snappy/len_spec/geometry.py +80 -0
- snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
- snappy/len_spec/spine.py +206 -0
- snappy/len_spec/test.py +24 -0
- snappy/len_spec/test_cases.py +69 -0
- snappy/len_spec/tile.py +275 -0
- snappy/len_spec/word.py +86 -0
- snappy/math_basics.py +39 -13
- snappy/matrix.py +52 -9
- snappy/number.py +12 -6
- snappy/numeric_output_checker.py +2 -3
- snappy/pari.py +8 -4
- snappy/phone_home.py +2 -1
- snappy/polyviewer.py +8 -8
- snappy/ptolemy/__init__.py +1 -1
- snappy/ptolemy/component.py +2 -2
- snappy/ptolemy/coordinates.py +25 -25
- snappy/ptolemy/findLoops.py +9 -9
- snappy/ptolemy/manifoldMethods.py +27 -29
- snappy/ptolemy/polynomial.py +50 -57
- snappy/ptolemy/processFileBase.py +60 -0
- snappy/ptolemy/ptolemyVariety.py +109 -41
- snappy/ptolemy/reginaWrapper.py +4 -4
- snappy/ptolemy/rur.py +1 -1
- snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
- snappy/ptolemy/test.py +99 -54
- snappy/ptolemy/utilities.py +1 -1
- 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 +0 -3
- snappy/raytracing/eyeball.py +123 -0
- snappy/raytracing/finite_raytracing_data.py +17 -17
- snappy/raytracing/finite_viewer.py +15 -15
- snappy/raytracing/geodesic_tube_info.py +93 -63
- snappy/raytracing/geodesics.py +94 -64
- snappy/raytracing/geodesics_window.py +56 -34
- snappy/raytracing/gui_utilities.py +21 -6
- snappy/raytracing/hyperboloid_navigation.py +29 -4
- snappy/raytracing/hyperboloid_utilities.py +73 -73
- snappy/raytracing/ideal_raytracing_data.py +121 -91
- snappy/raytracing/inside_viewer.py +199 -66
- snappy/raytracing/pack.py +22 -0
- snappy/raytracing/raytracing_data.py +37 -25
- snappy/raytracing/raytracing_view.py +70 -65
- snappy/raytracing/shaders/Eye.png +0 -0
- snappy/raytracing/shaders/NonGeometric.png +0 -0
- snappy/raytracing/shaders/__init__.py +39 -3
- snappy/raytracing/shaders/fragment.glsl +451 -133
- snappy/raytracing/test.py +29 -0
- snappy/raytracing/tooltip.py +146 -0
- snappy/raytracing/upper_halfspace_utilities.py +42 -9
- snappy/sage_helper.py +67 -134
- snappy/settings.py +90 -77
- snappy/shell.py +2 -0
- snappy/snap/character_varieties.py +2 -2
- snappy/snap/find_field.py +4 -3
- snappy/snap/fundamental_polyhedron.py +2 -2
- snappy/snap/kernel_structures.py +5 -1
- snappy/snap/nsagetools.py +9 -8
- snappy/snap/peripheral/dual_cellulation.py +4 -3
- snappy/snap/peripheral/peripheral.py +2 -2
- snappy/snap/peripheral/surface.py +5 -5
- snappy/snap/peripheral/test.py +1 -1
- snappy/snap/polished_reps.py +8 -8
- snappy/snap/slice_obs_HKL.py +16 -14
- snappy/snap/t3mlite/arrow.py +3 -3
- snappy/snap/t3mlite/edge.py +3 -3
- snappy/snap/t3mlite/homology.py +2 -2
- snappy/snap/t3mlite/mcomplex.py +3 -3
- snappy/snap/t3mlite/simplex.py +12 -0
- snappy/snap/t3mlite/spun.py +18 -17
- snappy/snap/t3mlite/test_vs_regina.py +4 -4
- snappy/snap/test.py +37 -53
- snappy/snap/utilities.py +4 -5
- snappy/test.py +121 -138
- snappy/test_cases.py +263 -0
- snappy/testing.py +131 -0
- snappy/tiling/__init__.py +2 -0
- snappy/tiling/canonical_key_dict.py +59 -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/real_hash_dict.py +164 -0
- snappy/tiling/test.py +23 -0
- snappy/tiling/tile.py +215 -0
- snappy/tiling/triangle.py +33 -0
- snappy/tkterminal.py +113 -84
- snappy/twister/main.py +1 -7
- snappy/twister/twister_core.cpython-311-darwin.so +0 -0
- snappy/upper_halfspace/__init__.py +78 -17
- snappy/verify/__init__.py +3 -7
- snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
- snappy/verify/complex_volume/adjust_torsion.py +1 -2
- snappy/verify/complex_volume/closed.py +13 -13
- snappy/verify/complex_volume/cusped.py +6 -6
- snappy/verify/complex_volume/extended_bloch.py +5 -8
- snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
- snappy/verify/edge_equations.py +80 -0
- snappy/verify/exceptions.py +0 -55
- snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
- snappy/verify/interval_newton_shapes_engine.py +7 -5
- snappy/verify/interval_tree.py +5 -5
- snappy/verify/krawczyk_shapes_engine.py +17 -18
- snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
- snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
- snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
- snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
- snappy/verify/shapes.py +5 -3
- snappy/verify/short_slopes.py +39 -41
- snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
- snappy/verify/test.py +57 -60
- snappy/verify/upper_halfspace/extended_matrix.py +1 -1
- snappy/verify/upper_halfspace/finite_point.py +3 -4
- snappy/verify/upper_halfspace/ideal_point.py +9 -9
- snappy/verify/volume.py +2 -2
- snappy/version.py +2 -2
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +26 -11
- snappy-3.2.dist-info/RECORD +503 -0
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
- snappy/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/__pycache__/browser.cpython-311.pyc +0 -0
- snappy/__pycache__/cache.cpython-311.pyc +0 -0
- snappy/__pycache__/database.cpython-311.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-311.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-311.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-311.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-311.pyc +0 -0
- snappy/__pycache__/gui.cpython-311.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-311.pyc +0 -0
- snappy/__pycache__/infowindow.cpython-311.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-311.pyc +0 -0
- snappy/__pycache__/matrix.cpython-311.pyc +0 -0
- snappy/__pycache__/number.cpython-311.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-311.pyc +0 -0
- snappy/__pycache__/pari.cpython-311.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-311.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-311.pyc +0 -0
- snappy/__pycache__/version.cpython-311.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-311.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-311.pyc +0 -0
- snappy/drilling/geodesic_tube.py +0 -441
- snappy/drilling/geometric_structure.py +0 -366
- snappy/drilling/line.py +0 -122
- snappy/drilling/quotient_space.py +0 -94
- snappy/drilling/spatial_dict.py +0 -128
- snappy/exterior_to_link/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-311.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-311.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-311.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/finite_raytracing_data.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/gui_utilities.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/hyperboloid_navigation.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/hyperboloid_utilities.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/ideal_raytracing_data.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/inside_viewer.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/raytracing_data.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/raytracing_view.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/upper_halfspace_utilities.cpython-311.pyc +0 -0
- snappy/raytracing/__pycache__/view_scale_controller.cpython-311.pyc +0 -0
- snappy/raytracing/zoom_slider/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-311.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-311.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-311.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-311.pyc +0 -0
- snappy/togl/__init__.py +0 -3
- snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
- snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
- snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
- snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
- snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
- snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
- snappy/twister/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-311.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-311.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-311.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-311.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-311.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-311.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-311.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -585
- {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -0
@@ -3,12 +3,30 @@ import tkinter
|
|
3
3
|
from tkinter import ttk
|
4
4
|
|
5
5
|
from .gui_utilities import UniformDictController, ScrollableFrame
|
6
|
+
from .tooltip import ToolTip
|
6
7
|
from .geodesics import geodesic_index_to_color, LengthSpectrumError
|
7
|
-
from ..
|
8
|
+
from ..geometric_structure.geodesic.exceptions import WordAppearsToBeParabolic
|
8
9
|
from ..SnapPy import word_as_list # type: ignore
|
9
10
|
|
10
11
|
|
11
12
|
class GeodesicsWindow(tkinter.Toplevel):
|
13
|
+
checkbox_column = 0
|
14
|
+
color_column = 1
|
15
|
+
words_column = 2
|
16
|
+
length_column = 3
|
17
|
+
radius_column = 5
|
18
|
+
view_column = 7
|
19
|
+
|
20
|
+
headings = (
|
21
|
+
# (text, column, weight, span)
|
22
|
+
('Show', checkbox_column, 0, 1),
|
23
|
+
('Color', color_column, 0, 1),
|
24
|
+
('Word(s)', words_column, 0, 1),
|
25
|
+
('Complex length', length_column, 0, 2),
|
26
|
+
('Radius', radius_column, 0, 1),
|
27
|
+
(' ', 6, 0, 1),
|
28
|
+
('View', view_column, 0, 1))
|
29
|
+
|
12
30
|
def __init__(self, inside_viewer, *args, **kwards):
|
13
31
|
# Disable the minimize button when we get to use Tk 8.7
|
14
32
|
tkinter.Toplevel.__init__(self, class_='snappy')
|
@@ -18,14 +36,6 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
18
36
|
|
19
37
|
self.inside_viewer = inside_viewer
|
20
38
|
self.raytracing_view = inside_viewer.widget
|
21
|
-
self.headings = (
|
22
|
-
# (text, column, weight, span)
|
23
|
-
('Show', 0, 0, 1),
|
24
|
-
('Color', 1, 0, 1),
|
25
|
-
('Word(s)', 2, 0, 1),
|
26
|
-
('Complex length', 3, 0, 2),
|
27
|
-
('Radius', 5, 0, 1),
|
28
|
-
(' ', 6, 0, 1))
|
29
39
|
|
30
40
|
self.frame = ttk.Frame(self)
|
31
41
|
self.frame.pack(expand=True, fill=tkinter.BOTH)
|
@@ -75,27 +85,24 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
75
85
|
self.populate_geodesics_frame()
|
76
86
|
self.scrollable_frame.headings(self.headings)
|
77
87
|
|
88
|
+
def _geodesics(self):
|
89
|
+
return self.raytracing_view.additional_structures['geodesics']
|
90
|
+
|
78
91
|
def populate_geodesics_frame(self):
|
79
92
|
for widget in self.geodesics_frame.grid_slaves():
|
80
93
|
widget.destroy()
|
81
94
|
|
82
95
|
row = 0
|
83
96
|
|
84
|
-
|
85
|
-
|
86
|
-
words_column = 2
|
87
|
-
length_column = 3
|
88
|
-
radius_column = 5
|
89
|
-
|
90
|
-
for geodesic in self.raytracing_view.geodesics.geodesics_sorted_by_length():
|
91
|
-
if not geodesic.geodesic_info.core_curve_cusp:
|
97
|
+
for geodesic in self._geodesics().geodesics_sorted_by_length():
|
98
|
+
if not geodesic.geodesic_start_point_info.core_curve_cusp:
|
92
99
|
UniformDictController.create_checkbox(
|
93
100
|
self.geodesics_frame,
|
94
101
|
self.raytracing_view.ui_parameter_dict,
|
95
102
|
key='geodesicTubeEnables',
|
96
103
|
index=geodesic.index,
|
97
104
|
row=row,
|
98
|
-
column=checkbox_column,
|
105
|
+
column=self.checkbox_column,
|
99
106
|
update_function=self.geodesic_checkbox_clicked)
|
100
107
|
|
101
108
|
text = ', '.join(geodesic.words)
|
@@ -103,11 +110,11 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
103
110
|
text += ' (not primitive)'
|
104
111
|
|
105
112
|
l = ttk.Label(self.geodesics_frame, text=text)
|
106
|
-
l.grid(row=row, column=words_column)
|
113
|
+
l.grid(row=row, column=self.words_column)
|
107
114
|
|
108
115
|
l = ttk.Label(self.geodesics_frame,
|
109
116
|
text='%.8f' % geodesic.complex_length.real())
|
110
|
-
l.grid(row=row, column=length_column)
|
117
|
+
l.grid(row=row, column=self.length_column)
|
111
118
|
|
112
119
|
im_length = geodesic.complex_length.imag()
|
113
120
|
abs_im_length = im_length.abs()
|
@@ -117,12 +124,12 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
117
124
|
|
118
125
|
l = ttk.Label(self.geodesics_frame,
|
119
126
|
text=s + ' %.8f * I' % abs_im_length)
|
120
|
-
l.grid(row=row, column=length_column + 1)
|
127
|
+
l.grid(row=row, column=self.length_column + 1)
|
121
128
|
|
122
129
|
color = geodesic_index_to_color(geodesic.index)
|
123
130
|
|
124
|
-
if geodesic.
|
125
|
-
cusp_index = geodesic.
|
131
|
+
if geodesic.geodesic_start_point_info.core_curve_cusp:
|
132
|
+
cusp_index = geodesic.geodesic_start_point_info.core_curve_cusp.Index
|
126
133
|
l = tkinter.Label(self.geodesics_frame,
|
127
134
|
text="Cusp %d" % cusp_index)
|
128
135
|
else:
|
@@ -130,12 +137,12 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
130
137
|
text="Color",
|
131
138
|
fg=color_to_tkinter(color),
|
132
139
|
bg=color_to_tkinter(color))
|
133
|
-
l.grid(row=row, column=color_column, padx=5)
|
140
|
+
l.grid(row=row, column=self.color_column, padx=5)
|
134
141
|
|
135
|
-
if geodesic.
|
142
|
+
if geodesic.geodesic_start_point_info.core_curve_cusp:
|
136
143
|
l = tkinter.Label(self.geodesics_frame,
|
137
144
|
text="Use Cusp areas tab")
|
138
|
-
l.grid(row=row, column=radius_column, padx=5)
|
145
|
+
l.grid(row=row, column=self.radius_column, padx=5)
|
139
146
|
else:
|
140
147
|
scale = UniformDictController.create_horizontal_scale(
|
141
148
|
self.geodesics_frame,
|
@@ -143,7 +150,7 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
143
150
|
key='geodesicTubeRadii',
|
144
151
|
index=geodesic.index,
|
145
152
|
row=row,
|
146
|
-
column=radius_column,
|
153
|
+
column=self.radius_column,
|
147
154
|
left_end=0.0,
|
148
155
|
right_end=1.0,
|
149
156
|
update_function=self.update_geodesic_data,
|
@@ -152,6 +159,16 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
152
159
|
# Need to color Scale - but the following code fails.
|
153
160
|
# scale.configure(background = color_to_tkinter(color))
|
154
161
|
|
162
|
+
if not geodesic.geodesic_start_point_info.core_curve_cusp:
|
163
|
+
btn = ttk.Button(
|
164
|
+
self.geodesics_frame,
|
165
|
+
text='View',
|
166
|
+
takefocus=0,
|
167
|
+
command=lambda i=geodesic.index: self.view_geodesic(i))
|
168
|
+
ToolTip(btn,
|
169
|
+
msg="Move camera onto geodesic looking down the geodesic")
|
170
|
+
btn.grid(row=row, column=self.view_column)
|
171
|
+
|
155
172
|
row += 1
|
156
173
|
self.scrollable_frame.set_widths()
|
157
174
|
|
@@ -162,15 +179,15 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
162
179
|
foreground='')
|
163
180
|
else:
|
164
181
|
self.status_label.configure(
|
165
|
-
text=('
|
166
|
-
'
|
182
|
+
text=('Geodesic tube intersects core curve. Dropping '
|
183
|
+
'pieces/limiting size.'),
|
167
184
|
foreground='red')
|
168
185
|
|
169
186
|
def add_length_spectrum(self, *args, **kwargs):
|
170
187
|
self.status_label.configure(text=_default_status_msg, foreground='')
|
171
188
|
|
172
189
|
try:
|
173
|
-
if not self.
|
190
|
+
if not self._geodesics().add_length_spectrum(
|
174
191
|
float(self.length_box.get())):
|
175
192
|
self.status_label.configure(text='No new geodesics found.',
|
176
193
|
foreground='')
|
@@ -196,7 +213,7 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
196
213
|
return
|
197
214
|
|
198
215
|
try:
|
199
|
-
n = self.
|
216
|
+
n = self._geodesics().get_mcomplex().num_generators
|
200
217
|
word_as_list(word, n)
|
201
218
|
except ValueError:
|
202
219
|
self.status_label.configure(text=word + " contains non-generators",
|
@@ -204,7 +221,7 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
204
221
|
return
|
205
222
|
|
206
223
|
try:
|
207
|
-
index = self.
|
224
|
+
index = self._geodesics().add_word(word)
|
208
225
|
except WordAppearsToBeParabolic:
|
209
226
|
self.status_label.configure(text=word + " is parabolic",
|
210
227
|
foreground='red')
|
@@ -218,15 +235,20 @@ class GeodesicsWindow(tkinter.Toplevel):
|
|
218
235
|
if self.raytracing_view.disable_edges_for_geodesics():
|
219
236
|
self.inside_viewer.update_edge_and_insphere_controllers()
|
220
237
|
|
221
|
-
self.
|
238
|
+
self.update_geodesic_data()
|
222
239
|
|
223
240
|
self.populate_geodesics_frame()
|
224
241
|
|
225
242
|
def geodesic_checkbox_clicked(self):
|
226
243
|
if self.raytracing_view.disable_edges_for_geodesics():
|
227
244
|
self.inside_viewer.update_edge_and_insphere_controllers()
|
228
|
-
self.
|
245
|
+
self.update_geodesic_data()
|
229
246
|
|
247
|
+
def view_geodesic(self, i):
|
248
|
+
self.raytracing_view.view_state = (
|
249
|
+
self.raytracing_view.raytracing_data.update_view_state(
|
250
|
+
self._geodesics().view_state_for_geodesic(i)))
|
251
|
+
self.inside_viewer.set_perspective_type_and_view_scale(1, 1.0)
|
230
252
|
|
231
253
|
def color_to_tkinter(color):
|
232
254
|
return "#%.3x%.3x%.3x" % tuple([min(max(int(x * 4095), 0), 4095)
|
@@ -15,6 +15,7 @@ class UniformDictController:
|
|
15
15
|
def create_horizontal_scale(container, uniform_dict, key,
|
16
16
|
row, left_end, right_end, update_function=None,
|
17
17
|
column=0,
|
18
|
+
columnspan=1,
|
18
19
|
title=None,
|
19
20
|
format_string=None,
|
20
21
|
index=None, component_index=None):
|
@@ -26,8 +27,9 @@ class UniformDictController:
|
|
26
27
|
scale = Slider(container=container,
|
27
28
|
left_end=left_end,
|
28
29
|
right_end=right_end)
|
29
|
-
scale.grid(row=row, column=column,
|
30
|
-
|
30
|
+
scale.grid(row=row, column=column, columnspan=columnspan,
|
31
|
+
sticky=slider_stick, padx=10)
|
32
|
+
column += columnspan
|
31
33
|
value_label = ttk.Label(container, padding=label_pad)
|
32
34
|
value_label.grid(row=row, column=column, sticky=tkinter.NW, padx=20)
|
33
35
|
|
@@ -46,9 +48,10 @@ class UniformDictController:
|
|
46
48
|
column=0,
|
47
49
|
text='',
|
48
50
|
index=None,
|
49
|
-
component_index=None
|
51
|
+
component_index=None,
|
52
|
+
gridargs = {}):
|
50
53
|
checkbox = ttk.Checkbutton(container, takefocus=0)
|
51
|
-
checkbox.grid(row=row, column=column)
|
54
|
+
checkbox.grid(row=row, column=column, **gridargs)
|
52
55
|
checkbox.configure(text=text)
|
53
56
|
|
54
57
|
return UniformDictController(
|
@@ -195,6 +198,17 @@ class FpsLabelUpdater:
|
|
195
198
|
self.num_iterations = 0
|
196
199
|
self.total_time = 0.0
|
197
200
|
self.last_time = time.time()
|
201
|
+
self._visible = False
|
202
|
+
self._text = '-fps (-ms)'
|
203
|
+
|
204
|
+
def set_visible(self, visible):
|
205
|
+
if self._visible == visible:
|
206
|
+
return
|
207
|
+
self._visible = visible
|
208
|
+
if visible:
|
209
|
+
self.label.configure(text = self._text)
|
210
|
+
else:
|
211
|
+
self.label.configure(text = '')
|
198
212
|
|
199
213
|
def __call__(self, t):
|
200
214
|
self.num_iterations += 1
|
@@ -203,8 +217,9 @@ class FpsLabelUpdater:
|
|
203
217
|
current_time = time.time()
|
204
218
|
fps = self.num_iterations / (current_time - self.last_time)
|
205
219
|
time_ms = 1000 * self.total_time / self.num_iterations
|
206
|
-
|
207
|
-
self.
|
220
|
+
self._text = '%.1ffps (%dms)' % (fps, time_ms)
|
221
|
+
if self._visible:
|
222
|
+
self.label.configure(text=self._text)
|
208
223
|
self.last_time = current_time
|
209
224
|
self.num_iterations = 0
|
210
225
|
self.total_time = 0.0
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from .hyperboloid_utilities import *
|
2
|
+
from ..matrix import matrix
|
2
3
|
import time
|
3
4
|
import sys
|
4
5
|
import tempfile
|
@@ -149,7 +150,7 @@ class HyperboloidNavigation:
|
|
149
150
|
IdealRaytracingData. This is needed to update data
|
150
151
|
such as the view matrix
|
151
152
|
using self.raytracing_data.update_view_state(...).
|
152
|
-
- self.
|
153
|
+
- self.draw() to redraw.
|
153
154
|
- self.read_depth_value(x, y) to return the depth value at a pixel.
|
154
155
|
It is used for orbiting about that point.
|
155
156
|
- self.compute_translation_and_inverse_from_pick_point(size, xy, depth)
|
@@ -317,7 +318,7 @@ class HyperboloidNavigation:
|
|
317
318
|
self.view_state, m)
|
318
319
|
|
319
320
|
# Redraw
|
320
|
-
self.
|
321
|
+
self.draw()
|
321
322
|
|
322
323
|
# And schedule another call of this function.
|
323
324
|
# If we don't leave Tk a couple of milliseconds in between,
|
@@ -383,7 +384,7 @@ class HyperboloidNavigation:
|
|
383
384
|
self.view = (self.view + 1) % 3
|
384
385
|
print("Color for rays that have not hit geometry:",
|
385
386
|
_viewModes[self.view])
|
386
|
-
self.
|
387
|
+
self.draw()
|
387
388
|
|
388
389
|
if event.keysym == 'p':
|
389
390
|
from snappy.CyOpenGL import get_gl_string
|
@@ -507,7 +508,7 @@ class HyperboloidNavigation:
|
|
507
508
|
else:
|
508
509
|
return
|
509
510
|
|
510
|
-
self.
|
511
|
+
self.draw()
|
511
512
|
|
512
513
|
def tkButtonRelease1(self, event):
|
513
514
|
self.mouse_mode = None
|
@@ -529,3 +530,27 @@ class HyperboloidNavigation:
|
|
529
530
|
|
530
531
|
def apply_settings(self, settings):
|
531
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
|
+
|
@@ -1,8 +1,8 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
from ..hyperboloid import (r13_dot,
|
2
|
+
unit_time_vector_to_o13_hyperbolic_translation,
|
3
|
+
time_r13_normalise,
|
4
|
+
space_r13_normalise)
|
5
|
+
from ..matrix import make_vector, make_matrix
|
6
6
|
|
7
7
|
"""
|
8
8
|
Helpers for the 1,3-hyperboloid model and conversion to upper half
|
@@ -43,7 +43,7 @@ def O13_x_rotation(angle):
|
|
43
43
|
|
44
44
|
c = angle.cos()
|
45
45
|
s = angle.sin()
|
46
|
-
return
|
46
|
+
return make_matrix(
|
47
47
|
[[ 1, 0, 0, 0],
|
48
48
|
[ 0, 1, 0, 0],
|
49
49
|
[ 0, 0, c, s],
|
@@ -57,7 +57,7 @@ def O13_y_rotation(angle):
|
|
57
57
|
"""
|
58
58
|
c = angle.cos()
|
59
59
|
s = angle.sin()
|
60
|
-
return
|
60
|
+
return make_matrix(
|
61
61
|
[[ 1, 0, 0, 0],
|
62
62
|
[ 0, c, 0, -s],
|
63
63
|
[ 0, 0, 1, 0],
|
@@ -71,7 +71,7 @@ def O13_z_rotation(angle):
|
|
71
71
|
"""
|
72
72
|
c = angle.cos()
|
73
73
|
s = angle.sin()
|
74
|
-
return
|
74
|
+
return make_matrix(
|
75
75
|
[[ 1, 0, 0, 0],
|
76
76
|
[ 0, c, s, 0],
|
77
77
|
[ 0, -s, c, 0],
|
@@ -101,7 +101,7 @@ def complex_and_height_to_R13_time_vector(z, t):
|
|
101
101
|
RF = z_re.parent()
|
102
102
|
|
103
103
|
return R13_normalise(
|
104
|
-
|
104
|
+
make_vector(
|
105
105
|
[ RF(1),
|
106
106
|
klein_factor * poincare[0],
|
107
107
|
klein_factor * poincare[1],
|
@@ -120,7 +120,7 @@ def R13_time_vector_to_upper_halfspace(v):
|
|
120
120
|
klein = [ v[1] / v[0], v[2] / v[0], v[3] / v[0] ]
|
121
121
|
klein_sqr = sum([x**2 for x in klein])
|
122
122
|
poincare_factor = 1.0 / (1.0 + (1.0 - klein_sqr).sqrt())
|
123
|
-
a, b, c =
|
123
|
+
a, b, c = ( x * poincare_factor for x in klein )
|
124
124
|
|
125
125
|
denom = (a - 1.0) ** 2 + b ** 2 + c ** 2
|
126
126
|
return [ 2.0 * b / denom,
|
@@ -139,85 +139,85 @@ def R13_normalise(v, sign=0):
|
|
139
139
|
|
140
140
|
return v / denom
|
141
141
|
|
142
|
+
def _is_vector_sane(v):
|
143
|
+
return all(-10000.0 < c and c < 10000.0 for c in v)
|
142
144
|
|
143
|
-
def
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
return True
|
148
|
-
|
145
|
+
def _check_vector_sane(v):
|
146
|
+
if _is_vector_sane(v):
|
147
|
+
return v
|
148
|
+
raise ValueError()
|
149
149
|
|
150
150
|
_signature = [-1, +1, +1, +1]
|
151
151
|
|
152
|
+
def _unit_four_vector(i, ring):
|
153
|
+
return make_vector([ring(1.0 if i == j else 0.0)
|
154
|
+
for j in range(4)])
|
152
155
|
|
153
|
-
def
|
154
|
-
result = row
|
155
|
-
for sign, other_row in zip(_signature, other_rows):
|
156
|
-
s = sign * r13_dot(row, other_row)
|
157
|
-
result = [ c - s * other_c
|
158
|
-
for c, other_c in zip(result, other_row) ]
|
156
|
+
def _time_r13_normalise_sane(v):
|
159
157
|
try:
|
160
|
-
|
158
|
+
return _check_vector_sane(
|
159
|
+
time_r13_normalise(v))
|
161
160
|
except ValueError:
|
162
|
-
|
163
|
-
|
164
|
-
return None
|
165
|
-
return result
|
166
|
-
|
167
|
-
|
168
|
-
def _orthonormalize_row_sane(row, fallback_value, other_rows, sign):
|
169
|
-
r = _orthonormalize_row(row, other_rows, sign)
|
170
|
-
if r is not None:
|
171
|
-
return r
|
172
|
-
r = _orthonormalize_row(fallback_value, other_rows, sign)
|
173
|
-
if r is not None:
|
174
|
-
return r
|
175
|
-
return fallback_value
|
161
|
+
pass
|
162
|
+
return _unit_four_vector(0, ring=v[0].parent())
|
176
163
|
|
164
|
+
def _orthonormalise_row(row, previous_rows):
|
165
|
+
result = row
|
166
|
+
for j, previous_row in enumerate(previous_rows):
|
167
|
+
s = _signature[j] * r13_dot(row, previous_row)
|
168
|
+
result = result - s * previous_row
|
169
|
+
return space_r13_normalise(result)
|
177
170
|
|
178
|
-
def
|
171
|
+
def _orthonormalise_row_sane(row, previous_rows):
|
179
172
|
try:
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
173
|
+
return _check_vector_sane(
|
174
|
+
_orthonormalise_row(row, previous_rows))
|
175
|
+
except ValueError:
|
176
|
+
pass
|
177
|
+
ring = row[0].parent()
|
178
|
+
for i in range(3):
|
179
|
+
try:
|
180
|
+
v = _unit_four_vector(
|
181
|
+
(i + len(previous_rows) - 1) % 3 + 1,
|
182
|
+
ring)
|
183
|
+
return _check_vector_sane(
|
184
|
+
_orthonormalise_row(v, previous_rows))
|
185
|
+
except ValueError:
|
186
|
+
pass
|
187
|
+
return _unit_four_vector(len(previous_rows), ring)
|
188
|
+
|
189
|
+
def O13_orthonormalise(m):
|
190
|
+
"""
|
191
|
+
The goal of the implementation here is to stably produce a sane
|
192
|
+
result (without large entries) so that no matter how badly the
|
193
|
+
camera view matrix gets beaten up, we will recover.
|
194
|
+
|
195
|
+
Also note that we operate on columns so that the position (image of
|
196
|
+
(1,0,0,0)) of the camera (unless it is way off and we fall back to
|
197
|
+
the origin for the position) is preserved (that is, just normalized).
|
198
|
+
|
199
|
+
We also preserve the x-axis (image of (0,1,0,0)) of the camera
|
200
|
+
frame as best as possible (project it into the tangent space of
|
201
|
+
the hyperboloid at the camera position). Note that the view
|
202
|
+
direction of the camera is the z-axis (image of (0,0,0,1).
|
203
|
+
So if the view direction of the camera needs to be preserved, you might
|
204
|
+
need to apply a matrix shuffling the x-, y-, and z-axis of the
|
205
|
+
camera before and after orthonormalisation.
|
206
|
+
"""
|
207
|
+
|
208
|
+
t = m.transpose() # Transpose to operate on columns
|
209
|
+
|
210
|
+
result = [ _time_r13_normalise_sane(make_vector(t[0])) ]
|
211
|
+
for row in t[1:]:
|
212
|
+
result.append(_orthonormalise_row_sane(make_vector(row), result))
|
213
|
+
return make_matrix(result).transpose()
|
214
214
|
|
215
215
|
def complex_to_pair(z):
|
216
216
|
"""
|
217
217
|
Returns a vector (x,y) given z = x + y * i.
|
218
218
|
"""
|
219
219
|
|
220
|
-
return
|
220
|
+
return make_vector([z.real(), z.imag()])
|
221
221
|
|
222
222
|
|
223
223
|
def _dist_from_projection(p, dir):
|