指向矩形

时间:2011-06-02 07:42:29

标签: algorithm point-in-polygon

查找点是否为以此格式提供的矩形 的最快方法是什么:
我有两个点是矩形的对边的中心,以及这些边的高度的数字。我希望这很清楚 矩形(可能)不与轴对齐。我想知道是否有一个更快的算法给定这个数据,然后计算四个角,旋转等

我虽然但我不确定如何实现(数学上有问题)的想法是找到从点到两个中心之间描绘的线的距离,如果它小于那个长度的一半。矩形的一边和行上的 然后它在矩形中。我不知道如何更好地解释这一点。

也许图片有助于解释:explanation
给出A,B,C以及A / B侧的长度。基本上我认为如果CD小于A侧和D侧的一半,则该点位于矩形中。但是我该怎么做呢? 另一个想法:而不是找到D以查看它是否在AB上,检查角度ABC和BAC是否是锐角,但我仍然不知道如何做到这一点。

5 个答案:

答案 0 :(得分:3)

以下方法非常简单,但需要找到1个向量长度(您可以将其缓存以进行多次检查)

  1. Calc矢量 AB = B - A

  2. 计算 AB长度 - 它将是矩形的宽度

  3. 如果 AB_length<容差(公差是一个很小的值,例如,TOLERANCE = 0.00000001)然后矩形的宽度为零,因此该点不能位于矩形

  4. 规范化AB: AB_normalized = AB / AB_length

  5. 计算轴投影

    Calc AB投影:

    AB_proj =点积(AB_normalized,C - A)

    Calc AB正交投影(在图片中用“CD”表示):

    AB_orthogonal =( - AB.y,AB.x)

    AB_orthogonal_proj =点积(AB_orthogonal,C - A)

  6. 如果(0 <= AB_proj&lt; = AB_length)和(ABS(AB_orthogonal_proj)&lt; = AB_height / 2),则该点位于矩形中,不是否则

答案 1 :(得分:2)

对于像这样的问题,dot product是您值得信赖的朋友。那个和一些毕达哥拉斯应该给你回答两个问题所需的一切:

  1. AC在AB上投影到AB?
  2. 是| DC | &LT;高度/ 2
  3. 以平方距离工作而不是平方根,不要费心计算角度。

答案 2 :(得分:1)

不完全确定它是最快的,但这可能会奏效:

不是将D半部放在两个中心之间,而是沿着AB轴将C投影为D.然后检查a)D在A和B之间,b)CD小于或等于矩形高度的一半。


重新使用角度的想法...使用Pythagorus和Al Kashi的定理可能实际上是有道理的:

http://en.wikipedia.org/wiki/Law_of_cosines

ABC急性和BAC急性都是先决条件,并且给它们将C2放在矩形上,具有相同的alpha / beta(参见维基页面)。从那里你也知道伽玛(pi / 2,因为在矩形上)和beta / alpha(pi / 2 - beta),这导致想知道[A,C][B,C]距离是小于还是相等分别为[A,C2][B,C2]

答案 3 :(得分:1)

锐角三角形ABC的想法不起作用。例如。点C直接在AB行之外,C处的角度几乎为180°。另一方面,如果矩形的高度相当小但B位于矩形之外,则C处的角度可能非常小。

然而,你的另一种方法是实现这一目标的一种基本方法。

D位于AB的某个位置,因此

D = A + t * (B-A)

(大写字母代表空格中的向量,小写字母代表数字)。同时,从DC的连接垂直于连接AB,因此

(C-D) . (B-A) == 0

即。两个差矢量的点积为零。将两者放在一起产生

(C-A-t*(B-A)) . (B-A) = (C-A) . (B-A) - t * (B-A) . (B-A) == 0

或解决t

t = (C-A).(B-A) / (B-A).(B-A)

(或换句话说,向量AC投影到行AB上的相对长度)。

如果D,点0 <= t <= 1位于矩形内,因此这是您的第一个条件。

然后你可以计算CD的距离(只需将t插入第一个eqn以获得D)并将其与{{1}进行比较},即最后一个条件是

h/2

答案 4 :(得分:0)

正方形是4个半空间的交点。每个半空间使用两点线公式从矩形的一侧导出。根据您的问题的具体情况,也许您可​​以并排检查,可能在每一步都可以轻易拒绝。

这比投影更快吗?我想这取决于你在第一步之后琐碎拒绝的概率!