我在二维坐标系中有一个轴对齐的矩形,其由左下角点和右上角点表示,以及一个可能在矩形内外的点。我想找到该点到矩形最近点的距离,无论它是否在矩形内部。当然,我可以使用9种不同结果的开关语句来解决问题,但我希望有一种更简洁的解决方案。
此外,我已经找到了多个解决这个问题的方案(比如这一个),但所有这些方法都会在点在包围盒内时将距离计算为0,而我不想要这样的结果。
此外,我已经找到了多个解决这个问题的方案(比如这一个),但所有这些方法都会在点在包围盒内时将距离计算为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
function distance(rect, p) {
var dx = Math.max(rect.min.x - p.x, 0, p.x - rect.max.x);
var dy = Math.max(rect.min.y - p.y, 0, p.y - rect.max.y);
var distance = Math.sqrt(dx*dx + dy*dy)
if (distance == 0) {
distance = Math.min(p.x - rect.min.x, rect.max.x - p.x, p.y - rect.min.y, rect.max.y - p.y)
}
return distance
}
这样怎么样?(第一部分“借鉴”了MultiRRomeros的answer)
function distance(rect, p) {
// outside
var dxo = Math.max(rect.min.x - p.x, 0, p.x - rect.max.x);
var dyo = Math.max(rect.min.y - p.y, 0, p.y - rect.max.y);
var hypothenuse = Math.sqrt(dxo*dxo + dyo*dyo);
// inside
var dxi = Math.min(rect.max.x - p.x, p.x - rect.min.x);
var dyi = Math.min(rect.max.y - p.y, p.y - rect.min.y);
return hypothenuse > 0 ? hypothenuse : Math.min(dxi, dyi);
}
point
在矩形内部时,hypothenuse
将为0
,因为dxo
和dxy
也与0
进行比较。所以当点在矩形内部时,0将是最大的数。即rect.min.x - p.x
等将为0
或更小。 - Sani Huttunen