C++ 从将形成一条直线的一组坐标中确定点

C++ 从将形成一条直线的一组坐标中确定点,c++,algorithm,linear-algebra,cartesian-coordinates,C++,Algorithm,Linear Algebra,Cartesian Coordinates,我想做一个程序,在笛卡尔平面上生成10-100个随机坐标,它应该找到哪些点会形成一条直线 它应该是至少四个点的组合,可以形成一条线。为此,我可以找到四个选定点之间的坡度,以确定它们是否可以形成一条直线 然而,困难的部分是我如何将所有的观点结合起来?我想用蛮力法,找到至少四个点的所有组合,然后检查它们之间的斜率,看它们是否能形成一条直线 任何关于如何处理此问题的建议(例如有效地找到组合)都将不胜感激。您可能需要应用于您的点集。您可能需要应用于您的点集。通常四个随机点由于其随机性不会形成一条线。如果

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

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

然而,困难的部分是我如何将所有的观点结合起来?我想用蛮力法,找到至少四个点的所有组合,然后检查它们之间的斜率,看它们是否能形成一条直线


任何关于如何处理此问题的建议(例如有效地找到组合)都将不胜感激。

您可能需要应用于您的点集。

您可能需要应用于您的点集。

通常四个随机点由于其随机性不会形成一条线。如果您想这样做,您可以对每个不同的四个点集的线性回归进行微调,检查各自的方差,然后选择方差低于阈值的集,该阈值是您必须确定的,以便查看点何时“在一条线上对齐”。

通常四个随机点由于其随机性而不会形成一条线。如果您想这样做,您可以对每个不同的四个点集的线性回归进行微调,检查各自的方差,然后选择方差低于阈值的集,您必须确定该阈值,以便查看点何时“在一条线上对齐”.

您不需要所有组合,因为您的4元组中有两个不同的失败点:3和4。显然,如果前3个不是线性的,第4个就不会使整个元组线性化。而且,如果A-B-C不是线性的,不管第四点是什么,它们都会失败

考虑到这一点,我将创建一个由4项组成的向量,并将其称为我的结果向量,在结果向量中,索引从0到4,从0开始。向量将保存点数组中的索引,并将初始化为-1表示N/A(尚未)

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

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

您不需要所有组合,因为您的4元组中有两个不同的失败点:3和4。显然,如果前3个不是线性的,第4个就不会使整个元组线性化。而且,如果A-B-C不是线性的,不管第四点是什么,它们都会失败

考虑到这一点,我将创建一个由4项组成的向量,并将其称为我的结果向量,在结果向量中,索引从0到4,从0开始。向量将保存点数组中的索引,并将初始化为-1表示N/A(尚未)

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

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

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

我认为尝试所有4个点没有任何好处。只需取每一对点,计算它们形成的直线的方程y=mx+c,然后将每一对(m,c)插入一个数组。然后对这个数组进行排序(不管m还是c是第一个排序键)。然后,属于同一行的所有点对将在排序数组中显示为连续块:如果同一行上有n个点,则相应块中将有n^2个连续元素,但很容易仅识别n个不同的点。时间和空间复杂度:O(n ^ 2 log n).< /p> ,你只需要考虑点对的所有组合。这些定义了由点形成的所有可能的线

你这样考虑点(π,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,则点位于直线上。因为我们使用的浮点精度有限