C# 检查两组点是否位于源点的不同半球

C# 检查两组点是否位于源点的不同半球,c#,algorithm,2d,coordinates,angle,C#,Algorithm,2d,Coordinates,Angle,我有一个带整数坐标的二维平面图 在这个计划中,有许多要点,分为三类 “来源”。只有一个点是源 Nice组,包含未知(但合理)点数 邪恶集团,包含未知(但合理)点数 我首先要做的是弄清楚(是/否)这两组人是否处于分开的大脑半球 如果你可以画一条线穿过源(图片中的蓝色),这样所有的善都在一边,所有的恶都在另一边,那么它们被认为是在不同的半球。如果任何一组中有那么多的人不能和其他人站在同一边,那就错了 第二步是计算这个半球的角度。在下面的第一个例子中,我画了一个180度的角度(直线),但我想计算最

我有一个带整数坐标的二维平面图

在这个计划中,有许多要点,分为三类

  • “来源”。只有一个点是源
  • Nice组,包含未知(但合理)点数
  • 邪恶集团,包含未知(但合理)点数
我首先要做的是弄清楚(是/否)这两组人是否处于分开的大脑半球

如果你可以画一条线穿过源(图片中的蓝色),这样所有的善都在一边,所有的恶都在另一边,那么它们被认为是在不同的半球。如果任何一组中有那么多的人不能和其他人站在同一边,那就错了

第二步是计算这个半球的角度。在下面的第一个例子中,我画了一个180度的角度(直线),但我想计算最不平衡的角度(接近0),这将允许完美地分离组。这条线是两条半线,从源开始,一直到无穷远。我想知道保持第一次测试为真的最小角度(因此,逻辑上,如果你测量另一侧,最大角度)

示例:

1:

2:

3:

现在,通过代码,我能够计算出每个点和震源之间的角度。我被困在如何测试团队的“团结”上,最重要的是,在这两者之间没有其他团队的成员

我在用C#,但这个问题实际上更多的是关于算法(我想不出一个可行的算法),所以我会接受任何用任何(可读)语言解决问题的答案,包括伪代码或直接文本解释

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

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

  • 计算每个点的
    方位角
    (好或坏)
  • 按其
    方位角对点进行排序,例如
  • 扫描已排序的集合;如果你在善与恶或恶与善之间有
    2
    或更少的转换;返回
    true
    ,否则返回
    false
例如(让方位角以度为单位)

我们有两个转换,答案是
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

得到on组的最低电流x和最低电流y。并且得到最高的。。。然后比较另一组,看看中间有多少。如果在点(highx,highy)和(lowx,lowy)之间发现了其他点中的一个,则它们会混合在一起。如果不是,他们是分开的

一旦你知道它们是分开的,从你的最低点(x,y)到最高点(x,y)画一条线,然后把这条线变换到你的原点,给你两个“半球”

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

角度

把a和y分开
一旦你得到了另一组没有交叉的最低(或最高)x,那么对y也做同样的事情。通过这两个坐标和原点,您应该能够确定角度。

这可能与您的问题有关:这是两个点集的凸包的应用。
   {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}