将一个平面分成两个相等的一半

时间:2010-06-23 23:36:51

标签: algorithm math geometry computational-geometry

给定一个2维平面,其中有n个点。我需要生成一个划分平面的线的方程,使得一侧有n / 2个点,另一侧有n / 2个点。 (顺便说一下,这不是家庭工作,我只是想解决问题)

10 个答案:

答案 0 :(得分:26)

我认为这些点是截然不同的,否则甚至可能没有这样的界限。

如果点是不同的,则这样的行总是存在,并且可以使用确定性 O(nlogn)时间算法找到。

说点是P1,P2,...,P2n。假设他们并非都在同一条线上。如果是,那么我们就可以很容易地形成分裂线。

首先翻译点,使所有坐标(x和y)都为正。

现在假设我们神奇地在y轴上有一个点Q,这样那些点(即任何无限线Pi-Pj)形成的线都没有通过Q.

现在由于Q不在点的凸包内,我们可以很容易地看到我们可以通过穿过Q的旋转线来对点进行排序。对于某个旋转角度,一半点将位于一侧并且另一半将位于该旋转线的另一侧,或者换句话说,如果我们考虑通过线Pi-Q的斜率对点进行排序,我们可以选择(中位数)th和(中位数)之间的斜率+1)点。这种选择可以在O(n)时间内通过任何线性时间选择算法完成,而无需对点进行实际排序。

现在选择Q点。

说Q是(0,b)。

假设Q与P1(x1,y1)和P2(x2,y2)共线。

然后我们有了

(y1-b)/ x1 =(y2-b)/ x2(注意我们翻译了这些点,使得xi> 0)。

解决b给出

b =(x1y2 - y1x2)/(x1-x2)

(注意,如果x1 = x2,则P1和P2不能与Y轴上的点共线)。

考虑| b |。

| B | = | x1y2 - y1x2 | / | x1 -x2 |

现在让xmax为最右边的x坐标,ymax为最顶边的坐标。

同样让D为两点之间的最小非零x坐标差(这是存在的,因为并非所有的x都是相同的,因为并非所有点都是共线的。)

然后我们有| b | < = xmax * ymax / D.

因此,选择我们的点Q(0,b)为| b | > b_0 = xmax * ymax / D

D可以在O(nlogn)时间内找到。

b_0的大小可能会变得非常大,我们可能不得不处理精确问题。

当然,更好的选择是随机挑选Q!如果概率为1,您将找到所需的点,从而使预期的运行时间为O(n)。

如果我们能找到一种在O(n)时间内选择Q的方法(通过找到其他一些标准),那么我们就可以在O(n)时间内运行该算法。

答案 1 :(得分:10)

  1. 在该平面中创建任意一条线。将每个点投射到每条点的a.k.a线上,得到该线上最接近该点的点。

  2. 在任一方向沿线排序这些点,然后在该线上选择一个点,使得该线上任意一个方向上的点数相等。

  3. 使线垂直于穿过该点的第一条线。这条线的两边都有原点的一半。

  4. 在执行此操作时,有些情况需要避免。最重要的是,如果所有点都在一条线上,则不要选择穿过它的垂直线。事实上,选择那条线本身就不必担心投射点了。就这背后的实际数学而言,vector projections将非常有用。

答案 2 :(得分:4)

这是Dividing a plane of points into two equal halves的修改,允许重叠点的情况(在这种情况下,它会说明答案是否存在)。

If number of points is odd, return "impossible".

Pick a random line (two random points)
Project all points onto this line (`O(N)` operation)
    (i.e. we pretend this line is our new X'-axis, and write down the
     X'-coordinate of each point)
Perform any median-finding algorithm on the X'-coordinates
    (`O(N)` or faster-if-desired operation)
    (returns 2 medians if no overlapping points)
Return the line perpendicular to original random line that splits the medians

In rare case of overlapping points, repeat a few times (it would take
a pathological case to prevent a solution from existing).

与其他提议的解决方案不同,这是O(N)

假设存在解决方案,上述方法可能会终止,但我没有证据。

尝试上述算法几次,除非您检测到重叠点。如果您检测到大量的重叠点,您可能会陷入困境,但是有一种非常低效的强力解决方案需要检查所有可能的角度

For every "critical slope range", perform the above algorithm 
  by choosing a line with a slope within the range.
If all critical slope ranges fail, the solution is impossible.

临界角定义为可能改变结果的角度(想象解决前一个答案,旋转整个点集,直到一个或多个点与一个或多个其他点交换位置,越过分界线这些中只有有限的很多,我认为它们受到点数的限制,所以如果你有重叠点,那么你可能正在寻找O(N^2)-O(N^2 log(N))范围内的某些东西,这是一种蛮力的方法。

答案 3 :(得分:1)

我猜想一个好方法是对点进行排序/排序/排序(例如从左到右),然后选择一条穿过(或在)序列中间点[s]之间的线。

答案 4 :(得分:1)

有明显的情况是无法解决问题。例如。当你有三堆积分时。位置A的一个点,位置B的两个点和位置C的五个点。

如果你期望得到一些不错的分布,你可以用tlayton的算法得到一个好的结果。要选择初始线倾斜,可以确定整个点集的范围,并选择最大对角线的角度。

答案 5 :(得分:1)

median以与你想要完成的方式类似的方式平均分割一组数字,并且可以使用selection algorithm在O(n)时间内计算(写入Cormen等人更好,所以你可能想看看那里)。因此,找到你的x值的中位数M x (或你的y值M y ,如果你愿意的话)并设置x = M x (或y = M y )并且该线将轴向对齐并平均分割您的点。

如果您的问题的性质要求线上不超过一个点(如果您的集合中有一个奇数点,至少其中一个将在线上)并且您发现发生了什么(或者您只是想防范这种可能性),将所有点旋转一些随机角度θ,并计算旋转点的中位数。然后,您可以旋转由-θ计算的中间线,它将平均分割点。

随机选择θ使得问题再次出现的可能性非常小,且点数有限,但如果确实如此,则尝试使用不同的θ。

答案 6 :(得分:0)

我不知道这是多么有用我见过类似的问题...

如果您已经有方向向量(也就是平面尺寸的系数)。

然后,您可以在该平面内找到两个点,只需使用中点公式即可找到该平面的中点。

然后使用该平面的系数和中点,您可以使用平面的一般方程找到距离两个点的距离相等的平面。

然后,一条线将构成用另一个表达一个变量 所以你会发现两个平面之间的距离相等的线。

有不同的方法可以做到这一点,例如使用飞机上的距离方程投影,但我相信这会使你的数学变得很复杂。

答案 7 :(得分:0)

答案 8 :(得分:0)

添加到M的答案:在O(n log n)中生成Q(不是那么遥远)的方法。

首先,让Q在y轴上任何点,即。 Q = (0,b) - 一些好的选择可能是(0,0)或(0,(y max -y min )/ 2)。

现在检查是否有两个点(x 1 ,y 1 ),(x 2 ,y 2 )与Q共线。任意点与Q之间的直线为y = mx + b;由于b是常数,这意味着如果它们的斜率m相等,则两个点与Q共线。因此,确定所有点的斜率m i 并检查是否有任何重复:(amoritized O(n)使用哈希表)

如果所有的m都是不同的,我们就完成了;我们发现了Q,上面的M算法在O(n)步骤中生成了这一行 如果两个点与Q共线,我们将Q向上移动量ε,Q new =(0,b +ε),并显示Q < sub> new 不会与另外两个点共线。

下面得出的ε标准是:

ε < mminΔ*xmin

首先,我们的m看起来像这样:

mi = yi/xi - b/xi

让我们找到任意两个不同 m i 之间的最小差异,并将其称为m minΔ {{ 1}} 通过例如排序然后比较m i i + 1 之间的差异为所有i)

如果我们用ε捏造b,则m的新等式变为:

mi,new = yi/xi - b/xi - ε/xi
       = mi,old - ε/xi

因为ε&gt; 0和x i &gt; 0,所有m都减少了,并且所有m都减少了最多ε/ x min 。因此,如果

ε/xmin < mminΔ, ie.
ε < mminΔ*xmin

是真的,那么以前不相等的两个m i 将保证保持不相等。


剩下的就是显示如果m 1,old = m 2,old ,则m 1,new = / =米<子> 2,新的。由于m i 都减少了ε/ x i ,这相当于显示x 1 = / = x 2 。如果他们 相等,那么:

y1 = m1,oldx1 + b = m2,oldx2 + b = y2

与我们的假设相矛盾,即所有观点都是截然不同的。因此,m 1,new = / = m 2,new ,没有两个点与Q共线。

答案 9 :(得分:0)

以下是我如何处理这个问题(假设n是偶数且没有三个点是共线的):

1)拿起Y值最小的点。我们称之为P点。

2)将此点作为新的原点,以便在此转换后所有其他点都具有正Y值。

3)对于每隔一个点(剩下n - 1个点),请考虑它在极坐标系下。每个其他点可以用半径和角度表示。你可以忽略半径,只关注角度。

4)如何找到均匀分割点的线?求出(n - 1)个角度的中位数。从点P到具有该中间角度的点的线将均匀地分割点。

该算法的时间复杂度为O(n)。