Расстояние до выпуклой оболочки от точки в 3d в Python - PullRequest
1 голос
/ 01 апреля 2019

Я ищу расстояние от точки до объекта 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)

, который возвращает список расстояний от точек до выпуклой оболочки, имеющих разные знаки для точек внутри и снаружи выпуклой оболочки.

1 Ответ

1 голос
/ 03 апреля 2019

Мы можем использовать для этого PyGEL 3d библиотеку питонов.

Сначала установите его с помощью 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))
...