2011-06-02 93 views
4

什么是找到一个点是否是在一个矩形以这种形式给出的最快方法:
我有两个点,这是该矩形的两侧的中心,和一个号码是那边的高度。我希望这很清楚。
矩形(可能)未与轴对齐。我想知道是否有一个更快的算法给出这个数据,然后计算四个角落,旋转等。
点在矩形

一个想法,但我不知道如何实现(有数学麻烦)是找到从该点到在两个中心之间描绘的线的距离,并且如果它小于该矩形边的长度的一半,并且在线上,则它在矩形中。我不知道如何更好地解释这一点。

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

+1

你有很多查询点每个矩形,或只有一个?取决于你可能会发现它有用或不用预先计算和缓存矩形的任何参数。 – xofon 2011-06-02 08:26:22

回答

1

不能完全确定这是最快的,但是这可能会工作:

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


重新您的使用角度的想法...使用Pythagorus和或Al喀什定理实际上可能是有意义:

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

ABC急性和急性BAC都将是一个先决条件,给他们你把C2放在矩形上,用相同的alpha/beta(见wiki页面)。从那里你也知道gamma(pi/2,因为在矩形上)和beta/alpha(pi/2 - beta),这导致想知道[A,C][B,C]距离分别小于还是等于[A,C2][B,C2]

+0

这就是我的意思。我的照片恰好把D放在中间。我将如何做到这一点? – baruch 2011-06-02 07:53:00

+0

我的数学有点生疏,但离我头顶的距离相当于旋转A,B和C的坐标,以便AB是x轴或y轴,并相应地查看C的坐标。 – 2011-06-02 07:57:42

+0

我仍然需要第一次检查。这将需要在距离和急剧。它可能会更快,然后找到D – baruch 2011-06-02 08:12:43

0

广场是4个半空间的交点。使用两点直线公式从矩形的一边导出每个半空间。根据问题的具体情况,也许你可以并排检查,也可能在每一步都轻微拒绝。

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

2

dot product是您这样的问题的可靠朋友。这和一点毕达哥拉斯应该给你一切你需要回答两个问题:

  1. 是AC投影AB AB?
  2. Is | DC | <身高/ 2?

以平方距离工作而不是做平方根,不要计算角度。

1

与锐角三角形ABC的想法不起作用。例如。它点C是直接AB线C将成为近180°。另一方面,如果矩形的高度相当小,则B处的角度可能非常小,但C确实位于矩形外部。

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

D是某处通过AB线,从而

D = A + t * (B-A) 

(captial字母代表在空间中,小写字母向量数)。同时从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)。

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

之后,您可以calulate的C的距离D(只需插入t到第一个等式来获得D)和比较这对h/2,即然后最后一个条件是

(C-D).(C-D) <= (h/2)^2 
3

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

  1. 计算值矢量AB =乙 - 甲

  2. 计算值AB长度 - 这将是矩形

  3. 的宽度如果AB_length <公差(公差为小的值,例如,公差= 0。00000001),则矩形具有零宽度,因此该点不能在矩形在于

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

  5. 计算轴凸起

    计算值AB投影:

    AB_proj = dot product(AB_normalized,C-A)

    C ALC AB正交投影(表示为 “CD” 在你的图片):

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

    AB_orthogonal_proj =点积(AB_orthogonal,C - A)

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

+1

+1除了一件事外,最详细的答案和作品;我认为'AB_orthogonal =(-AB.y,AB.x)'这一行应该是'AB_orthogonal =(-AB_normalized.y,AB_normalized.x)'。或者至少,这似乎为我工作。 – jazzbassrob 2012-12-05 22:31:29