gpt4 book ai didi

algorithm - 如何计算一个点到矩形最近点的距离?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:36:16 33 4
gpt4 key购买 nike

我在 2d 坐标系中有一个轴对齐的矩形,由左下角的点和右上角的点以及可能位于矩形内部或外部的点表示。我想找到点到矩形最近点的距离,不管它是否在矩形内。当然,我可以只写一个有 9 种不同结果的 switch case,但我希望有一个更优雅的解决方案。
此外,我找到了解决此问题的多种解决方案(如 this one ),但如果点在框内,所有这些解决方案都会将距离计算为 0,这是我不想要的。

最佳答案

我的回答比其他人稍微长一些,但它来自不同的角度。

关键不在于你是否在矩形内,而是你是否在通过取矩形的边并无限延伸它们所定义的走廊内的任何地方(想象一个无限加号, 以矩形为中心)。

如果它在那些走廊内,那么最近的距离与其中一条边正交。

如果在外面,那么最近的距离就是到最近的角的距离。

您的代码可能如下所示:

nearest_distance(rectangle, point):
d_top = abs(rectangle.top - point.y)
d_bottom = abs(rectangle.bottom - point.y)
corner_y = d_top < d_bottom ? rectangle.top : rectangle.bottom

d_left = abs(rectangle.left - point.x)
d_right = abs(rectangle.right - point.x)
corner_x = d_left < d_right ? rectangle.left : rectangle.right

d_cx = corner_x - point.x
d_cy = corner_y - point.y
d_corner = sqrt(d_cx*d_cx + d_cy*d_cy)

return min(d_top, d_bottom, d_left, d_right, d_corner)

如果您想尝试保存一个 sqrt,您可以检查您是在走廊内还是在走廊外。在这种情况下,您可以按如下方式重新排列它:

nearest_distance(rectangle, point):
d_top = abs(rectangle.top - point.y)
d_bottom = abs(rectangle.bottom - point.y)
d_left = abs(rectangle.left - point.x)
d_right = abs(rectangle.right - point.x)

r = rectangle # just to make the next line neater
if r.left <= point.x <= r.right or r.bottom <= point.y <= r.top:
return min(d_top, d_bottom, d_left, d_right)
else:
corner_y = d_top < d_bottom ? rectangle.top : rectangle.bottom
corner_x = d_left < d_right ? rectangle.left : rectangle.right

d_cx = corner_x - point.x
d_cy = corner_y - point.y
d_corner = sqrt(d_cx*d_cx + d_cy*d_cy)
return d_corner

关于algorithm - 如何计算一个点到矩形最近点的距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004232/

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