Skip to main content

Relatively efficient distance and closest point from a set of points to a set of line segments.

Project description

Fast point-to-edge distances

Computes the distance and closest point from a set of points to a set of line segments relatively efficiently. The code is fast because:

  • It is written in C++ (as a header-only library). It is exposed to Python with Cython.
  • It uses axis-aligned bounding boxes for culling or in a hierarchy.

Example

The Python function signatures are:

def SlowDistances( Real[:,::1] P, Real[:,::1] Points, Index[:,::1] LineSegments ):
def AABBDistances( Real[:,::1] P, Real[:,::1] Points, Index[:,::1] LineSegments ):
def AABBTreeDistances( Real[:,::1] P, Real[:,::1] Points, Index[:,::1] LineSegments ):
    '''
    Given:
        P: An N-by-2 array of (2D) points whose distance to query.
        Points: A K-by-2 array of (2D) points involved in the line segments.
        LineSegments: An E-by-2 array of pairs of indices into `Points`, one for each line segment.
    Returns:
        A length-N array of distances, one for each point in `P`, from that point to the line segments.
        A length-N array of closest points, one for each point in `P`, from that point to the line segments.
    '''

For example:

import edge_distance_aabb

## Create some edges
Points = np.array( [ [ 0, 0 ], [ 1, 1 ], [ 2, 0 ] ], float )
LineSegments = np.array( [ [ 0, 1 ], [ 1, 2 ] ] )
print( "Points:", Points )
print( "LineSegments:", LineSegments )

## We want the distance to the following points
P = np.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 2, 1 ], [ 2, 0 ] ], float )
print( "P:", P )

## Compute distances and closest points using AABB to cull edges.
distances, closest_points = edge_distance_aabb.AABBDistances( P, Points, LineSegments )
print( "distances (should be: 0, √2/2, √2/2, √2/2, 0):", distances )
print( "closest_points (should be: (0,0), (½,½), (½ or 1½,½), (1½,½), (2,0) ):", closest_points )

Installation

  1. From PyPI:
pip install edge_distance_aabb
  1. From GitHub:
pip install git+https://github.com/yig/edge_distance_aabb.git
  1. By copying edge_distance_aabb.pyx and edge_distance_aabb.h into your directory and running cythonize --build edge_distance_aabb.pyx.

Dependencies

numpy and Cython

Distribution

python3 -m build
twine upload dist/*

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edge_distance_aabb-1.0.1.tar.gz (118.6 kB view hashes)

Uploaded Source

Built Distributions

edge_distance_aabb-1.0.1-pp39-pypy39_pp73-win_amd64.whl (72.2 kB view hashes)

Uploaded PyPy Windows x86-64

edge_distance_aabb-1.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (104.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (103.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (74.2 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-pp38-pypy38_pp73-win_amd64.whl (72.1 kB view hashes)

Uploaded PyPy Windows x86-64

edge_distance_aabb-1.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (104.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (103.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (74.3 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-pp37-pypy37_pp73-win_amd64.whl (72.1 kB view hashes)

Uploaded PyPy Windows x86-64

edge_distance_aabb-1.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (104.8 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (103.6 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (74.3 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-cp311-cp311-win_amd64.whl (76.7 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

edge_distance_aabb-1.0.1-cp311-cp311-win32.whl (66.5 kB view hashes)

Uploaded CPython 3.11 Windows x86

edge_distance_aabb-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

edge_distance_aabb-1.0.1-cp311-cp311-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

edge_distance_aabb-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (565.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (542.4 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl (86.5 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-cp310-cp310-win_amd64.whl (77.3 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

edge_distance_aabb-1.0.1-cp310-cp310-win32.whl (66.9 kB view hashes)

Uploaded CPython 3.10 Windows x86

edge_distance_aabb-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

edge_distance_aabb-1.0.1-cp310-cp310-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

edge_distance_aabb-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (547.5 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (523.2 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl (89.5 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-cp39-cp39-win_amd64.whl (78.3 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

edge_distance_aabb-1.0.1-cp39-cp39-win32.whl (67.7 kB view hashes)

Uploaded CPython 3.9 Windows x86

edge_distance_aabb-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

edge_distance_aabb-1.0.1-cp39-cp39-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

edge_distance_aabb-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (552.6 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (529.9 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl (87.9 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-cp38-cp38-win_amd64.whl (78.2 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

edge_distance_aabb-1.0.1-cp38-cp38-win32.whl (67.6 kB view hashes)

Uploaded CPython 3.8 Windows x86

edge_distance_aabb-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

edge_distance_aabb-1.0.1-cp38-cp38-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

edge_distance_aabb-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (559.5 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (533.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl (86.3 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

edge_distance_aabb-1.0.1-cp37-cp37m-win_amd64.whl (77.1 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

edge_distance_aabb-1.0.1-cp37-cp37m-win32.whl (66.6 kB view hashes)

Uploaded CPython 3.7m Windows x86

edge_distance_aabb-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

edge_distance_aabb-1.0.1-cp37-cp37m-musllinux_1_1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

edge_distance_aabb-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (531.5 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

edge_distance_aabb-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (500.8 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

edge_distance_aabb-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl (86.5 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page