Я ищу расстояние от точки до объекта ConvexHull в 3D в Python.
Я нашел вопросы, которые решают проблему в 2D: Расстояние до выпуклого корпуса и Вычисление расстояния до выпуклой оболочки
Но в них нет решения для 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)
Было бы здорово иметь функцию
dist(hull,points)
который возвращает список расстояний от точек до выпуклой оболочки с разными знаками для точек внутри и снаружи выпуклой оболочки.
@meowgoesthedog Я процитировал другой вопрос и уточнил: мне нужно 3D-решение, а оно обеспечивает только 2D.






Для этого мы можем использовать 3D-библиотеку Python PyGEL.
Сначала установите его с помощью pip install PyGEL3D
Во-вторых, код:
import numpy as np
from scipy.spatial import ConvexHull
from PyGEL3D import gel
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 = gel.Manifold()
for s in hull.simplices:
m.add_face(hull.points[s])
dist = gel.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))
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')
Это не мера расстояния, имеющая знак в зависимости от того, находится ли точка отсчета внутри выпуклой оболочки или вне ее. Более того, «расстояние от точки до выпуклой оболочки» подразумевает одно число: кратчайшее расстояние.
Возможный дубликат Расстояние до выпуклого корпуса