Algorithm 矩形中的点

Algorithm 矩形中的点,algorithm,point-in-polygon,Algorithm,Point In Polygon,如果一个点位于以下形式给出的矩形中,最快的方法是什么: 我有两个点,它们是矩形相对边的中心,还有一个数字是这些边的高度。我希望这是清楚的。 矩形(可能)未与轴对齐。我想知道是否有一个更快的算法给出这些数据,然后计算四个角,旋转,等等 我想到了一个想法,但不确定如何实现(在数学上有问题)是找到从点到两个中心之间的直线的距离,如果它小于矩形边长度的一半,并且在直线上,那么它就在矩形中。我不知道如何更好地解释这一点 也许这张图片有助于解释: A、 B,C,以及A/B边的长度。基本上我认为如果CD小于A

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

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

也许这张图片有助于解释:
A、 B,C,以及A/B边的长度。基本上我认为如果CD小于A边的一半,D在AB上,点在矩形中。但是我该怎么做呢?

另一个想法是:不是找到D来查看它是否在AB上,而是检查ABC角和BAC角是否锐利,但我仍然不知道如何做到这一点。

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

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


你的想法是使用角度。。。使用毕达哥拉斯和/或阿尔·卡西的定理实际上可能有意义:


ABC ACURE和BAC ACURE都是一个先决条件,给定它们,您将C2放置在矩形上,具有相同的alpha/beta(请参见wiki页面)。从那里你也知道伽马(π/2,因为在矩形上)和β/alpha(π/2-β),这导致你怀疑
[A,C]
[B,C]
距离是否分别小于或等于
[A,C2]
[B,C2]

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

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

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

  • AC在AB上的投影是否在AB内
  • |DC |是否小于高度/2

  • 以平方距离计算,而不是平方根计算,而且不用费心计算角度。

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

    然而,您的另一种方法是实现这一点的一种基本方法

    D
    在通过
    A
    B
    的直线上的某处,因此

    D = A + t * (B-A)
    
    (大写字母代表空间中的向量,小写字母代表数字)。同时,从
    D
    C
    的连接与
    A
    B
    的连接垂直,因此

    (C-D) . (B-A) == 0
    
    i、 e.两个差分向量的点积为零。把这两个因素放在一起会产生收益

    (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以下方法非常简单,但需要查找1个向量长度(您可以缓存它以进行多次检查)

  • 计算向量AB=B-A

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

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

  • 标准化AB:AB_标准化=AB/AB_长度

  • 计算轴投影

    计算AB投影:

    AB_proj=点积(AB_归一化,C-A)

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

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

    AB\U正交项目=点积(AB\U正交,C-A)


  • 如果(0)这就是我要做的。我的照片刚好把D放在中间。我怎么做呢?我的数学有点生锈,但在我的头顶上,它相当于旋转A、B和C的坐标,使AB是X轴或Y轴,并相应地观察C的坐标。我仍然需要第一次检查。它需要在距离和锐度。它可能比实际找到DAnswer要快,因为你使用角度的想法。但我真的不知道这两个中哪一个会更快。(虽然直觉上,三角最少的肯定是那个。):-PDo每个矩形有许多查询点,或者只有一个?取决于这一点,您可能会发现预先计算和缓存矩形的任何参数是有用的还是不有用的。+1最详细的答案,除了一件事,它是有效的;我认为行
    AB_正交=(-AB.y,AB.x)
    应该是
    AB_正交=(-AB_normalized.y,AB_normalized.x)
    。或者至少这对我来说是可行的。
    (C-D).(C-D) <= (h/2)^2