测试角度内的点

时间:2016-06-02 19:01:57

标签: algorithm geometry 2d computational-geometry

在2D平面中有四个点:OABP

OAB定义了一个“角度”,即两条光线,均来自O,一条经过A,而另一个经过B。如何判断点P所在角度的哪一侧,即是否在两条射线标记的空间内?

请注意,这些点是任意放置的,即角度可能比π更大。

这与确定点的哪一侧所在的类似问题,如所讨论的那样。在comp.graphics.algorithms FAQ中(主题1.02:我如何找到从一个点到一条直线的距离?),但这里约有两条光线而不是一条光线。

编辑:抱歉没有明确说明:角度是定向的,即给定P,它可能位于OAB的右侧,但它位于OBA的左侧。假设三角形OAB具有时钟方向。同样,它类似于“行的哪一方面”问题:该行是否通过ABBA。 / p>

一个例子:

        \                               \
         A                               B
          \   right                       \    left
   left    \                      right    \
            O------B----                    O------A----

2 个答案:

答案 0 :(得分:3)

从O看时,我们可以将飞机分成两个区域或“两侧”。

  1. 逆时针旋转时将光线OA扫描到光线OB的区域。
  2. 其余的,即射线OB逆时针扫到OA。
  3. 要检查该点是否在哪个区域,您可以使用

    In [373]: x=input('')
    123,232,232
    
    In [374]: x
    Out[374]: '123,232,232'   # I got a single string from input
    
    In [375]: np.array(x)
    Out[375]: 
    array('123,232,232',    # trying to make that an array - still string
          dtype='<U11')
    
    In [377]: np.array(x.split(','))
    Out[377]: 
    array(['123', '232', '232'],     # better - 3 strings 
          dtype='<U3')
    
    In [378]: np.array(x.split(','),dtype=float)
    Out[378]: array([ 123.,  232.,  232.])    # good
    

    I tried it here.

答案 1 :(得分:1)

以下讨论旨在检测阴影区域内的点。

enter image description here

有两种情况需要考虑:

  • 角度AOB小于平面,则点P必须位于OB右侧的AO 右侧(交点两个半平面),

  • 角度AOB大于平面,则P点必须位于OB右侧的AO 右侧( union 两个半架)。

完整的布尔表达式是

AO | B. (AO | P.OB | P)+¬AO| B. (AO | P + OB | P),

其中XY | Z表示Z位于XY的右侧,相当于“XYZ是顺时针”,由三角区域的符号决定。

我不认为可以使表达式更简单,除非你有几个P用于同一个AOB。