提问者:小点点

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


这是一个与语言无关的问题。给定一个矩形的尺寸有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

这适用于周界之外或周界本身的点。但是对于周界内部的点,它失败了(它只返回x, y

我的直觉告诉我解决办法应该很简单,但我似乎没有找到。


共3个答案

匿名用户

这一次,我试图捕捉点到矩形任意边的最小距离。

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

匿名用户

设C1, C2,C3,C4为矩形的顶点。
从给定的点A,画出两条与矩形边垂直的线。设B1,B2,B3,B4为它们与矩形边的相交点(其中一些Bk可能也重合
,例如,如果A=Ck对于某些k)。您的解决方案是Bk
中的一个点或Ck中的一个点,只需暴力检查8个点
(同样,这8个点中的一些可能重合,但这并不重要)。

匿名用户

另一种可能的算法(类似于我的第一个答案)可以在这里找到——来自Dinre的算法。

计算R中多边形和点之间的距离

看起来很简单,实际上这是我第一个答案的简化(也许更好)版本。

找到给定点A的两个最近的矩形顶点Ci和Cj。

找到从A到线(Ci, Cj)的垂直线与线(Ci,Cj)相交的点M。

您的解决方案是Ci或Cj或M。

在我看来,这适用于所有情况(无论点A在平面上的哪个位置)。