Algorithm 计算覆盖平面上所有点的最小直线数的程序

Algorithm 计算覆盖平面上所有点的最小直线数的程序,algorithm,data-structures,geometry,Algorithm,Data Structures,Geometry,我想要一个算法来找到覆盖所有给定点的最小数量的直线 我在互联网上搜索了算法,到目前为止,我只找到了一篇关于Geeksforgek的文章,这篇文章略有不同,这里的条件是所有的线都必须通过一个点,但我的问题是我没有参考点 链接到article=通常,您可以为每行指定任意两点。因此,选择任意两个点,通过它们传递一条线,选择下一对,传递一条线,以此类推。我的最后一行只剩下一个点了,这没关系——你可以任意选择它的方向(随机或固定方向) 如果任何点重合,则将其视为仅一个点,即通过其中一个点的任何直线都将通过

我想要一个算法来找到覆盖所有给定点的最小数量的直线

我在互联网上搜索了算法,到目前为止,我只找到了一篇关于Geeksforgek的文章,这篇文章略有不同,这里的条件是所有的线都必须通过一个点,但我的问题是我没有参考点


链接到article=

通常,您可以为每行指定任意两点。因此,选择任意两个点,通过它们传递一条线,选择下一对,传递一条线,以此类推。我的最后一行只剩下一个点了,这没关系——你可以任意选择它的方向(随机或固定方向)

如果任何点重合,则将其视为仅一个点,即通过其中一个点的任何直线都将通过所有点

当有3个或3个以上共线点组成的任意组时,您也可以将一条线穿过所有共线点,并且希望按共线集大小的降序“吃掉”这些点。因此,如果你有一组3个共线点和另一组10个共线点,我认为贪婪是最有意义的,但也许可以设计一些特殊情况,在这些情况下,这不是最好的方法

在任何情况下,这都取决于你是在解决一个真实的问题还是一个想象的问题(又称家庭作业)。如果是家庭作业问题,那么解决方案将与实际问题大不相同

但在该算法的几乎所有应用中,您应该实现的基本原语是查找共线点集,或者将一组点等效地划分为共线子集

你必须允许通过点的线的宽度不为零,因为在合成示例之外,真实点坐标(从物理数据获得)永远不会精确地位于一条线上,但可能非常接近-然后完全取决于应用程序,1微米宽的测线与20米宽的测线是否是您所能允许的

“宽度”一词应用于线条的确切含义取决于尺寸的数量:它自然是二维中矩形的宽度,在三维中成为圆柱体的直径(厚度),最后在4维及更多维数据集中变成超圆柱体的超直径

在2D中,宽度是沿主线扫掠以创建矩形的线段的长度;在3D中,宽度是沿主线扫掠以创建圆柱体的圆的直径;在4D中,宽度是沿主线扫掠以创建超圆柱体的球体的直径,依此类推

现在,由于宽度的含义总是相同的:从直线到它“通过”的点的最大允许距离,该算法很容易扩展到任意数量的维度:距离只是您选择的向量长度度量,这也可以根据应用程序进行参数化。Eudlidean指标是一个很好的默认值,但没有人说它在所有情况下都有用

最后,很多还取决于点所在的特定向量空间。你可能会自然而然地想到R^n,即实数的向量,但当你使用浮点数时,这甚至不是真的:它们不是实数,而是有理数,所以如果你想保证完全准确,您将需要使用一个数字库,它可以对有理数进行精确的算术运算——在内部,这需要对可变精度整数的支持,现在您将对此类主题进行愉快的探索。基本上,高级别的算法必须对这些细节不做任何假设——它们是特定于应用程序的参数。如果您选择通用应用程序,那么使用任何特定类型来表示向量或其坐标都是一条死胡同,这将使该算法只适用于非常狭窄的应用范围。如果你用浮点运算,你将永远得不到精确的结果,而对数据的简单更改,如排列点(改变它们的顺序),将把一些共线的点重新分类为不再共线的点——这是由于数值错误。精确的算术意味着不引入数值误差。您最好允许您的算法具有足够的灵活性,以便使用cgal库实现这些细节。它有各种内核,包括精确内核,可以精确地回答诸如“这一点离直线的距离是否不超过给定距离”之类的问题

您希望处理的算法只是表面上的简单。使其在现实世界中有用所需的实现细节绝非琐碎,需要很好地掌握基础数学。这是一种很好的方法,可以在学习算法的过程中学习这些数学——有些人(包括我自己)在应用程序环境中更好地理解数学。我曾经使用过类似的算法,并且在探索实现中所涉及的数学之美方面度过了美好的时光

实际上,Code Project和类似网站上介绍的几何“算法”都没有太多实际用途,因为它们是以高中课程的数学深度编写的:一个良好的起点,但是,在不了解足够的数学知识的情况下,您不能直接插入到产品中,从而能够清楚地说明实现的局限性,特别是导致仅基于相同数据重新排列的不同输出的不精确算法(!!)对于手头的任务是可接受的。请注意,我们可能会这样做,但您确实需要能够清楚地说明原因,并举例说明算法会产生不稳定的结果,并证明整个应用程序不会受到影响。此外,您必须将其放入测试套件中,以便在应用程序中发生更改时