Sanya Pushkar
Sanya Pushkar

Reputation: 190

Distance to convex hull from point in 3d in Python

I am looking for distance from a point to a ConvexHull object in 3D in Python.

I found the questions that solve the problem in 2D: Distance to convexHull and Computing the distance to a convex hull

But those do not contain a solution for 3D.

import numpy as np
from scipy.spatial import ConvexHull

mat = np.random.rand(100,3)
hull = ConvexHull(mat)
points = np.random.rand(10,3)

It would be great to have a function

dist(hull,points)

that returns a list of distances from the points to the convex hull, having different signs for points within and outside of the convex hull.

Upvotes: 1

Views: 1897

Answers (2)

Nikolay Markov
Nikolay Markov

Reputation: 332

We can use PyGEL 3d python library for this.

First, install it with pip install PyGEL3D

Second, the code:

import numpy as np
from scipy.spatial import ConvexHull
from pygel3d import hmesh

mat = np.random.rand(100, 3)
hull = ConvexHull(mat)
points = np.random.rand(10, 3)

def dist(hull, points):
    # Construct PyGEL Manifold from the convex hull
    m = hmesh.Manifold()
    for s in hull.simplices:
        m.add_face(hull.points[s])

    dist = hmesh.MeshDistance(m)
    res = []
    for p in points:
        # Get the distance to the point
        # But don't trust its sign, because of possible
        # wrong orientation of mesh face
        d = dist.signed_distance(p)

        # Correct the sign with ray inside test
        if dist.ray_inside_test(p):
            if d > 0:
                d *= -1
        else:
            if d < 0:
                d *= -1
        res.append(d)
    return np.array(res)

print(dist(hull, points))

Upvotes: 3

Ashish Madkaikar
Ashish Madkaikar

Reputation: 129

from scipy.spatial import distance_matrix, distance
import numpy as np
#point from which distance is to be calculated
reference_point = np.array([1.28442705, 6.75384521e-01, 9.99999997e-07]).reshape(1,3)

#any point/points from convexhull
p = np.array([[1.2844270500,6.75384521e01,9.9999999707], 
[1.2743135700,7.84526169e01,9.9999999707],[1.2844270500,6.7538452101,8.7603122001]]) 

distance_matrix = distance.cdist(reference_point, p, 'euclidean')

Upvotes: -2

Related Questions