Расстояние до выпуклой оболочки от точки в 3d в Python

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

@meowgoesthedog Я процитировал другой вопрос и уточнил: мне нужно 3D-решение, а оно обеспечивает только 2D.

Sanya Pushkar 12.04.2019 19:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
960
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для этого мы можем использовать 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')

Это не мера расстояния, имеющая знак в зависимости от того, находится ли точка отсчета внутри выпуклой оболочки или вне ее. Более того, «расстояние от точки до выпуклой оболочки» подразумевает одно число: кратчайшее расстояние.

Sanya Pushkar 22.01.2020 01:34

Другие вопросы по теме