gpt4 book ai didi

python - 检查一个点是否在 ConvexHull 中?

转载 作者:行者123 更新时间:2023-12-01 01:42:04 25 4
gpt4 key购买 nike

我无法理解如何计算 n 维点是否在 n 维 ConvexHull 内。

这里提出了一个非常相似的问题(相同): What's an efficient way to find if a point lies in the convex hull of a point cloud?

但是,答案让我感到困惑,或者似乎对我不起作用,我不知道为什么。

def in_hull(p, hull):
""" Copied and from the Top Original answer """
from scipy.spatial import Delaunay
if not isinstance(hull,Delaunay):
hull = Delaunay(hull)

return hull.find_simplex(p)>=0

这个函数给我带来了很多错误或不需要的结果,而我正在使用它。然而,在调试时,我编写了一个简单的脚本来测试一些明显的期望:

If I construct a ConvexHull out of a group of points, when I check that group of points for "membership", they should all be "members".

results_all = []
for _ in range(5000):
cloud = np.random.rand(5000, 2)
result = in_hull(cloud, cloud)
results_all.append(np.all(result))

arr = np.array(results_all)
print(np.sum(np.logical_not(arr)))

虽然很少见,但这似乎在随机生成的数据上失败(5000 个数据中的 3 个),但在实际数据上问题更大。我所说的失败的意思是,我实际上遇到了一些情况,其中并非所有点都被视为成员。

我是不是做错了什么?或者也许完全是误解?我现在很困惑,所以希望能解释一下正在发生的事情。

最后,我想要;给定一个 ConvexHull,在前一阶段计算;能够确定点是否位于船体内。

最佳答案

对于几乎平坦的单纯形(三角形),这似乎是 Delaunay 对象的 find_simplex 方法的边缘情况问题。

下面是一个代码,用于查找并绘制只有 3 点的错误案例:

import matplotlib.pylab as plt
from scipy.spatial import Delaunay
from scipy.spatial import delaunay_plot_2d

for _ in range(5000):
cloud = np.random.rand(3, 2)

tri = Delaunay(cloud)

if np.any( tri.find_simplex(cloud)<0 ):
print('break at', _)

delaunay_plot_2d(tri);
id_break = np.where(tri.find_simplex(cloud)<0)
plt.plot( *cloud[id_break].ravel(), 'or' );
break

faulty example

提出的另一种方法here看起来效果很好:

hull = ConvexHull(cloud)

def point_in_hull(point, hull, tolerance=1e-12):
return all(
(np.dot(eq[:-1], point) + eq[-1] <= tolerance)
for eq in hull.equations)

[ point_in_hull(point, hull) for point in cloud ]
# [True, True, True]

关于python - 检查一个点是否在 ConvexHull 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51771248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com