A python wrapper around a subset of the ncollide rust library
Project description
A python wrapper around a subset of the ncollide rust library
Free software: MIT License
Documentation: https://ncollpyde.readthedocs.io.
Install
pip install ncollpyde
Pre-built wheels are available for Linux, MacOS, and Windows. If you have a stable rust compiler, you should also be able to install from source.
Features
Checking whether points are inside a volume defined by a triangular mesh
Checking the intersection of line segments with the mesh
Get the (signed) distance from points to the boundary of a mesh
Usage
This library implements most of its functionality through the Volume class, instantiated from an array of vertices, and an array of triangles as indices into the vertex array.
# get an array of vertices and triangles which refer to those points
import meshio
mesh = meshio.read("meshes/teapot.stl")
# use this library
from ncollpyde import Volume
volume = Volume(mesh.points, mesh.cells_dict["triangle"])
# or, for convenience
volume = Volume.from_meshio(mesh)
# containment checks: singular and multiple
assert [-2.30, -4.15, 1.90] in volume
assert np.array_equal(
volume.contains(
[
[-2.30, -4.15, 1.90],
[-0.35, -0.51, 7.61],
]
),
[True, False]
)
# line segment intersection
seg_idxs, intersections, is_backface = volume.intersections(
[[-10, -10, -10], [0, 0, 3], [10, 10, 10]],
[[0, 0, 3], [10, 10, 10], [20, 20, 20]],
)
assert np.array_equal(seg_idxs, [0, 1]) # idx 2 does not intersect
assert np.array_equal(seg_idxs, [0, 1])
assert np.allclose(
intersections,
[
[-2.23347309, -2.23347309, 0.09648498],
[ 3.36591285, 3.36591285, 5.356139],
],
)
assert np.array_equal(
is_backface,
[False, True],
)
# distance from boundary (negative means internal)
assert np.array_equal(
volume.distance([[10, 10, 10], [0, 0, 3]]),
[10.08592464, -2.99951118],
)
See the API docs for more advanced usage.
Known issues
Performance gains for multi-threaded queries are underwhelming, especially for ray intersections: see this issue
- Very rare false positives for containment
Due to a bug in the underlying library
Only happens when the point is outside the mesh and fires a ray which touches a single edge or vertex of the mesh.
Also affects is_backface result for ray intersection checks
manylinux-compatible wheels are built on CI but not necessarily in your local environment. Always allow CI to deploy the wheels.
If you are installing from a source distribution rather than a wheel, you need a compatible rust toolchain
ncollpyde v0.11 was the last to support meshio < 4.0.
Acknowledgements
Thanks to top users Philipp Schlegel (check out navis!) and Nik Drummond for their help in debugging and expanding ncollpyde ‘s functionality.
Thanks also to pyo3/ maturin developers @konstin and @messense for taking an interest in the project and helping along the way.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for ncollpyde-0.17.3-cp36-abi3-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b5ac507a7401dee248d3b59a4211a8a0ae1f8c021e8c85a7ba07461bb908ec41 |
|
MD5 | fc9d89f0c504e147b81bfb2b06bfd08d |
|
BLAKE2b-256 | 87a8365a1e5fc7fa07a58d78e1cbee62177a153cf4fa9cd66139c0b1c306d6e0 |
Hashes for ncollpyde-0.17.3-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b68041b69a3d00f9e85ddc7c16ba488b0ca7b7fe5beca1266d6c146c18f2424b |
|
MD5 | feb75f979197557c439eb7bc2e49d0c3 |
|
BLAKE2b-256 | e2a54f17ee3bc88ea2e0888c017ec722cfbc25bea64d15a8cb8d0bbcfe4f22bb |
Hashes for ncollpyde-0.17.3-cp36-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e020dce6a2f05f9cba3a9a307c2674bba8d1dc9ce30701f282db1f4481c3f9e7 |
|
MD5 | f3a8441c7a1cb5daf6fa3d9b08255b7c |
|
BLAKE2b-256 | ce50d0c8adaa5b3f9298b49219f335b15c85f157f7c298d14487e66e302e37a5 |