snappy 3.1.1__cp39-cp39-win_amd64.whl → 3.2__cp39-cp39-win_amd64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (476) hide show
  1. snappy/CyOpenGL.cp39-win_amd64.pyd +0 -0
  2. snappy/SnapPy.cp39-win_amd64.pyd +0 -0
  3. snappy/SnapPyHP.cp39-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.cp39-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 +26 -11
  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-39.pyc +0 -0
  305. snappy/__pycache__/browser.cpython-39.pyc +0 -0
  306. snappy/__pycache__/cache.cpython-39.pyc +0 -0
  307. snappy/__pycache__/database.cpython-39.pyc +0 -0
  308. snappy/__pycache__/db_utilities.cpython-39.pyc +0 -0
  309. snappy/__pycache__/decorated_isosig.cpython-39.pyc +0 -0
  310. snappy/__pycache__/exceptions.cpython-39.pyc +0 -0
  311. snappy/__pycache__/export_stl.cpython-39.pyc +0 -0
  312. snappy/__pycache__/filedialog.cpython-39.pyc +0 -0
  313. snappy/__pycache__/gui.cpython-39.pyc +0 -0
  314. snappy/__pycache__/horoviewer.cpython-39.pyc +0 -0
  315. snappy/__pycache__/math_basics.cpython-39.pyc +0 -0
  316. snappy/__pycache__/matrix.cpython-39.pyc +0 -0
  317. snappy/__pycache__/number.cpython-39.pyc +0 -0
  318. snappy/__pycache__/numeric_output_checker.cpython-39.pyc +0 -0
  319. snappy/__pycache__/pari.cpython-39.pyc +0 -0
  320. snappy/__pycache__/polyviewer.cpython-39.pyc +0 -0
  321. snappy/__pycache__/sage_helper.cpython-39.pyc +0 -0
  322. snappy/__pycache__/version.cpython-39.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-39.pyc +0 -0
  331. snappy/drilling/__pycache__/constants.cpython-39.pyc +0 -0
  332. snappy/drilling/__pycache__/crush.cpython-39.pyc +0 -0
  333. snappy/drilling/__pycache__/cusps.cpython-39.pyc +0 -0
  334. snappy/drilling/__pycache__/debug.cpython-39.pyc +0 -0
  335. snappy/drilling/__pycache__/epsilons.cpython-39.pyc +0 -0
  336. snappy/drilling/__pycache__/exceptions.cpython-39.pyc +0 -0
  337. snappy/drilling/__pycache__/fixed_points.cpython-39.pyc +0 -0
  338. snappy/drilling/__pycache__/geodesic_info.cpython-39.pyc +0 -0
  339. snappy/drilling/__pycache__/geodesic_tube.cpython-39.pyc +0 -0
  340. snappy/drilling/__pycache__/geometric_structure.cpython-39.pyc +0 -0
  341. snappy/drilling/__pycache__/line.cpython-39.pyc +0 -0
  342. snappy/drilling/__pycache__/moves.cpython-39.pyc +0 -0
  343. snappy/drilling/__pycache__/peripheral_curves.cpython-39.pyc +0 -0
  344. snappy/drilling/__pycache__/perturb.cpython-39.pyc +0 -0
  345. snappy/drilling/__pycache__/quotient_space.cpython-39.pyc +0 -0
  346. snappy/drilling/__pycache__/spatial_dict.cpython-39.pyc +0 -0
  347. snappy/drilling/__pycache__/subdivide.cpython-39.pyc +0 -0
  348. snappy/drilling/__pycache__/tracing.cpython-39.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-39.pyc +0 -0
  355. snappy/exterior_to_link/__pycache__/barycentric_geometry.cpython-39.pyc +0 -0
  356. snappy/exterior_to_link/__pycache__/exceptions.cpython-39.pyc +0 -0
  357. snappy/exterior_to_link/__pycache__/hyp_utils.cpython-39.pyc +0 -0
  358. snappy/exterior_to_link/__pycache__/link_projection.cpython-39.pyc +0 -0
  359. snappy/exterior_to_link/__pycache__/main.cpython-39.pyc +0 -0
  360. snappy/exterior_to_link/__pycache__/mcomplex_with_expansion.cpython-39.pyc +0 -0
  361. snappy/exterior_to_link/__pycache__/mcomplex_with_link.cpython-39.pyc +0 -0
  362. snappy/exterior_to_link/__pycache__/mcomplex_with_memory.cpython-39.pyc +0 -0
  363. snappy/exterior_to_link/__pycache__/pl_utils.cpython-39.pyc +0 -0
  364. snappy/exterior_to_link/__pycache__/put_in_S3.cpython-39.pyc +0 -0
  365. snappy/exterior_to_link/__pycache__/rational_linear_algebra.cpython-39.pyc +0 -0
  366. snappy/exterior_to_link/__pycache__/simplify_to_base_tri.cpython-39.pyc +0 -0
  367. snappy/exterior_to_link/__pycache__/stored_moves.cpython-39.pyc +0 -0
  368. snappy/hyperboloid/__pycache__/__init__.cpython-39.pyc +0 -0
  369. snappy/manifolds/__pycache__/__init__.cpython-39.pyc +0 -0
  370. snappy/ptolemy/__pycache__/__init__.cpython-39.pyc +0 -0
  371. snappy/ptolemy/__pycache__/component.cpython-39.pyc +0 -0
  372. snappy/ptolemy/__pycache__/coordinates.cpython-39.pyc +0 -0
  373. snappy/ptolemy/__pycache__/fieldExtensions.cpython-39.pyc +0 -0
  374. snappy/ptolemy/__pycache__/findLoops.cpython-39.pyc +0 -0
  375. snappy/ptolemy/__pycache__/homology.cpython-39.pyc +0 -0
  376. snappy/ptolemy/__pycache__/manifoldMethods.cpython-39.pyc +0 -0
  377. snappy/ptolemy/__pycache__/matrix.cpython-39.pyc +0 -0
  378. snappy/ptolemy/__pycache__/numericalSolutionsToGroebnerBasis.cpython-39.pyc +0 -0
  379. snappy/ptolemy/__pycache__/polynomial.cpython-39.pyc +0 -0
  380. snappy/ptolemy/__pycache__/processComponents.cpython-39.pyc +0 -0
  381. snappy/ptolemy/__pycache__/processFileBase.cpython-39.pyc +0 -0
  382. snappy/ptolemy/__pycache__/processFileDispatch.cpython-39.pyc +0 -0
  383. snappy/ptolemy/__pycache__/processMagmaFile.cpython-39.pyc +0 -0
  384. snappy/ptolemy/__pycache__/processRurFile.cpython-39.pyc +0 -0
  385. snappy/ptolemy/__pycache__/ptolemyGeneralizedObstructionClass.cpython-39.pyc +0 -0
  386. snappy/ptolemy/__pycache__/ptolemyObstructionClass.cpython-39.pyc +0 -0
  387. snappy/ptolemy/__pycache__/ptolemyVariety.cpython-39.pyc +0 -0
  388. snappy/ptolemy/__pycache__/ptolemyVarietyPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  389. snappy/ptolemy/__pycache__/rur.cpython-39.pyc +0 -0
  390. snappy/ptolemy/__pycache__/solutionsToPrimeIdealGroebnerBasis.cpython-39.pyc +0 -0
  391. snappy/ptolemy/__pycache__/utilities.cpython-39.pyc +0 -0
  392. snappy/snap/__pycache__/__init__.cpython-39.pyc +0 -0
  393. snappy/snap/__pycache__/character_varieties.cpython-39.pyc +0 -0
  394. snappy/snap/__pycache__/fundamental_polyhedron.cpython-39.pyc +0 -0
  395. snappy/snap/__pycache__/interval_reps.cpython-39.pyc +0 -0
  396. snappy/snap/__pycache__/kernel_structures.cpython-39.pyc +0 -0
  397. snappy/snap/__pycache__/mcomplex_base.cpython-39.pyc +0 -0
  398. snappy/snap/__pycache__/nsagetools.cpython-39.pyc +0 -0
  399. snappy/snap/__pycache__/polished_reps.cpython-39.pyc +0 -0
  400. snappy/snap/__pycache__/shapes.cpython-39.pyc +0 -0
  401. snappy/snap/__pycache__/slice_obs_HKL.cpython-39.pyc +0 -0
  402. snappy/snap/__pycache__/utilities.cpython-39.pyc +0 -0
  403. snappy/snap/peripheral/__pycache__/__init__.cpython-39.pyc +0 -0
  404. snappy/snap/peripheral/__pycache__/dual_cellulation.cpython-39.pyc +0 -0
  405. snappy/snap/peripheral/__pycache__/link.cpython-39.pyc +0 -0
  406. snappy/snap/peripheral/__pycache__/peripheral.cpython-39.pyc +0 -0
  407. snappy/snap/peripheral/__pycache__/surface.cpython-39.pyc +0 -0
  408. snappy/snap/t3mlite/__pycache__/__init__.cpython-39.pyc +0 -0
  409. snappy/snap/t3mlite/__pycache__/arrow.cpython-39.pyc +0 -0
  410. snappy/snap/t3mlite/__pycache__/corner.cpython-39.pyc +0 -0
  411. snappy/snap/t3mlite/__pycache__/edge.cpython-39.pyc +0 -0
  412. snappy/snap/t3mlite/__pycache__/face.cpython-39.pyc +0 -0
  413. snappy/snap/t3mlite/__pycache__/files.cpython-39.pyc +0 -0
  414. snappy/snap/t3mlite/__pycache__/homology.cpython-39.pyc +0 -0
  415. snappy/snap/t3mlite/__pycache__/linalg.cpython-39.pyc +0 -0
  416. snappy/snap/t3mlite/__pycache__/mcomplex.cpython-39.pyc +0 -0
  417. snappy/snap/t3mlite/__pycache__/perm4.cpython-39.pyc +0 -0
  418. snappy/snap/t3mlite/__pycache__/simplex.cpython-39.pyc +0 -0
  419. snappy/snap/t3mlite/__pycache__/spun.cpython-39.pyc +0 -0
  420. snappy/snap/t3mlite/__pycache__/surface.cpython-39.pyc +0 -0
  421. snappy/snap/t3mlite/__pycache__/tetrahedron.cpython-39.pyc +0 -0
  422. snappy/snap/t3mlite/__pycache__/vertex.cpython-39.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-39.pyc +0 -0
  442. snappy/twister/__pycache__/main.cpython-39.pyc +0 -0
  443. snappy/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  444. snappy/upper_halfspace/__pycache__/ideal_point.cpython-39.pyc +0 -0
  445. snappy/verify/__pycache__/__init__.cpython-39.pyc +0 -0
  446. snappy/verify/__pycache__/cuspCrossSection.cpython-39.pyc +0 -0
  447. snappy/verify/__pycache__/cuspTranslations.cpython-39.pyc +0 -0
  448. snappy/verify/__pycache__/cusp_areas.cpython-39.pyc +0 -0
  449. snappy/verify/__pycache__/cusp_shapes.cpython-39.pyc +0 -0
  450. snappy/verify/__pycache__/exceptions.cpython-39.pyc +0 -0
  451. snappy/verify/__pycache__/interval_newton_shapes_engine.cpython-39.pyc +0 -0
  452. snappy/verify/__pycache__/interval_tree.cpython-39.pyc +0 -0
  453. snappy/verify/__pycache__/krawczyk_shapes_engine.cpython-39.pyc +0 -0
  454. snappy/verify/__pycache__/realAlgebra.cpython-39.pyc +0 -0
  455. snappy/verify/__pycache__/shapes.cpython-39.pyc +0 -0
  456. snappy/verify/__pycache__/short_slopes.cpython-39.pyc +0 -0
  457. snappy/verify/__pycache__/squareExtensions.cpython-39.pyc +0 -0
  458. snappy/verify/__pycache__/verifyCanonical.cpython-39.pyc +0 -0
  459. snappy/verify/__pycache__/verifyHyperbolicity.cpython-39.pyc +0 -0
  460. snappy/verify/__pycache__/volume.cpython-39.pyc +0 -0
  461. snappy/verify/complex_volume/__pycache__/__init__.cpython-39.pyc +0 -0
  462. snappy/verify/complex_volume/__pycache__/adjust_torsion.cpython-39.pyc +0 -0
  463. snappy/verify/complex_volume/__pycache__/closed.cpython-39.pyc +0 -0
  464. snappy/verify/complex_volume/__pycache__/compute_ptolemys.cpython-39.pyc +0 -0
  465. snappy/verify/complex_volume/__pycache__/cusped.cpython-39.pyc +0 -0
  466. snappy/verify/complex_volume/__pycache__/extended_bloch.cpython-39.pyc +0 -0
  467. snappy/verify/cuspCrossSection.py +0 -1422
  468. snappy/verify/maximal_cusp_area_matrix/__pycache__/__init__.cpython-39.pyc +0 -0
  469. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_tiling_engine.cpython-39.pyc +0 -0
  470. snappy/verify/maximal_cusp_area_matrix/__pycache__/cusp_translate_engine.cpython-39.pyc +0 -0
  471. snappy/verify/upper_halfspace/__pycache__/__init__.cpython-39.pyc +0 -0
  472. snappy/verify/upper_halfspace/__pycache__/extended_matrix.cpython-39.pyc +0 -0
  473. snappy/verify/upper_halfspace/__pycache__/finite_point.cpython-39.pyc +0 -0
  474. snappy/verify/upper_halfspace/__pycache__/ideal_point.cpython-39.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):