查找点是否为以此格式提供的矩形 的最快方法是什么:
我有两个点是矩形的对边的中心,以及这些边的高度的数字。我希望这很清楚
矩形(可能)不与轴对齐。我想知道是否有一个更快的算法给定这个数据,然后计算四个角,旋转等
我虽然但我不确定如何实现(数学上有问题)的想法是找到从点到两个中心之间描绘的线的距离,如果它小于那个长度的一半。矩形的一边和行上的 然后它在矩形中。我不知道如何更好地解释这一点。
也许图片有助于解释:
给出A,B,C以及A / B侧的长度。基本上我认为如果CD小于A侧和D侧的一半,则该点位于矩形中。但是我该怎么做呢?
另一个想法:而不是找到D以查看它是否在AB上,检查角度ABC和BAC是否是锐角,但我仍然不知道如何做到这一点。
答案 0 :(得分:3)
以下方法非常简单,但需要找到1个向量长度(您可以将其缓存以进行多次检查)
Calc矢量 AB = B - A
计算 AB长度 - 它将是矩形的宽度
如果 AB_length<容差(公差是一个很小的值,例如,TOLERANCE = 0.00000001)然后矩形的宽度为零,因此该点不能位于矩形
规范化AB: AB_normalized = AB / AB_length
计算轴投影
Calc AB投影:
AB_proj =点积(AB_normalized,C - A)
Calc AB正交投影(在图片中用“CD”表示):
AB_orthogonal =( - AB.y,AB.x)
AB_orthogonal_proj =点积(AB_orthogonal,C - A)
如果(0 <= AB_proj&lt; = AB_length)和(ABS(AB_orthogonal_proj)&lt; = AB_height / 2),则该点位于矩形中,不是否则
答案 1 :(得分:2)
对于像这样的问题,dot product是您值得信赖的朋友。那个和一些毕达哥拉斯应该给你回答两个问题所需的一切:
以平方距离工作而不是平方根,不要费心计算角度。
答案 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
位于A
和B
的某个位置,因此
D = A + t * (B-A)
(大写字母代表空格中的向量,小写字母代表数字)。同时,从D
到C
的连接垂直于连接A
到B
,因此
(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
到D
的距离(只需将t
插入第一个eqn以获得D
)并将其与{{1}进行比较},即最后一个条件是
h/2
答案 4 :(得分:0)
正方形是4个半空间的交点。每个半空间使用两点线公式从矩形的一侧导出。根据您的问题的具体情况,也许您可以并排检查,可能在每一步都可以轻易拒绝。
这比投影更快吗?我想这取决于你在第一步之后琐碎拒绝的概率!