如何找到矩形周长中最近的点到给定点?

kik*_*ito 6 math geometry rectangles bounding-box

这是一个与语言无关的问题.给定矩形的尺寸l,t,w,h(左,顶部,宽度,高度)和一个点x,y,如何找到矩形周长上的最近点到该点?

我试图在Lua中解决它,但任何其他语言都可以.到目前为止,这是我的最大努力:

local function nearest(x, a, b)
  if a <= x and x <= b then
    return x
  elseif math.abs(a - x) < math.abs(b - x) then
    return a
  else
    return b
  end
end

local function getNearestPointInPerimeter(l,t,w,h, x,y)
  return nearest(x, l, l+w), nearest(y, t, t+h)
end
Run Code Online (Sandbox Code Playgroud)

这适用于周边之外或周边本身.但对于周界的点,它会失败(它只会返回x,y)

我的直觉告诉我解决方案应该很简单,但我似乎没有找到它.

Kee*_*per 14

这次我试图抓住点到矩形任何一侧的最小距离.

local abs, min, max = math.abs, math.min, math.max

local function clamp(x, lower, upper)
  return max(lower, min(upper, x))
end

local function getNearestPointInPerimeter(l,t,w,h, x,y)
  local r, b = l+w, t+h

  x, y = clamp(x, l, r), clamp(y, t, b)

  local dl, dr, dt, db = abs(x-l), abs(x-r), abs(y-t), abs(y-b)
  local m = min(dl, dr, dt, db)

  if m == dt then return x, t end
  if m == db then return x, b end
  if m == dl then return l, y end
  return r, y
end
Run Code Online (Sandbox Code Playgroud)

  • 我想我修复了bug.如果不是更好的话请回复. (2认同)