简体   繁体   English

Python中3d点到凸包的距离

[英]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.我正在 Python 中寻找 3D 中从点到 ConvexHull 对象的距离。

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.但那些不包含 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.返回从点到凸包的距离列表,凸包内外的点具有不同的符号。

We can use PyGEL 3d python library for this.我们可以为此使用PyGEL 3d python 库。

First, install it with pip install PyGEL3D首先,使用pip install PyGEL3D安装它

Second, the code:二、代码:

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM