检查两组点与源点是否在不同的半球中

时间:2018-09-20 13:24:56

标签: c# algorithm 2d coordinates angle

我有一个带有整数坐标的2D平面图。

在此计划中,有很多要点,分为三类。

  • “来源”。只有一个点是源。
  • 尼斯小组,积分不明(但合理)
  • 邪恶小组,其中包含未知数(但合理)的点数

我首先要做的是弄清(是/否)这两组人是否在分开的半球中。

如果您可以画一条穿过“源”的线(图中的蓝色),以使所有善良的一面都在一侧,而所有邪恶的面都在另一侧,则可以将它们视为不同的半球。如果任一组中的任何一个都不能与其余一组放在同一侧,那是错误的。

第二步是弄清楚该半球的角度。在第一个示例(如下)中,我绘制了一个180度角(直线),但是我想计算出最不平衡的角(接近0),可以完美地将组分开。这条线将是从源头开始到无限远的两条半线。我想知道使第一个测试为真的最小角度(因此,从逻辑上讲,如果您测量另一侧,那么最大角度)

示例:

1:enter image description here

2:enter image description here

3:enter image description here

现在,我可以通过代码来计算每个点与源之间的角度。我一直想弄清楚如何测试各组的“凝聚力”,最重要的是,在两者之间没有其他组的成员。

我正在使用C#工作,但是这个问题实际上更多地与算法有关(我想不出一个可行的算法),因此我将接受以任何(可读)语言解决该问题的任何答案,包括伪代码,代码或文字说明。

在上下文中,所有点都是包含X和Y坐标的复杂对象。其他属性与该问题无关,因为它们已经分为所需的组(起源是单独的,其余有两个列表)。

2 个答案:

答案 0 :(得分:2)

您可以排序扫描。让我们介绍极坐标系,其原点位于“原点”和任意轴上。

  • 针对每个点(好坏)计算azimuth
  • 按其azimuth的订购点,例如
  • 扫描排序的集合;如果您在善与恶之间或恶与恶之间进行了2 less 转换;返回true,否则返回false

例如(让方位角以度为单位)

   {nice,  12}
   {nice,  13}
   {nice,  15}
   {nice,  21} // nice to evil transition
   {evil,  47}
   {evil, 121}
   {evil, 133} // evil to nice transition
   {nice, 211}
   {nice, 354}

我们有两个转换,答案是true

   {nice,  12}
   {nice,  13}
   {nice,  15} // nice to evil transition
   {evil, 121}
   {evil, 349}

仅一次转换,答案是肯定的

   {nice,  12}
   {nice,  13} // nice to evil transition
   {evil, 121} // evil to nice transition
   {nice,  15} // nice to evil transition
   {evil, 121} // evil to nice transition
   {nice, 349}

四个过渡点不能分开,答案是false

答案 1 :(得分:1)

获取组中的最低电流x和最低电流y。并获得最高...然后比较另一组,以查看两者之间的差异。如果在点(highx,highy)和(lowx,lowy)之间甚至发现了其他点之一,则它们会混合在一起。如果不是的话,他们是分开的...

一旦您知道它们是分开的,就从您的最低点(x,y)到最高点(x,y)画一条线,并将那条线转换为原点,为您提供两个“半球”

请注意,只有当它们被一条线而不是一个角度分开时,这才起作用。

角度

将a和y分开 一旦您拥有另一组未交叉的最低(或最高)x,则对y做同样的事情。通过这两个坐标和您的原点,您应该能够确定角度。