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.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp38-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp38-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp38-win_amd64.pyd +0 -0
  4. snappy/__init__.py +299 -402
  5. snappy/app.py +70 -20
  6. snappy/browser.py +18 -17
  7. snappy/canonical.py +249 -0
  8. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +8 -18
  9. snappy/cusps/cusp_area_matrix.py +101 -0
  10. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +23 -39
  11. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  12. snappy/cusps/test.py +21 -0
  13. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  14. snappy/database.py +10 -9
  15. snappy/decorated_isosig.py +337 -114
  16. snappy/dev/extended_ptolemy/complexVolumesClosed.py +40 -7
  17. snappy/dev/extended_ptolemy/extended.py +3 -3
  18. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  19. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +1 -1
  20. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  21. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  22. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  23. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  24. snappy/doc/_sources/additional_classes.rst.txt +40 -40
  25. snappy/doc/_sources/bugs.rst.txt +14 -14
  26. snappy/doc/_sources/censuses.rst.txt +51 -51
  27. snappy/doc/_sources/credits.rst.txt +75 -75
  28. snappy/doc/_sources/development.rst.txt +259 -239
  29. snappy/doc/_sources/index.rst.txt +182 -115
  30. snappy/doc/_sources/installing.rst.txt +247 -264
  31. snappy/doc/_sources/manifold.rst.txt +6 -6
  32. snappy/doc/_sources/manifoldhp.rst.txt +46 -46
  33. snappy/doc/_sources/news.rst.txt +355 -283
  34. snappy/doc/_sources/other.rst.txt +25 -25
  35. snappy/doc/_sources/platonic_census.rst.txt +20 -20
  36. snappy/doc/_sources/plink.rst.txt +102 -102
  37. snappy/doc/_sources/ptolemy.rst.txt +66 -66
  38. snappy/doc/_sources/ptolemy_classes.rst.txt +42 -42
  39. snappy/doc/_sources/ptolemy_examples1.rst.txt +298 -297
  40. snappy/doc/_sources/ptolemy_examples2.rst.txt +363 -363
  41. snappy/doc/_sources/ptolemy_examples3.rst.txt +301 -301
  42. snappy/doc/_sources/ptolemy_examples4.rst.txt +61 -61
  43. snappy/doc/_sources/ptolemy_prelim.rst.txt +105 -105
  44. snappy/doc/_sources/screenshots.rst.txt +21 -21
  45. snappy/doc/_sources/snap.rst.txt +87 -87
  46. snappy/doc/_sources/snappy.rst.txt +28 -28
  47. snappy/doc/_sources/spherogram.rst.txt +103 -103
  48. snappy/doc/_sources/todo.rst.txt +47 -47
  49. snappy/doc/_sources/triangulation.rst.txt +11 -11
  50. snappy/doc/_sources/tutorial.rst.txt +49 -49
  51. snappy/doc/_sources/verify.rst.txt +210 -150
  52. snappy/doc/_sources/verify_internals.rst.txt +79 -90
  53. snappy/doc/_static/basic.css +924 -902
  54. snappy/doc/_static/css/badge_only.css +1 -1
  55. snappy/doc/_static/css/theme.css +1 -1
  56. snappy/doc/_static/doctools.js +1 -1
  57. snappy/doc/_static/documentation_options.js +12 -13
  58. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  59. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  60. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  61. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  62. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  63. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  64. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  65. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  66. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  67. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  68. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  69. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  70. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  71. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  72. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  73. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  74. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  75. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  76. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  77. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  78. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  79. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  80. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  81. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  82. snappy/doc/_static/js/versions.js +228 -0
  83. snappy/doc/_static/language_data.js +199 -199
  84. snappy/doc/_static/pygments.css +74 -73
  85. snappy/doc/_static/searchtools.js +125 -71
  86. snappy/doc/_static/snappy_furo.css +33 -33
  87. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -42
  88. snappy/doc/_static/sphinx_highlight.js +13 -3
  89. snappy/doc/additional_classes.html +1499 -1330
  90. snappy/doc/bugs.html +131 -134
  91. snappy/doc/censuses.html +426 -445
  92. snappy/doc/credits.html +180 -183
  93. snappy/doc/development.html +383 -363
  94. snappy/doc/genindex.html +1330 -1409
  95. snappy/doc/index.html +261 -206
  96. snappy/doc/installing.html +345 -363
  97. snappy/doc/manifold.html +3451 -2839
  98. snappy/doc/manifoldhp.html +179 -182
  99. snappy/doc/news.html +387 -329
  100. snappy/doc/objects.inv +0 -0
  101. snappy/doc/other.html +160 -162
  102. snappy/doc/platonic_census.html +374 -377
  103. snappy/doc/plink.html +209 -212
  104. snappy/doc/ptolemy.html +253 -255
  105. snappy/doc/ptolemy_classes.html +1143 -1146
  106. snappy/doc/ptolemy_examples1.html +408 -410
  107. snappy/doc/ptolemy_examples2.html +470 -473
  108. snappy/doc/ptolemy_examples3.html +413 -416
  109. snappy/doc/ptolemy_examples4.html +194 -197
  110. snappy/doc/ptolemy_prelim.html +247 -250
  111. snappy/doc/py-modindex.html +164 -167
  112. snappy/doc/screenshots.html +140 -142
  113. snappy/doc/search.html +134 -137
  114. snappy/doc/searchindex.js +1 -1
  115. snappy/doc/snap.html +201 -204
  116. snappy/doc/snappy.html +180 -182
  117. snappy/doc/spherogram.html +1210 -1213
  118. snappy/doc/todo.html +165 -168
  119. snappy/doc/triangulation.html +1583 -1474
  120. snappy/doc/tutorial.html +158 -161
  121. snappy/doc/verify.html +329 -275
  122. snappy/doc/verify_internals.html +1234 -1691
  123. snappy/drilling/__init__.py +153 -235
  124. snappy/drilling/barycentric.py +103 -0
  125. snappy/drilling/constants.py +0 -2
  126. snappy/drilling/crush.py +56 -130
  127. snappy/drilling/cusps.py +12 -6
  128. snappy/drilling/debug.py +2 -1
  129. snappy/drilling/exceptions.py +7 -40
  130. snappy/drilling/moves.py +302 -243
  131. snappy/drilling/perturb.py +63 -37
  132. snappy/drilling/shorten.py +36 -0
  133. snappy/drilling/subdivide.py +0 -5
  134. snappy/drilling/test.py +23 -0
  135. snappy/drilling/test_cases.py +126 -0
  136. snappy/drilling/tracing.py +9 -37
  137. snappy/exceptions.py +18 -5
  138. snappy/exterior_to_link/barycentric_geometry.py +2 -4
  139. snappy/exterior_to_link/main.py +8 -7
  140. snappy/exterior_to_link/mcomplex_with_link.py +2 -2
  141. snappy/exterior_to_link/rational_linear_algebra.py +1 -1
  142. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +1 -1
  143. snappy/exterior_to_link/test.py +21 -33
  144. snappy/geometric_structure/__init__.py +212 -0
  145. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  146. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  147. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  148. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  149. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  150. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  151. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  152. snappy/geometric_structure/geodesic/__init__.py +0 -0
  153. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  154. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  155. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  156. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  157. snappy/geometric_structure/geodesic/constants.py +6 -0
  158. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  159. snappy/{drilling → geometric_structure/geodesic}/fixed_points.py +34 -9
  160. snappy/{drilling/geodesic_info.py → geometric_structure/geodesic/geodesic_start_point_info.py} +139 -180
  161. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  162. snappy/geometric_structure/geodesic/line.py +30 -0
  163. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  164. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  165. snappy/geometric_structure/test.py +22 -0
  166. snappy/gui.py +23 -13
  167. snappy/horoviewer.py +7 -7
  168. snappy/hyperboloid/__init__.py +96 -31
  169. snappy/hyperboloid/distances.py +245 -0
  170. snappy/hyperboloid/horoball.py +19 -0
  171. snappy/hyperboloid/line.py +35 -0
  172. snappy/hyperboloid/point.py +9 -0
  173. snappy/hyperboloid/triangle.py +29 -0
  174. snappy/isometry_signature.py +382 -0
  175. snappy/len_spec/__init__.py +596 -0
  176. snappy/len_spec/geodesic_info.py +110 -0
  177. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  178. snappy/len_spec/geodesic_piece.py +143 -0
  179. snappy/len_spec/geometric_structure.py +182 -0
  180. snappy/len_spec/geometry.py +80 -0
  181. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  182. snappy/len_spec/spine.py +206 -0
  183. snappy/len_spec/test.py +24 -0
  184. snappy/len_spec/test_cases.py +69 -0
  185. snappy/len_spec/tile.py +275 -0
  186. snappy/len_spec/word.py +86 -0
  187. snappy/math_basics.py +39 -13
  188. snappy/matrix.py +52 -9
  189. snappy/number.py +12 -6
  190. snappy/numeric_output_checker.py +2 -3
  191. snappy/pari.py +8 -4
  192. snappy/phone_home.py +2 -1
  193. snappy/polyviewer.py +8 -8
  194. snappy/ptolemy/__init__.py +1 -1
  195. snappy/ptolemy/component.py +2 -2
  196. snappy/ptolemy/coordinates.py +25 -25
  197. snappy/ptolemy/findLoops.py +9 -9
  198. snappy/ptolemy/manifoldMethods.py +27 -29
  199. snappy/ptolemy/polynomial.py +50 -57
  200. snappy/ptolemy/processFileBase.py +60 -0
  201. snappy/ptolemy/ptolemyVariety.py +109 -41
  202. snappy/ptolemy/reginaWrapper.py +4 -4
  203. snappy/ptolemy/rur.py +1 -1
  204. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +9 -9
  205. snappy/ptolemy/test.py +99 -54
  206. snappy/ptolemy/utilities.py +1 -1
  207. snappy/raytracing/__init__.py +64 -0
  208. snappy/raytracing/additional_horospheres.py +64 -0
  209. snappy/raytracing/additional_len_spec_choices.py +63 -0
  210. snappy/raytracing/cohomology_fractal.py +0 -3
  211. snappy/raytracing/eyeball.py +123 -0
  212. snappy/raytracing/finite_raytracing_data.py +17 -17
  213. snappy/raytracing/finite_viewer.py +15 -15
  214. snappy/raytracing/geodesic_tube_info.py +93 -63
  215. snappy/raytracing/geodesics.py +94 -64
  216. snappy/raytracing/geodesics_window.py +56 -34
  217. snappy/raytracing/gui_utilities.py +21 -6
  218. snappy/raytracing/hyperboloid_navigation.py +29 -4
  219. snappy/raytracing/hyperboloid_utilities.py +73 -73
  220. snappy/raytracing/ideal_raytracing_data.py +121 -91
  221. snappy/raytracing/inside_viewer.py +199 -66
  222. snappy/raytracing/pack.py +22 -0
  223. snappy/raytracing/raytracing_data.py +37 -25
  224. snappy/raytracing/raytracing_view.py +70 -65
  225. snappy/raytracing/shaders/Eye.png +0 -0
  226. snappy/raytracing/shaders/NonGeometric.png +0 -0
  227. snappy/raytracing/shaders/__init__.py +39 -3
  228. snappy/raytracing/shaders/fragment.glsl +451 -133
  229. snappy/raytracing/test.py +29 -0
  230. snappy/raytracing/tooltip.py +146 -0
  231. snappy/raytracing/upper_halfspace_utilities.py +42 -9
  232. snappy/sage_helper.py +67 -134
  233. snappy/settings.py +90 -77
  234. snappy/shell.py +2 -0
  235. snappy/snap/character_varieties.py +2 -2
  236. snappy/snap/find_field.py +4 -3
  237. snappy/snap/fundamental_polyhedron.py +2 -2
  238. snappy/snap/kernel_structures.py +5 -1
  239. snappy/snap/nsagetools.py +9 -8
  240. snappy/snap/peripheral/dual_cellulation.py +4 -3
  241. snappy/snap/peripheral/peripheral.py +2 -2
  242. snappy/snap/peripheral/surface.py +5 -5
  243. snappy/snap/peripheral/test.py +1 -1
  244. snappy/snap/polished_reps.py +8 -8
  245. snappy/snap/slice_obs_HKL.py +16 -14
  246. snappy/snap/t3mlite/arrow.py +3 -3
  247. snappy/snap/t3mlite/edge.py +3 -3
  248. snappy/snap/t3mlite/homology.py +2 -2
  249. snappy/snap/t3mlite/mcomplex.py +3 -3
  250. snappy/snap/t3mlite/simplex.py +12 -0
  251. snappy/snap/t3mlite/spun.py +18 -17
  252. snappy/snap/t3mlite/test_vs_regina.py +4 -4
  253. snappy/snap/test.py +37 -53
  254. snappy/snap/utilities.py +4 -5
  255. snappy/test.py +121 -138
  256. snappy/test_cases.py +263 -0
  257. snappy/testing.py +131 -0
  258. snappy/tiling/__init__.py +2 -0
  259. snappy/tiling/canonical_key_dict.py +59 -0
  260. snappy/tiling/dict_based_set.py +79 -0
  261. snappy/tiling/floor.py +49 -0
  262. snappy/tiling/hyperboloid_dict.py +54 -0
  263. snappy/tiling/iter_utils.py +78 -0
  264. snappy/tiling/lifted_tetrahedron.py +22 -0
  265. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  266. snappy/tiling/real_hash_dict.py +164 -0
  267. snappy/tiling/test.py +23 -0
  268. snappy/tiling/tile.py +215 -0
  269. snappy/tiling/triangle.py +33 -0
  270. snappy/tkterminal.py +113 -84
  271. snappy/twister/main.py +1 -7
  272. snappy/twister/twister_core.cp38-win_amd64.pyd +0 -0
  273. snappy/upper_halfspace/__init__.py +78 -17
  274. snappy/verify/__init__.py +3 -7
  275. snappy/verify/{verifyCanonical.py → canonical.py} +78 -70
  276. snappy/verify/complex_volume/adjust_torsion.py +1 -2
  277. snappy/verify/complex_volume/closed.py +13 -13
  278. snappy/verify/complex_volume/cusped.py +6 -6
  279. snappy/verify/complex_volume/extended_bloch.py +5 -8
  280. snappy/verify/{cuspTranslations.py → cusp_translations.py} +1 -1
  281. snappy/verify/edge_equations.py +80 -0
  282. snappy/verify/exceptions.py +0 -55
  283. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +3 -3
  284. snappy/verify/interval_newton_shapes_engine.py +7 -5
  285. snappy/verify/interval_tree.py +5 -5
  286. snappy/verify/krawczyk_shapes_engine.py +17 -18
  287. snappy/verify/maximal_cusp_area_matrix/__init__.py +7 -74
  288. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +3 -4
  289. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +1 -1
  290. snappy/verify/{realAlgebra.py → real_algebra.py} +1 -1
  291. snappy/verify/shapes.py +5 -3
  292. snappy/verify/short_slopes.py +39 -41
  293. snappy/verify/{squareExtensions.py → square_extensions.py} +14 -11
  294. snappy/verify/test.py +57 -60
  295. snappy/verify/upper_halfspace/extended_matrix.py +1 -1
  296. snappy/verify/upper_halfspace/finite_point.py +3 -4
  297. snappy/verify/upper_halfspace/ideal_point.py +9 -9
  298. snappy/verify/volume.py +2 -2
  299. snappy/version.py +2 -2
  300. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/METADATA +14 -10
  301. snappy-3.2.dist-info/RECORD +503 -0
  302. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  303. {snappy-3.1.1.dist-info → snappy-3.2.dist-info}/top_level.txt +6 -1
  304. snappy/__pycache__/__init__.cpython-38.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-38.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-38.pyc +0 -0
  307. snappy/__pycache__/database.cpython-38.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-38.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-38.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-38.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-38.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-38.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-38.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-38.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-38.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-38.pyc +0 -0
  317. snappy/__pycache__/number.cpython-38.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-38.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-38.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-38.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-38.pyc +0 -0
  322. snappy/__pycache__/version.cpython-38.pyc +0 -0
  323. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  324. snappy/doc/_static/jquery-3.6.0.js +0 -10881
  325. snappy/doc/_static/js/html5shiv-printshiv.min.js +0 -4
  326. snappy/doc/_static/js/html5shiv.min.js +0 -4
  327. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  328. snappy/doc/_static/underscore.js +0 -6
  329. snappy/doc/verify_canon.html +0 -304
  330. snappy/drilling/__pycache__/__init__.cpython-38.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-38.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-38.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-38.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-38.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-38.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-38.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-38.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-38.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-38.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-38.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-38.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-38.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-38.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-38.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-38.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-38.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-38.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-38.pyc +0 -0
  349. snappy/drilling/geodesic_tube.py +0 -441
  350. snappy/drilling/geometric_structure.py +0 -366
  351. snappy/drilling/line.py +0 -122
  352. snappy/drilling/quotient_space.py +0 -94
  353. snappy/drilling/spatial_dict.py +0 -128
  354. snappy/exterior_to_link/__pycache__/__init__.cpython-38.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-38.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-38.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-38.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-38.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-38.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-38.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-38.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-38.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-38.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-38.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-38.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-38.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-38.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-38.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-38.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-38.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-38.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-38.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-38.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-38.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-38.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-38.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-38.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-38.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-38.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-38.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-38.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-38.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-38.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-38.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-38.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-38.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-38.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-38.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-38.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-38.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-38.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-38.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-38.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-38.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-38.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-38.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-38.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-38.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-38.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-38.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-38.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-38.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-38.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-38.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-38.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-38.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-38.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-38.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-38.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-38.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-38.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-38.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-38.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-38.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-38.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-38.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-38.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-38.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-38.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-38.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-38.pyc +0 -0
  423. snappy/togl/__init__.py +0 -3
  424. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  425. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  426. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  427. snappy/togl/darwin-tk8.7/Togl2.1/LICENSE +0 -28
  428. snappy/togl/darwin-tk8.7/Togl2.1/libTogl2.1.dylib +0 -0
  429. snappy/togl/darwin-tk8.7/Togl2.1/pkgIndex.tcl +0 -5
  430. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  431. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  432. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  433. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  434. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  435. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  436. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  437. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  438. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  439. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  440. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  441. snappy/twister/__pycache__/__init__.cpython-38.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-38.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-38.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-38.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-38.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-38.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-38.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-38.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-38.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-38.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-38.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-38.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-38.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-38.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-38.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-38.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-38.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-38.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-38.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-38.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-38.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-38.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-38.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-38.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-38.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-38.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-38.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-38.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-38.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-38.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-38.pyc +0 -0
  475. snappy-3.1.1.dist-info/RECORD +0 -575
  476. {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 ..drilling.exceptions import WordAppearsToBeParabolic
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
- checkbox_column = 0
85
- color_column = 1
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.geodesic_info.core_curve_cusp:
125
- cusp_index = geodesic.geodesic_info.core_curve_cusp.Index
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.geodesic_info.core_curve_cusp:
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=('Limiting size of geodesic tube to prevent intersection '
166
- 'with core curve.'),
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.raytracing_view.geodesics.add_length_spectrum(
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.raytracing_view.geodesics.get_mcomplex().num_generators
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.raytracing_view.geodesics.add_word(word)
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.raytracing_view.update_geodesic_data_and_redraw()
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.raytracing_view.update_geodesic_data_and_redraw()
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, sticky=slider_stick, padx=10)
30
- column += 1
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.label.configure(text='%.1ffps (%dms)' % (fps, time_ms))
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.redraw_if_initialized() to redraw.
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.redraw_if_initialized()
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.redraw_if_initialized()
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.redraw_if_initialized()
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 snappy.SnapPy import matrix, vector
2
-
3
- from snappy.hyperboloid import (r13_dot,
4
- unit_time_vector_to_o13_hyperbolic_translation,
5
- unnormalised_plane_eqn_from_r13_points)
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 matrix(
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 matrix(
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 matrix(
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
- vector(
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 = [ x * poincare_factor for x in klein ]
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 _is_row_sane(r):
144
- for c in r:
145
- if not (c < 10000.0 and c > -10000.0):
146
- return False
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 _orthonormalize_row(row, other_rows, row_sign):
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
- result = R13_normalise(vector(result), sign=row_sign)
158
+ return _check_vector_sane(
159
+ time_r13_normalise(v))
161
160
  except ValueError:
162
- return None
163
- if not _is_row_sane(result):
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 O13_orthonormalize(m):
171
+ def _orthonormalise_row_sane(row, previous_rows):
179
172
  try:
180
- ring = m[0][0].parent()
181
- except AttributeError:
182
- ring = None
183
- id_matrix = matrix([[1.0, 0.0, 0.0, 0.0],
184
- [0.0, 1.0, 0.0, 0.0],
185
- [0.0, 0.0, 1.0, 0.0],
186
- [0.0, 0.0, 0.0, 1.0]],
187
- ring=ring)
188
-
189
- result = [ ]
190
- for row, id_row, sign in zip(m, id_matrix, _signature):
191
- result.append(_orthonormalize_row_sane(row, id_row, result, sign))
192
- return matrix(result, ring=ring)
193
-
194
-
195
- def R13_plane_from_R13_light_vectors(pts):
196
- return R13_normalise(unnormalised_plane_eqn_from_r13_points(pts))
197
-
198
-
199
- def make_tet_planes(tet_vert_positions):
200
- """
201
- Given four light-like vectors, returns the four normals for the
202
- for faces of the ideal tetrahedron spanned by the corresponding
203
- ideal points in the 1,3-hyperboloid model.
204
-
205
- Outward facing for positively oriented tetrahedra.
206
- """
207
-
208
- v0, v1, v2, v3 = tet_vert_positions
209
- return [ R13_plane_from_R13_light_vectors([v1, v3, v2]),
210
- R13_plane_from_R13_light_vectors([v0, v2, v3]),
211
- R13_plane_from_R13_light_vectors([v0, v3, v1]),
212
- R13_plane_from_R13_light_vectors([v0, v1, v2]) ]
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 vector([z.real(), z.imag()])
220
+ return make_vector([z.real(), z.imag()])
221
221
 
222
222
 
223
223
  def _dist_from_projection(p, dir):