如何从点列表中删除共线点?

时间:2010-08-19 04:34:24

标签: math

给定一个点列表(A1,A2,A3,....,AN),每个点Ai都有Ai_x,Ai_y和Ai_z分别表示x,y,z坐标。

假设给定三个点AONE,ATWO,ATHREE,存在名为checkColinear的函数,即如果AONE,ATWO和ATHREE点共线,则checkColinear(AONE,ATWO,ATHREE)返回TRUE。

我正在寻找一种快速方法来删除列表中包含一些关键点的colinars点。

谢谢

1 个答案:

答案 0 :(得分:2)

天真的方法是检查每组3个点,即O(N ^ 3)。我假设你想要更快的东西。

通过创建斜率数组,您可以做得更好(O(N ^ 2 * log N)用于非退化情况)。遍历每对点并将斜率存储在数组中(以及2个点的数组索引)。按斜率对数组排序。然后查看数组 - 例如从对(2,3),(6,7),(9,4),(3,5),(2,5)可以找到斜率为2.5的行中的5个条目。点#2,#3和#5在这里是共线的。

(实现此检查的更简单/更快的方法可能是在给定斜率的情况下找到每个候选点的y轴截距,并按此方式对候选点进行排序。如果三个或更多点具有相同的y轴截距,他们是共线的。)

我也刚刚使用相同的基本方法找到了这个链接:http://lists.canonical.org/pipermail/kragen-hacks/2008-March/000482.html