C++ 从将形成一条直线的一组坐标中确定点
我想做一个程序,在笛卡尔平面上生成10-100个随机坐标,它应该找到哪些点会形成一条直线 它应该是至少四个点的组合,可以形成一条线。为此,我可以找到四个选定点之间的坡度,以确定它们是否可以形成一条直线 然而,困难的部分是我如何将所有的观点结合起来?我想用蛮力法,找到至少四个点的所有组合,然后检查它们之间的斜率,看它们是否能形成一条直线C++ 从将形成一条直线的一组坐标中确定点,c++,algorithm,linear-algebra,cartesian-coordinates,C++,Algorithm,Linear Algebra,Cartesian Coordinates,我想做一个程序,在笛卡尔平面上生成10-100个随机坐标,它应该找到哪些点会形成一条直线 它应该是至少四个点的组合,可以形成一条线。为此,我可以找到四个选定点之间的坡度,以确定它们是否可以形成一条直线 然而,困难的部分是我如何将所有的观点结合起来?我想用蛮力法,找到至少四个点的所有组合,然后检查它们之间的斜率,看它们是否能形成一条直线 任何关于如何处理此问题的建议(例如有效地找到组合)都将不胜感激。您可能需要应用于您的点集。您可能需要应用于您的点集。通常四个随机点由于其随机性不会形成一条线。如果
任何关于如何处理此问题的建议(例如有效地找到组合)都将不胜感激。您可能需要应用于您的点集。您可能需要应用于您的点集。通常四个随机点由于其随机性不会形成一条线。如果您想这样做,您可以对每个不同的四个点集的线性回归进行微调,检查各自的方差,然后选择方差低于阈值的集,该阈值是您必须确定的,以便查看点何时“在一条线上对齐”。通常四个随机点由于其随机性而不会形成一条线。如果您想这样做,您可以对每个不同的四个点集的线性回归进行微调,检查各自的方差,然后选择方差低于阈值的集,您必须确定该阈值,以便查看点何时“在一条线上对齐”.您不需要所有组合,因为您的4元组中有两个不同的失败点:3和4。显然,如果前3个不是线性的,第4个就不会使整个元组线性化。而且,如果A-B-C不是线性的,不管第四点是什么,它们都会失败 考虑到这一点,我将创建一个由4项组成的向量,并将其称为我的结果向量,在结果向量中,索引从0到4,从0开始。向量将保存点数组中的索引,并将初始化为-1表示N/A(尚未) 然后,对于算法的每个周期:
- 在结果向量索引位置增加结果向量项李>
- 如果结果向量项不唯一,请再次递增。如果到达阵列的末尾,则此阵列的项目已用完。将结果向量索引递减为回溯。如果你也在结果向量的开头,你就完成了。别忘了将您放置的物品设置为-1李>
- 如果索引为3,则检查点是否为线性,如果不是,则不执行任何操作李>
- 如果索引为4,则检查点是否为线性,如果是,则有解决方案!耶!否则你什么也不做李>
- 如果索引不是3或4,则增加索引以获得新点
- 在结果向量索引位置增加结果向量项李>
- 如果结果向量项不唯一,请再次递增。如果到达阵列的末尾,则此阵列的项目已用完。将结果向量索引递减为回溯。如果你也在结果向量的开头,你就完成了。别忘了将您放置的物品设置为-1李>
- 如果索引为3,则检查点是否为线性,如果不是,则不执行任何操作李>
- 如果索引为4,则检查点是否为线性,如果是,则有解决方案!耶!否则你什么也不做李>
- 如果索引不是3或4,则增加索引以获得新点
你这样考虑点(π,Pj),其中i在1到n的范围内,j在i+1到n/i范围内。p> 我们使用形式为ax+by+c=0的直线方程,因为它很容易确定,并且没有退化情况(其斜率为无穷大)
对于两点(x1,y1)和(x2,y2),该方程为(y2-y1)x+(x2-x1)y+(x1y2-x2y1)=0
要测试点(x3,y3)是否在这条线上,只需在方程式中用x3替换x,用y3替换y即可。如果结果为0,则点位于直线上。因为我们使用的浮点精度有限