[英]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.