def bbox(array, point, radius):
a = array[np.where(np.logical_and(array[:, 0] >= point[0] - radius, array[:, 0] <= point[0] + radius))]
b = a[np.where(np.logical_and(a[:, 1] >= point[1] - radius, a[:, 1] <= point[1] + radius))]
c = b[np.where(np.logical_and(b[:, 2] >= point[2] - radius, b[:, 2] <= point[2] + radius))]
return c
而另一个代码为距离计算:
def hausdorff(surface_a, surface_b):
# Taking two arrays as input file, the function is searching for the Hausdorff distane of "surface_a" to "surface_b"
dists = []
l = len(surface_a)
for i in xrange(l):
# walking through all the points of surface_a
dist_min = 1000.0
radius = 0
b_mod = np.empty(shape=(0, 0, 0))
# increasing the cube size around the point until the cube contains at least 1 point
while b_mod.shape[0] == 0:
b_mod = bbox(surface_b, surface_a[i], radius)
radius += 1
# to avoid getting false result (point is close to the edge, but along an axis another one is closer),
# increasing the size of the cube
b_mod = bbox(surface_b, surface_a[i], radius * math.sqrt(3))
for j in range(len(b_mod)):
# walking through the small number of points to find the minimum distance
dist = np.linalg.norm(surface_a[i] - b_mod[j])
if dist_min > dist:
dist_min = dist
dists.append(dist_min)
return np.max(dists)
2条答案
按热度按时间y1aodyip1#
我是纽比在这里,但面临着同样的挑战,并试图直接在三维水平上攻击它。
下面是我做的函数:
输入必须是numpy.array,但其余部分可以直接使用。
我有8000 vs5000三维点,这运行了几分钟,但在最后它得到了你正在寻找的距离。
然而,这是检查两点之间的距离,而不一定是两条曲线的距离。(两者都不是网格)。
编辑(2015年11月26日):
最近完成了这个代码的微调版本。现在它被分成两部分。
首先是处理抓取给定点周围的框,并取所有半径。我认为这是一个聪明的方法,可以减少需要检查的点数。
而另一个代码为距离计算:
guz6ccqo2#
如果有人在多年后仍在寻找这个问题的答案......自2016年以来,scipy现在包括了一个函数来计算3D中的豪斯多夫距离:
scipy.spatial.distance.directed_hausdorff