我能想到的最好的算法是 N^2 算法。开始:
- 选择容差e来控制您愿意接近由集合中的点形成的线的距离。
- 计算一组点的凸包。
- 选择一条平行于凸包边之一的直线 L,在凸包外距离为3e 。
- 在L上选择一个点P,使得P在凸包在L上的投影之外。凸包在L上的投影是L的一个区间。P必须放在这个区间之外。
- 测试集合中的每一对点。对于由 2 个测试点形成的特定线 M 与围绕 P 的半径为2e的圆盘相交,将 P 沿 L 进一步移出,直到 M 不再与圆盘相交。通过 L 的构造,不可能有与 L 平行的圆盘相交的直线,所以这总是可以做到的。
- 如果 M 越过 P 越过 L,则将 P 移出该交叉点,再次移动到足以使 M 不穿过圆盘的距离。
- 完成所有这些之后,选择距离e处的点,在 P 处与 L 垂直。它可以与集合中的任何一条线共线。
步骤5中如何选择P沿L的下一个位置的细节留给你,
您可以进行一些明显的微不足道的拒绝测试,以便仅在测试线 M 与 L“足够平行”的情况下进行更昂贵的检查。
最后,我应该提一下,有可能将 P 推得足够远,以至于出现数值问题。在这种情况下,我可以建议的最好方法是在凸包之外尝试另一条线,距离至少为3e。