从一组将形成直线的坐标确定点

时间:2015-03-04 13:54:19

标签: c++ algorithm linear cartesian-coordinates

我想制作一个在笛卡尔平面上生成10到100个随机坐标的程序,它应该找到哪些点会形成一条线。

它应该是至少四个可以组成一条线的点的组合。为此,我可以找到四个选定点之间的斜率,以确定它们是否可以形成一条线。

但是,困难的部分是如何组合所有要点?我想使用强力方法找到至少四个点的所有组合,然后检查它们之间的斜率以查看它们是否可以形成一条线。

关于如何解决这个问题的任何建议,例如,有效地找到组合将不胜感激。

5 个答案:

答案 0 :(得分:3)

我认为尝试所有4点积分没有任何好处。只需取每对点,计算它们形成的线的方程y = mx + c,并将每对(m,c)插入一个数组中。然后对这个数组进行排序(m或c是否是第一个排序键并不重要)。属于同一行的所有点对将在排序数组中显示为连续块:如果同一行上有n个点,则相应块中将有n ^ 2个连续元素,但它很容易只识别n个不同的点。时间和空间复杂度:O(n ^ 2 log n)。

答案 1 :(得分:1)

您不需要所有组合,因为您的4元组中有两个不同的失败点:在3和4处。显然,如果前3个不是线性的,则第4个不会使整个元组成为线性。而且,如果A-B-C不是线性的,那么第4点是什么并不重要,它们将全部失败。

所以考虑到这一点,我会创建一个包含4个项目的向量,并将其称为结果向量,并在结果向量中从0到4的索引,从0开始。向量将保存数组中的索引对于N / A(尚未),将初始化为-1。

然后对于算法的每个周期:

  • 在结果向量索引位置递增结果向量项。
  • 如果结果向量项不唯一,请再次递增。如果你到达阵列的末尾,你就会用完这个项目。您将结果向量索引递减到回溯。如果您也在结果向量的开头,那么您已经完成了。不要忘记将您放置的项目设置为-1!
  • 如果索引为3,则检查点是否为线性,否则不执行任何操作。
  • 如果索引为4,则检查点是否为线性,如果是,则表示您有解决方案!好极了!如果不是你什么都不做。
  • 如果索引不是3或4,则递增索引以获得新点。

答案 2 :(得分:0)

您可能需要在点集上应用PCA Analysis

答案 3 :(得分:0)

通常四个随机点由于其随机性而不形成一条线。如果你想做类似的事情你可以精确地对每个不同的四个点集进行线性回归,检查各自的方差,然后选择方差在你必须确定的阈值之下的集合,以便看到点“在一条线上对齐” ”

答案 4 :(得分:0)

您只需要考虑所有点对的组合。这些定义了由点形成的所有可能的线。

因此,考虑点(Pi,Pj),其中i在1到n的范围内,并且j在i + 1到n的范围内。

我们使用ax+by+c=0形式的线方程,因为它很容易确定并且没有退化情况(其斜率是无限的)。

有两个点(x1,y1)和(x2,y2),该等式为(y2-y1)x+(x2-x1)y+(x1y2-x2y1) = 0

要测试点(x3,y3)是否在此线上,只需将x替换为x3,将y替换为等式中的y3。如果结果为0,则该点在线上。由于我们使用精度有限的浮点数,因此我们测试abs((y2-y1)*x3+(x2-x1)*y3+(x1y2-x2y1)) < epsilon epsilon是一个非常小的值。

对于每一行(对(Pi,Pj)),如果它属于该行,则用j + 1到n范围内的k测试所有点Pk。您可以跟踪在线上找到的所有点,如果数字大于2(总数> 4),则打印结果。

您为所有点对(Pi,Pj)执行此操作。

我必须提供代码吗?