我有一个带有整数坐标的2D平面图。
在此计划中,有很多要点,分为三类。
我首先要做的是弄清(是/否)这两组人是否在分开的半球中。
如果您可以画一条穿过“源”的线(图中的蓝色),以使所有善良的一面都在一侧,而所有邪恶的面都在另一侧,则可以将它们视为不同的半球。如果任一组中的任何一个都不能与其余一组放在同一侧,那是错误的。
第二步是弄清楚该半球的角度。在第一个示例(如下)中,我绘制了一个180度角(直线),但是我想计算出最不平衡的角(接近0),可以完美地将组分开。这条线将是从源头开始到无限远的两条半线。我想知道使第一个测试为真的最小角度(因此,从逻辑上讲,如果您测量另一侧,那么最大角度)
示例:
现在,我可以通过代码来计算每个点与源之间的角度。我一直想弄清楚如何测试各组的“凝聚力”,最重要的是,在两者之间没有其他组的成员。
我正在使用C#工作,但是这个问题实际上更多地与算法有关(我想不出一个可行的算法),因此我将接受以任何(可读)语言解决该问题的任何答案,包括伪代码,代码或文字说明。
在上下文中,所有点都是包含X和Y坐标的复杂对象。其他属性与该问题无关,因为它们已经分为所需的组(起源是单独的,其余有两个列表)。
答案 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做同样的事情。通过这两个坐标和您的原点,您应该能够确定角度。