4

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

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

或许图片可以帮助解释:解释
A、B、C,以及A/B边的长度。基本上我认为如果CD小于A边的一半并且D在AB上,那么点就在矩形中。但是我该怎么做呢?
另一个想法:不是找D看它是否在AB上,而是检查角度ABC和BAC是否锐角,但我仍然不知道该怎么做。

4

5 回答 5

3

下面的方法很简单,但需要找到 1 个向量长度(可以缓存它以进行多次检查)

  1. 计算向量AB = B - A

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

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

  4. 标准化 AB:AB_normalized = AB / AB_length

  5. 计算轴投影

    Calc AB 投影:

    AB_proj = 点积(AB_normalized, C - A)

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

    AB_正交 = (-AB.y, AB.x)

    AB_orthogonal_proj = 点积(AB_orthogonal, C - A)

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

于 2011-06-02T12:19:02.567 回答
2

对于此类问题,点积是您值得信赖的朋友。那和一点毕达哥拉斯应该会给你回答两个问题所需的一切:

  1. AC 到 AB 的投影是否在 AB 内?
  2. 是 |直流| < 高度/2?

以平方距离而不是平方根工作,并且不要费心计算角度。

于 2011-06-02T08:18:04.297 回答
1

锐角三角形的想法ABC行不通。例如,该点C直接位于线之外AB,角度C将变为几乎 180°。另一方面,B如果矩形的高度相当小,则角度可能非常小,但C确实位于矩形之外。

不过,您的另一种方法是实现此目的的一种基本方法。

该点位于通过andD的线上某处,因此AB

D = A + t * (B-A)

(大写字母代表空间中的向量,小写字母代表数字)。同时,从DtoC的连接垂直于 to 的连接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,因此这是您的第一个条件。

C之后,您可以计算to的距离D(只需插入t第一个 eqn 即可得到D)并将其与 进行比较h/2,即最后一个条件是

(C-D).(C-D) <= (h/2)^2
于 2011-06-02T08:49:42.877 回答
1

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

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


重新使用角度的想法......使用毕达哥拉斯和或Al Kashi定理可能实际上是有意义的:

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

急性 ABC 和急性 BAC 都是先决条件,并且给定它们,您将 C2 放置在矩形上,具有相同的 alpha/beta(请参阅 wiki 页面)。从那里您还知道 gamma(pi/2,因为在矩形上)和 beta/alpha(pi/2 - beta),这导致想知道[A,C]or[B,C]距离是否分别小于或等于[A,C2]or [B,C2]

于 2011-06-02T07:50:56.937 回答
0

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

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

于 2011-06-02T08:17:53.440 回答