snappy 3.1.1__cp38-cp38-win_amd64.whl → 3.2__cp38-cp38-win_amd64.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.cp38-win_amd64.pyd +0 -0
- snappy/SnapPy.cp38-win_amd64.pyd +0 -0
- snappy/SnapPyHP.cp38-win_amd64.pyd +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/additional_classes.rst.txt +40 -40
- snappy/doc/_sources/bugs.rst.txt +14 -14
- snappy/doc/_sources/censuses.rst.txt +51 -51
- snappy/doc/_sources/credits.rst.txt +75 -75
- snappy/doc/_sources/development.rst.txt +259 -239
- snappy/doc/_sources/index.rst.txt +182 -115
- snappy/doc/_sources/installing.rst.txt +247 -264
- snappy/doc/_sources/manifold.rst.txt +6 -6
- snappy/doc/_sources/manifoldhp.rst.txt +46 -46
- snappy/doc/_sources/news.rst.txt +355 -283
- snappy/doc/_sources/other.rst.txt +25 -25
- snappy/doc/_sources/platonic_census.rst.txt +20 -20
- snappy/doc/_sources/plink.rst.txt +102 -102
- snappy/doc/_sources/ptolemy.rst.txt +66 -66
- snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
- snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
- snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
- snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
- snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
- snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
- snappy/doc/_sources/screenshots.rst.txt +21 -21
- snappy/doc/_sources/snap.rst.txt +87 -87
- snappy/doc/_sources/snappy.rst.txt +28 -28
- snappy/doc/_sources/spherogram.rst.txt +103 -103
- snappy/doc/_sources/todo.rst.txt +47 -47
- snappy/doc/_sources/triangulation.rst.txt +11 -11
- snappy/doc/_sources/tutorial.rst.txt +49 -49
- snappy/doc/_sources/verify.rst.txt +210 -150
- snappy/doc/_sources/verify_internals.rst.txt +79 -90
- snappy/doc/_static/basic.css +924 -902
- 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 +12 -13
- 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 +199 -199
- snappy/doc/_static/pygments.css +74 -73
- snappy/doc/_static/searchtools.js +125 -71
- snappy/doc/_static/snappy_furo.css +33 -33
- snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
- snappy/doc/_static/sphinx_highlight.js +13 -3
- snappy/doc/additional_classes.html +1499 -1330
- snappy/doc/bugs.html +131 -134
- snappy/doc/censuses.html +426 -445
- snappy/doc/credits.html +180 -183
- snappy/doc/development.html +383 -363
- snappy/doc/genindex.html +1330 -1409
- snappy/doc/index.html +261 -206
- snappy/doc/installing.html +345 -363
- snappy/doc/manifold.html +3451 -2839
- snappy/doc/manifoldhp.html +179 -182
- snappy/doc/news.html +387 -329
- snappy/doc/objects.inv +0 -0
- snappy/doc/other.html +160 -162
- snappy/doc/platonic_census.html +374 -377
- snappy/doc/plink.html +209 -212
- snappy/doc/ptolemy.html +253 -255
- snappy/doc/ptolemy_classes.html +1143 -1146
- snappy/doc/ptolemy_examples1.html +408 -410
- snappy/doc/ptolemy_examples2.html +470 -473
- snappy/doc/ptolemy_examples3.html +413 -416
- snappy/doc/ptolemy_examples4.html +194 -197
- snappy/doc/ptolemy_prelim.html +247 -250
- snappy/doc/py-modindex.html +164 -167
- snappy/doc/screenshots.html +140 -142
- snappy/doc/search.html +134 -137
- snappy/doc/searchindex.js +1 -1
- snappy/doc/snap.html +201 -204
- snappy/doc/snappy.html +180 -182
- snappy/doc/spherogram.html +1210 -1213
- snappy/doc/todo.html +165 -168
- snappy/doc/triangulation.html +1583 -1474
- snappy/doc/tutorial.html +158 -161
- snappy/doc/verify.html +329 -275
- snappy/doc/verify_internals.html +1234 -1691
- 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.cp38-win_amd64.pyd +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 +14 -10
- 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-38.pyc +0 -0
- snappy/__pycache__/browser.cpython-38.pyc +0 -0
- snappy/__pycache__/cache.cpython-38.pyc +0 -0
- snappy/__pycache__/database.cpython-38.pyc +0 -0
- snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
- snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
- snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
- snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
- snappy/__pycache__/gui.cpython-38.pyc +0 -0
- snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
- snappy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/__pycache__/number.cpython-38.pyc +0 -0
- snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
- snappy/__pycache__/pari.cpython-38.pyc +0 -0
- snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
- snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
- snappy/__pycache__/version.cpython-38.pyc +0 -0
- snappy/doc/_sources/verify_canon.rst.txt +0 -90
- snappy/doc/_static/jquery-3.6.0.js +0 -10881
- snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
- snappy/doc/_static/js/html5shiv.min.js +0 -4
- snappy/doc/_static/underscore-1.13.1.js +0 -2042
- snappy/doc/_static/underscore.js +0 -6
- snappy/doc/verify_canon.html +0 -304
- snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
- snappy/drilling/__pycache__/tracing.cpython-38.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-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
- snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
- snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
- snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
- snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
- snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
- snappy/snap/t3mlite/__pycache__/vertex.cpython-38.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-38.pyc +0 -0
- snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
- snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
- snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
- snappy/verify/cuspCrossSection.py +0 -1422
- snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
- snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
- snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
- snappy-3.1.1.dist-info/RECORD +0 -575
- {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):
|