vispy 0.15.0__cp312-cp312-macosx_10_13_x86_64.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.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-312-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def compact(vertices, indices, tolerance=1e-3):
|
|
11
|
+
"""Compact vertices and indices within given tolerance"""
|
|
12
|
+
# Transform vertices into a structured array for np.unique to work
|
|
13
|
+
n = len(vertices)
|
|
14
|
+
V = np.zeros(n, dtype=[("pos", np.float32, 3)])
|
|
15
|
+
V["pos"][:, 0] = vertices[:, 0]
|
|
16
|
+
V["pos"][:, 1] = vertices[:, 1]
|
|
17
|
+
V["pos"][:, 2] = vertices[:, 2]
|
|
18
|
+
|
|
19
|
+
epsilon = 1e-3
|
|
20
|
+
decimals = int(np.log(epsilon)/np.log(1/10.))
|
|
21
|
+
|
|
22
|
+
# Round all vertices within given decimals
|
|
23
|
+
V_ = np.zeros_like(V)
|
|
24
|
+
X = V["pos"][:, 0].round(decimals=decimals)
|
|
25
|
+
X[np.where(abs(X) < epsilon)] = 0
|
|
26
|
+
|
|
27
|
+
V_["pos"][:, 0] = X
|
|
28
|
+
Y = V["pos"][:, 1].round(decimals=decimals)
|
|
29
|
+
Y[np.where(abs(Y) < epsilon)] = 0
|
|
30
|
+
V_["pos"][:, 1] = Y
|
|
31
|
+
|
|
32
|
+
Z = V["pos"][:, 2].round(decimals=decimals)
|
|
33
|
+
Z[np.where(abs(Z) < epsilon)] = 0
|
|
34
|
+
V_["pos"][:, 2] = Z
|
|
35
|
+
|
|
36
|
+
# Find the unique vertices AND the mapping
|
|
37
|
+
U, RI = np.unique(V_, return_inverse=True)
|
|
38
|
+
|
|
39
|
+
# Translate indices from original vertices into the reduced set (U)
|
|
40
|
+
indices = indices.ravel()
|
|
41
|
+
I_ = indices.copy().ravel()
|
|
42
|
+
for i in range(len(indices)):
|
|
43
|
+
I_[i] = RI[indices[i]]
|
|
44
|
+
I_ = I_.reshape(len(indices)//3, 3)
|
|
45
|
+
|
|
46
|
+
# Return reduced vertices set, transalted indices and mapping that allows
|
|
47
|
+
# to go from U to V
|
|
48
|
+
return U.view(np.float32).reshape(len(U), 3), I_, RI
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def normals(vertices, indices):
|
|
52
|
+
"""Compute normals over a triangulated surface
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
vertices : ndarray (n,3)
|
|
57
|
+
triangles vertices
|
|
58
|
+
|
|
59
|
+
indices : ndarray (p,3)
|
|
60
|
+
triangles indices
|
|
61
|
+
"""
|
|
62
|
+
# Compact similar vertices
|
|
63
|
+
vertices, indices, mapping = compact(vertices, indices)
|
|
64
|
+
|
|
65
|
+
T = vertices[indices]
|
|
66
|
+
N = np.cross(T[:, 1] - T[:, 0], T[:, 2]-T[:, 0])
|
|
67
|
+
L = np.sqrt(np.sum(N * N, axis=1))
|
|
68
|
+
L[L == 0] = 1.0 # prevent divide-by-zero
|
|
69
|
+
N /= L[:, np.newaxis]
|
|
70
|
+
normals = np.zeros_like(vertices)
|
|
71
|
+
normals[indices[:, 0]] += N
|
|
72
|
+
normals[indices[:, 1]] += N
|
|
73
|
+
normals[indices[:, 2]] += N
|
|
74
|
+
L = np.sqrt(np.sum(normals*normals, axis=1))
|
|
75
|
+
L[L == 0] = 1.0
|
|
76
|
+
normals /= L[:, np.newaxis]
|
|
77
|
+
|
|
78
|
+
return normals[mapping]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) 2014, Nicolas P. Rougier
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
from .normals import normals
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def surface(func, umin=0, umax=2 * np.pi, ucount=64, urepeat=1.0,
|
|
12
|
+
vmin=0, vmax=2 * np.pi, vcount=64, vrepeat=1.0):
|
|
13
|
+
"""
|
|
14
|
+
Computes the parameterization of a parametric surface
|
|
15
|
+
|
|
16
|
+
func: function(u,v)
|
|
17
|
+
Parametric function used to build the surface
|
|
18
|
+
"""
|
|
19
|
+
vtype = [('position', np.float32, 3),
|
|
20
|
+
('texcoord', np.float32, 2),
|
|
21
|
+
('normal', np.float32, 3)]
|
|
22
|
+
itype = np.uint32
|
|
23
|
+
|
|
24
|
+
# umin, umax, ucount = 0, 2*np.pi, 64
|
|
25
|
+
# vmin, vmax, vcount = 0, 2*np.pi, 64
|
|
26
|
+
|
|
27
|
+
vcount += 1
|
|
28
|
+
ucount += 1
|
|
29
|
+
n = vcount * ucount
|
|
30
|
+
|
|
31
|
+
Un = np.repeat(np.linspace(0, 1, ucount, endpoint=True), vcount)
|
|
32
|
+
Vn = np.tile(np.linspace(0, 1, vcount, endpoint=True), ucount)
|
|
33
|
+
U = umin + Un * (umax - umin)
|
|
34
|
+
V = vmin + Vn * (vmax - vmin)
|
|
35
|
+
|
|
36
|
+
vertices = np.zeros(n, dtype=vtype)
|
|
37
|
+
for i, (u, v) in enumerate(zip(U, V)):
|
|
38
|
+
vertices["position"][i] = func(u, v)
|
|
39
|
+
|
|
40
|
+
vertices["texcoord"][:, 0] = Un * urepeat
|
|
41
|
+
vertices["texcoord"][:, 1] = Vn * vrepeat
|
|
42
|
+
|
|
43
|
+
indices = []
|
|
44
|
+
for i in range(ucount - 1):
|
|
45
|
+
for j in range(vcount - 1):
|
|
46
|
+
indices.append(i * (vcount) + j)
|
|
47
|
+
indices.append(i * (vcount) + j + 1)
|
|
48
|
+
indices.append(i * (vcount) + j + vcount + 1)
|
|
49
|
+
indices.append(i * (vcount) + j + vcount)
|
|
50
|
+
indices.append(i * (vcount) + j + vcount + 1)
|
|
51
|
+
indices.append(i * (vcount) + j)
|
|
52
|
+
indices = np.array(indices, dtype=itype)
|
|
53
|
+
vertices["normal"] = normals(vertices["position"],
|
|
54
|
+
indices.reshape(len(indices)//3, 3))
|
|
55
|
+
|
|
56
|
+
return vertices, indices
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
|
|
9
|
+
from .triangulation import Triangulation
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PolygonData(object):
|
|
13
|
+
"""Polygon class for data handling
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
vertices : (Nv, 3) array
|
|
18
|
+
Vertex coordinates. If faces is not specified, then this will instead
|
|
19
|
+
be interpreted as (Nf, 3, 3) array of coordinates.
|
|
20
|
+
edges : (Nv, 2) array
|
|
21
|
+
Constraining edges specified by vertex indices.
|
|
22
|
+
faces : (Nf, 3) array
|
|
23
|
+
Indexes into the vertex array.
|
|
24
|
+
|
|
25
|
+
Notes
|
|
26
|
+
-----
|
|
27
|
+
All arguments are optional.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, vertices=None, edges=None, faces=None):
|
|
31
|
+
self._vertices = vertices
|
|
32
|
+
self._edges = edges
|
|
33
|
+
self._faces = faces
|
|
34
|
+
self._convex_hull = None
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def faces(self):
|
|
38
|
+
"""Return an array (Nf, 3) of vertex indexes, three per triangular
|
|
39
|
+
face in the mesh.
|
|
40
|
+
|
|
41
|
+
If faces have not been computed for this mesh, the function
|
|
42
|
+
computes them.
|
|
43
|
+
If no vertices or faces are specified, the function returns None.
|
|
44
|
+
"""
|
|
45
|
+
if self._faces is None:
|
|
46
|
+
if self._vertices is None:
|
|
47
|
+
return None
|
|
48
|
+
self.triangulate()
|
|
49
|
+
return self._faces
|
|
50
|
+
|
|
51
|
+
@faces.setter
|
|
52
|
+
def faces(self, f):
|
|
53
|
+
"""If vertices and faces are incompatible, this will generate vertices
|
|
54
|
+
from these faces and set them.
|
|
55
|
+
"""
|
|
56
|
+
self._faces = f
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def vertices(self):
|
|
60
|
+
"""Return an array (Nf, 3) of vertices.
|
|
61
|
+
|
|
62
|
+
If only faces exist, the function computes the vertices and
|
|
63
|
+
returns them.
|
|
64
|
+
If no vertices or faces are specified, the function returns None.
|
|
65
|
+
"""
|
|
66
|
+
if self._faces is None:
|
|
67
|
+
if self._vertices is None:
|
|
68
|
+
return None
|
|
69
|
+
self.triangulate()
|
|
70
|
+
return self._vertices
|
|
71
|
+
|
|
72
|
+
@vertices.setter
|
|
73
|
+
def vertices(self, v):
|
|
74
|
+
"""If vertices and faces are incompatible, this will generate faces
|
|
75
|
+
from these vertices and set them.
|
|
76
|
+
"""
|
|
77
|
+
self._vertices = v
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def edges(self):
|
|
81
|
+
"""Return an array (Nv, 2) of vertex indices.
|
|
82
|
+
|
|
83
|
+
If no vertices or faces are specified, the function returns None.
|
|
84
|
+
"""
|
|
85
|
+
return self._edges
|
|
86
|
+
|
|
87
|
+
@edges.setter
|
|
88
|
+
def edges(self, e):
|
|
89
|
+
"""Ensures that all edges are valid."""
|
|
90
|
+
self._edges = e
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def convex_hull(self):
|
|
94
|
+
"""Return an array of vertex indexes representing the convex hull.
|
|
95
|
+
|
|
96
|
+
If faces have not been computed for this mesh, the function
|
|
97
|
+
computes them.
|
|
98
|
+
If no vertices or faces are specified, the function returns None.
|
|
99
|
+
"""
|
|
100
|
+
if self._faces is None:
|
|
101
|
+
if self._vertices is None:
|
|
102
|
+
return None
|
|
103
|
+
self.triangulate()
|
|
104
|
+
return self._convex_hull
|
|
105
|
+
|
|
106
|
+
def triangulate(self):
|
|
107
|
+
"""
|
|
108
|
+
Triangulates the set of vertices and stores the triangles in faces and
|
|
109
|
+
the convex hull in convex_hull.
|
|
110
|
+
"""
|
|
111
|
+
npts = self._vertices.shape[0]
|
|
112
|
+
if np.any(self._vertices[0] != self._vertices[1]):
|
|
113
|
+
# start != end, so edges must wrap around to beginning.
|
|
114
|
+
edges = np.empty((npts, 2), dtype=np.uint32)
|
|
115
|
+
edges[:, 0] = np.arange(npts)
|
|
116
|
+
edges[:, 1] = edges[:, 0] + 1
|
|
117
|
+
edges[-1, 1] = 0
|
|
118
|
+
else:
|
|
119
|
+
# start == end; no wrapping required.
|
|
120
|
+
edges = np.empty((npts-1, 2), dtype=np.uint32)
|
|
121
|
+
edges[:, 0] = np.arange(npts)
|
|
122
|
+
edges[:, 1] = edges[:, 0] + 1
|
|
123
|
+
|
|
124
|
+
tri = Triangulation(self._vertices, edges)
|
|
125
|
+
tri.triangulate()
|
|
126
|
+
return tri.pts, tri.tris
|
|
127
|
+
|
|
128
|
+
def add_vertex(self, vertex):
|
|
129
|
+
"""
|
|
130
|
+
Adds given vertex and retriangulates to generate new faces.
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
vertex : array-like
|
|
135
|
+
The vertex to add.
|
|
136
|
+
"""
|
|
137
|
+
raise NotImplementedError
|
vispy/geometry/rect.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Rect(object):
|
|
5
|
+
"""
|
|
6
|
+
Representation of a rectangular area in a 2D coordinate system.
|
|
7
|
+
|
|
8
|
+
Parameters
|
|
9
|
+
----------
|
|
10
|
+
*args : arguments
|
|
11
|
+
Can be in the form `Rect(x, y, w, h)`, `Rect(pos, size)`, or
|
|
12
|
+
`Rect(Rect)`.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(self, *args, **kwargs):
|
|
16
|
+
self._pos = (0, 0)
|
|
17
|
+
self._size = (0, 0)
|
|
18
|
+
|
|
19
|
+
if len(args) == 1 and isinstance(args[0], Rect):
|
|
20
|
+
self._pos = args[0]._pos[:]
|
|
21
|
+
self._size = args[0]._size[:]
|
|
22
|
+
elif (len(args) == 1 and isinstance(args[0], (list, tuple)) and
|
|
23
|
+
len(args[0]) == 4):
|
|
24
|
+
self._pos = args[0][:2]
|
|
25
|
+
self._size = args[0][2:]
|
|
26
|
+
elif len(args) == 2:
|
|
27
|
+
self._pos = tuple(args[0])
|
|
28
|
+
self._size = tuple(args[1])
|
|
29
|
+
elif len(args) == 4:
|
|
30
|
+
self._pos = tuple(args[:2])
|
|
31
|
+
self._size = tuple(args[2:])
|
|
32
|
+
elif len(args) != 0:
|
|
33
|
+
raise TypeError("Rect must be instantiated with 0, 1, 2, or 4 "
|
|
34
|
+
"non-keyword arguments.")
|
|
35
|
+
|
|
36
|
+
self._pos = kwargs.get('pos', self._pos)
|
|
37
|
+
self._size = kwargs.get('size', self._size)
|
|
38
|
+
|
|
39
|
+
if len(self._pos) != 2 or len(self._size) != 2:
|
|
40
|
+
raise ValueError("Rect pos and size arguments must have 2 "
|
|
41
|
+
"elements.")
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def pos(self):
|
|
45
|
+
return tuple(self._pos)
|
|
46
|
+
|
|
47
|
+
@pos.setter
|
|
48
|
+
def pos(self, p):
|
|
49
|
+
assert len(p) == 2
|
|
50
|
+
self._pos = p
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def size(self):
|
|
54
|
+
return tuple(self._size)
|
|
55
|
+
|
|
56
|
+
@size.setter
|
|
57
|
+
def size(self, s):
|
|
58
|
+
assert len(s) == 2
|
|
59
|
+
self._size = s
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def width(self):
|
|
63
|
+
return self.size[0]
|
|
64
|
+
|
|
65
|
+
@width.setter
|
|
66
|
+
def width(self, w):
|
|
67
|
+
self.size = (w, self.size[1])
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def height(self):
|
|
71
|
+
return self.size[1]
|
|
72
|
+
|
|
73
|
+
@height.setter
|
|
74
|
+
def height(self, h):
|
|
75
|
+
self.size = (self.size[0], h)
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def left(self):
|
|
79
|
+
return self.pos[0]
|
|
80
|
+
|
|
81
|
+
@left.setter
|
|
82
|
+
def left(self, x):
|
|
83
|
+
self.size = (self.size[0] + (self.pos[0] - x), self.size[1])
|
|
84
|
+
self.pos = (x, self.pos[1])
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def right(self):
|
|
88
|
+
return self.pos[0] + self.size[0]
|
|
89
|
+
|
|
90
|
+
@right.setter
|
|
91
|
+
def right(self, x):
|
|
92
|
+
self.size = (x - self.pos[0], self.size[1])
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def bottom(self):
|
|
96
|
+
return self.pos[1]
|
|
97
|
+
|
|
98
|
+
@bottom.setter
|
|
99
|
+
def bottom(self, y):
|
|
100
|
+
self.size = (self.size[0], self.size[1] + (self.pos[1] - y))
|
|
101
|
+
self.pos = (self.pos[0], y)
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def top(self):
|
|
105
|
+
return self.pos[1] + self.size[1]
|
|
106
|
+
|
|
107
|
+
@top.setter
|
|
108
|
+
def top(self, y):
|
|
109
|
+
self.size = (self.size[0], y - self.pos[1])
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def center(self):
|
|
113
|
+
return (self.pos[0] + self.size[0] * 0.5,
|
|
114
|
+
self.pos[1] + self.size[1] * 0.5)
|
|
115
|
+
|
|
116
|
+
@center.setter
|
|
117
|
+
def center(self, value):
|
|
118
|
+
delta_x = value[0] - self.center[0]
|
|
119
|
+
delta_y = value[1] - self.center[1]
|
|
120
|
+
self.pos = (self.pos[0] + delta_x, self.pos[1] + delta_y)
|
|
121
|
+
|
|
122
|
+
def padded(self, padding):
|
|
123
|
+
"""Return a new Rect padded (smaller) by padding on all sides
|
|
124
|
+
|
|
125
|
+
Parameters
|
|
126
|
+
----------
|
|
127
|
+
padding : float
|
|
128
|
+
The padding.
|
|
129
|
+
|
|
130
|
+
Returns
|
|
131
|
+
-------
|
|
132
|
+
rect : instance of Rect
|
|
133
|
+
The padded rectangle.
|
|
134
|
+
"""
|
|
135
|
+
return Rect(pos=(self.pos[0]+padding, self.pos[1]+padding),
|
|
136
|
+
size=(self.size[0]-2*padding, self.size[1]-2*padding))
|
|
137
|
+
|
|
138
|
+
def normalized(self):
|
|
139
|
+
"""Return a Rect covering the same area, but with height and width
|
|
140
|
+
guaranteed to be positive.
|
|
141
|
+
"""
|
|
142
|
+
return Rect(pos=(min(self.left, self.right),
|
|
143
|
+
min(self.top, self.bottom)),
|
|
144
|
+
size=(abs(self.width), abs(self.height)))
|
|
145
|
+
|
|
146
|
+
def flipped(self, x=False, y=True):
|
|
147
|
+
"""Return a Rect with the same bounds but with axes inverted
|
|
148
|
+
|
|
149
|
+
Parameters
|
|
150
|
+
----------
|
|
151
|
+
x : bool
|
|
152
|
+
Flip the X axis.
|
|
153
|
+
y : bool
|
|
154
|
+
Flip the Y axis.
|
|
155
|
+
|
|
156
|
+
Returns
|
|
157
|
+
-------
|
|
158
|
+
rect : instance of Rect
|
|
159
|
+
The flipped rectangle.
|
|
160
|
+
"""
|
|
161
|
+
pos = list(self.pos)
|
|
162
|
+
size = list(self.size)
|
|
163
|
+
for i, flip in enumerate((x, y)):
|
|
164
|
+
if flip:
|
|
165
|
+
pos[i] += size[i]
|
|
166
|
+
size[i] *= -1
|
|
167
|
+
return Rect(pos, size)
|
|
168
|
+
|
|
169
|
+
def __eq__(self, r):
|
|
170
|
+
if not isinstance(r, Rect):
|
|
171
|
+
return False
|
|
172
|
+
return (np.all(np.equal(r.pos, self.pos)) and
|
|
173
|
+
np.all(np.equal(r.size, self.size)))
|
|
174
|
+
|
|
175
|
+
def __add__(self, a):
|
|
176
|
+
"""Return this Rect translated by *a*."""
|
|
177
|
+
return self._transform_out(self._transform_in()[:, :2] + a[:2])
|
|
178
|
+
|
|
179
|
+
def contains(self, x, y):
|
|
180
|
+
"""Query if the rectangle contains points
|
|
181
|
+
|
|
182
|
+
Parameters
|
|
183
|
+
----------
|
|
184
|
+
x : float
|
|
185
|
+
X coordinate.
|
|
186
|
+
y : float
|
|
187
|
+
Y coordinate.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
contains : bool
|
|
192
|
+
True if the point is within the rectangle.
|
|
193
|
+
"""
|
|
194
|
+
return (x >= self.left and x <= self.right and
|
|
195
|
+
y >= self.bottom and y <= self.top)
|
|
196
|
+
|
|
197
|
+
def __repr__(self):
|
|
198
|
+
return "<Rect (%g, %g) (%g, %g)>" % (self.pos + self.size)
|
|
199
|
+
|
|
200
|
+
def _transform_in(self):
|
|
201
|
+
"""Return array of coordinates that can be mapped by Transform
|
|
202
|
+
classes.
|
|
203
|
+
"""
|
|
204
|
+
return np.array([
|
|
205
|
+
[self.left, self.bottom, 0, 1],
|
|
206
|
+
[self.right, self.top, 0, 1]])
|
|
207
|
+
|
|
208
|
+
def _transform_out(self, coords):
|
|
209
|
+
"""Return a new Rect from coordinates mapped after _transform_in()."""
|
|
210
|
+
return Rect(pos=coords[0, :2], size=coords[1, :2]-coords[0, :2])
|
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
import numpy as np
|
|
5
|
+
from numpy.testing import assert_allclose
|
|
6
|
+
|
|
7
|
+
from vispy.testing import assert_raises
|
|
8
|
+
from vispy.geometry import resize
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_resize():
|
|
12
|
+
"""Test image resizing algorithms"""
|
|
13
|
+
assert_raises(ValueError, resize, np.zeros(3), (3, 3))
|
|
14
|
+
assert_raises(ValueError, resize, np.zeros((3, 3)), (3,))
|
|
15
|
+
assert_raises(ValueError, resize, np.zeros((3, 3)), (4, 4), kind='foo')
|
|
16
|
+
for kind, tol in (('nearest', 1e-5), ('linear', 2e-1)):
|
|
17
|
+
shape = np.array((10, 11, 3))
|
|
18
|
+
data = np.random.RandomState(0).rand(*shape)
|
|
19
|
+
assert_allclose(data, resize(data, shape[:2], kind=kind),
|
|
20
|
+
rtol=1e-5, atol=1e-5)
|
|
21
|
+
# this won't actually be that close for bilinear interp
|
|
22
|
+
assert_allclose(data, resize(resize(data, 2 * shape[:2], kind=kind),
|
|
23
|
+
shape[:2], kind=kind), atol=tol, rtol=tol)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
import numpy as np
|
|
5
|
+
from numpy.testing import assert_array_equal, assert_allclose
|
|
6
|
+
|
|
7
|
+
from vispy.testing import run_tests_if_main
|
|
8
|
+
from vispy.geometry import (create_box, create_cube, create_cylinder,
|
|
9
|
+
create_sphere, create_plane)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_box():
|
|
13
|
+
"""Test box function"""
|
|
14
|
+
vertices, filled, outline = create_box()
|
|
15
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(filled))
|
|
16
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(outline))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_cube():
|
|
20
|
+
"""Test cube function"""
|
|
21
|
+
vertices, filled, outline = create_cube()
|
|
22
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(filled))
|
|
23
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(outline))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_sphere():
|
|
27
|
+
"""Test sphere function"""
|
|
28
|
+
md = create_sphere(rows=10, cols=20, radius=10, method='latitude')
|
|
29
|
+
radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
|
|
30
|
+
assert radii.dtype.type is np.float32
|
|
31
|
+
assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
|
|
32
|
+
md = create_sphere(subdivisions=5, radius=10, method='ico')
|
|
33
|
+
radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
|
|
34
|
+
assert radii.dtype.type is np.float32
|
|
35
|
+
assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
|
|
36
|
+
md = create_sphere(rows=20, cols=20, depth=20, radius=10, method='cube')
|
|
37
|
+
radii = np.sqrt((md.get_vertices() ** 2).sum(axis=1))
|
|
38
|
+
assert radii.dtype.type is np.float32
|
|
39
|
+
assert_allclose(radii, np.ones_like(radii) * 10, atol=1e-06)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_cylinder():
|
|
43
|
+
"""Test cylinder function"""
|
|
44
|
+
md = create_cylinder(10, 20, radius=[10, 10])
|
|
45
|
+
radii = np.sqrt((md.get_vertices()[:, :2] ** 2).sum(axis=1))
|
|
46
|
+
assert_allclose(radii, np.ones_like(radii) * 10)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_plane():
|
|
50
|
+
"""Test plane function"""
|
|
51
|
+
vertices, filled, outline = create_plane()
|
|
52
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(filled))
|
|
53
|
+
assert_array_equal(np.arange(len(vertices)), np.unique(outline))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
3
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from numpy.testing import assert_array_equal
|
|
7
|
+
|
|
8
|
+
from vispy.testing import run_tests_if_main
|
|
9
|
+
from vispy.geometry.meshdata import MeshData
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_meshdata():
|
|
13
|
+
"""Test meshdata Class
|
|
14
|
+
It's a unit square cut in two triangular element
|
|
15
|
+
"""
|
|
16
|
+
square_vertices = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]],
|
|
17
|
+
dtype=np.float64)
|
|
18
|
+
square_faces = np.array([[0, 1, 2], [0, 2, 3]], dtype=np.uint8)
|
|
19
|
+
square_normals = np.array([[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]],
|
|
20
|
+
dtype=np.float64)
|
|
21
|
+
square_edges = np.array([[0, 1], [0, 2], [0, 3], [1, 2], [2, 3]],
|
|
22
|
+
dtype=np.uint8)
|
|
23
|
+
|
|
24
|
+
mesh = MeshData(vertices=square_vertices, faces=square_faces)
|
|
25
|
+
# test vertices and faces assignement
|
|
26
|
+
assert_array_equal(square_vertices, mesh.get_vertices())
|
|
27
|
+
assert_array_equal(square_faces, mesh.get_faces())
|
|
28
|
+
# test normals calculus
|
|
29
|
+
assert_array_equal(square_normals, mesh.get_vertex_normals())
|
|
30
|
+
# test edge calculus
|
|
31
|
+
assert_array_equal(square_edges, mesh.get_edges())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_vertex_normals_indexed_none():
|
|
35
|
+
dtype_float = np.float32
|
|
36
|
+
dtype_int = np.int64
|
|
37
|
+
vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
|
|
38
|
+
dtype=dtype_float)
|
|
39
|
+
faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
|
|
40
|
+
mesh = MeshData(vertices=vertices, faces=faces)
|
|
41
|
+
vertex_normals_unnormalized = np.array(
|
|
42
|
+
[[-1, -1, -1], [0, -1, -1], [-1, 0, -1], [-1, -1, 0]],
|
|
43
|
+
dtype=dtype_float)
|
|
44
|
+
norms = np.sqrt((vertex_normals_unnormalized**2).sum(axis=1,
|
|
45
|
+
keepdims=True))
|
|
46
|
+
expected_vertex_normals = vertex_normals_unnormalized / norms
|
|
47
|
+
|
|
48
|
+
computed_vertex_normals = mesh.get_vertex_normals(indexed=None)
|
|
49
|
+
|
|
50
|
+
assert_array_equal(expected_vertex_normals, computed_vertex_normals)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_vertex_normals_indexed_faces():
|
|
54
|
+
dtype_float = np.float32
|
|
55
|
+
dtype_int = np.int64
|
|
56
|
+
vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
|
|
57
|
+
dtype=dtype_float)
|
|
58
|
+
faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
|
|
59
|
+
mesh = MeshData(vertices=vertices, faces=faces)
|
|
60
|
+
vertex_normals_unnormalized = np.array(
|
|
61
|
+
[[-1, -1, -1], [0, -1, -1], [-1, 0, -1], [-1, -1, 0]],
|
|
62
|
+
dtype=dtype_float)
|
|
63
|
+
norms = np.sqrt((vertex_normals_unnormalized**2).sum(axis=1,
|
|
64
|
+
keepdims=True))
|
|
65
|
+
vertex_normals = vertex_normals_unnormalized / norms
|
|
66
|
+
expected_vertex_normals = vertex_normals[faces]
|
|
67
|
+
|
|
68
|
+
computed_vertex_normals = mesh.get_vertex_normals(indexed="faces")
|
|
69
|
+
|
|
70
|
+
assert_array_equal(expected_vertex_normals, computed_vertex_normals)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_face_normals_indexed_none():
|
|
74
|
+
dtype_float = np.float32
|
|
75
|
+
dtype_int = np.int64
|
|
76
|
+
vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
|
|
77
|
+
dtype=dtype_float)
|
|
78
|
+
faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
|
|
79
|
+
mesh = MeshData(vertices=vertices, faces=faces)
|
|
80
|
+
expected_face_normals = np.array([[0, 0, -1], [-1, 0, 0], [0, -1, 0]],
|
|
81
|
+
dtype=dtype_float)
|
|
82
|
+
|
|
83
|
+
computed_face_normals = mesh.get_face_normals(indexed=None)
|
|
84
|
+
|
|
85
|
+
assert_array_equal(expected_face_normals, computed_face_normals)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_face_normals_indexed_faces():
|
|
89
|
+
dtype_float = np.float32
|
|
90
|
+
dtype_int = np.int64
|
|
91
|
+
vertices = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
|
|
92
|
+
dtype=dtype_float)
|
|
93
|
+
faces = np.array([[0, 2, 1], [0, 3, 2], [0, 1, 3]], dtype=dtype_int)
|
|
94
|
+
mesh = MeshData(vertices=vertices, faces=faces)
|
|
95
|
+
expected_face_normals = np.array([
|
|
96
|
+
[[0, 0, -1], [0, 0, -1], [0, 0, -1]],
|
|
97
|
+
[[-1, 0, 0], [-1, 0, 0], [-1, 0, 0]],
|
|
98
|
+
[[0, -1, 0], [0, -1, 0], [0, -1, 0]]],
|
|
99
|
+
dtype=dtype_float)
|
|
100
|
+
|
|
101
|
+
computed_face_normals = mesh.get_face_normals(indexed="faces")
|
|
102
|
+
|
|
103
|
+
assert_array_equal(expected_face_normals, computed_face_normals)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
run_tests_if_main()
|