问题描述
我需要确定我的某些点是在凸包的内部还是外部,而我使用的是这个答案:(enter link description here)。
但是当我测试它时,返回的数组有点令人困惑。例如,如果我创建两个相同的数组,请使用其中一个创建一个外壳,然后测试第二个点是否在该外壳中,我得到以下信息:
from scipy.spatial import Delaunay
pts_outer = np.array([[0,0],[0,5],[5,5]])
pts_inner = pts_outer
hull = Delaunay(pts_outer)
hull.find_simplex(pts_inner)
Out[29]: array([0,1,1],dtype=int32)
该方法的文档只说它返回:“包含每个点的单纯形的索引。三角剖分之外的点的值为-1”。。
我了解到1
是点在外壳内部,-1
是点在外部,但是0是多少?它位于船体边界上吗?但是,为什么只有两点呢?应该是所有人。
如果我稍微修改测试数组:
pts_inner = np.array([[0,-1],5]])
hull.find_simplex(pts_inner)
Out[31]: array([ 0,-1,dtype=int32)
前两个点具有相同的索引,第三个点按计划具有 -1 ,但由于某种原因,尽管外壳和该点都完全相同,但第四个点已更改为0一样。
有人知道如何解释这些结果吗?
解决方法
tl; dr:返回包含该点的 a 三角形的索引。如果包含多个三角形,它并不总是选择相同的索引。
我认为您误解了“它返回:包含每个点的单纯形的索引。三角剖分之外的点的值为-1。”
我的解释是Delaunay(pts_outer)
用two triangles分别用索引0和1来三角化矩形。然后hull.find_simplex(pts_inner)
退回[0,1,1]
意味着您的前两个点在三角形0中,第二个点在三角形1中。
最后,find_simplex
现在告诉您您的点[5,5]
在三角形1中有点奇怪。但这并不是不正确的,因为点[5,5]
在两个三角形中。