我想制作一个程序,在笛卡尔平面上生成10-100个随机坐标,它应该找到哪些点将形成一条线。
它应该是至少四个点的组合,可以形成一条线。要做到这一点,我可以找到四个选定点之间的斜率,以确定它们是否可以形成一条线。
然而,困难的部分是我如何将所有的观点结合起来?我想使用蛮力方法,找到至少四个点的所有组合,然后检查它们之间的斜率,看看它们是否能形成一条线。
任何关于我如何处理这个问题的建议,例如有效地找到组合,我们都将不胜感激。
我认为尝试所有4点集没有任何好处。只需取每对点,计算它们形成的直线的方程y=mx+c,并将每对(m,c)插入一个数组中。然后对这个数组进行排序(不管m还是c是第一个排序键)。然后,属于同一行的所有点对将在排序数组中显示为连续块:如果同一行上有n个点,则相应块中将有n^2个连续元素,但很容易只识别n个不同的点。时间和空间复杂性:O(n^2 logn)。
您不需要所有的组合,因为您的4元组中有两个不同的失败点:在3和在4。显然,如果前3个不是线性的,那么第4个就不会使整个元组成为线性的。此外,如果A-B-C不是线性的,那么第四点是什么并不重要,它们将所有都失败。
考虑到这一点,我会创建一个由4项组成的向量,并将其称为我的结果向量,并在结果向量中创建一个从0到4的索引,从0开始。向量将在点数组中保存索引,并将用-1初始化N/A(yet)。
然后对于算法的每个循环:
- 在结果向量索引位置递增结果向量项
- 如果结果向量项不是唯一的,请再次递增。如果你到达数组的末尾,那么你的项目就用完了。您可以递减结果向量索引以回溯。如果你也在结果向量的开始,你就完成了。别忘了将你掉落的物品设置为-1
- 如果索引为3,则检查点是否为线性,否则不执行任何操作
- 如果索引为4,则检查点是否是线性的,如果是,则有一个解决方案!耶!否则你什么都不做
- 如果索引不是3或4,则递增索引以获得新点
您可能需要对点集应用PCA分析。
通常四个随机点由于其随机性而不形成一条线。如果你想做这样的事情,你可以对每个不同的四点集的线性回归进行微调,检查各自的方差,然后选择方差低于阈值的集,为了查看点何时"对齐在一条线上",你必须确定该阈值。
您只需要考虑点对的所有组合。这些定义了由点形成的所有可能的线。
因此,考虑点(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)),如果k属于该线,则测试k在j+1到n范围内的所有点Pk。您可以跟踪在线上找到的所有点,如果数字大于2(总数>4),则打印结果。
对所有成对的点(Pi,Pj)执行此操作。
我必须提供代码吗?