你可以用两个点之间的角系数与牛年来解决这个问题。例如,对于3点:A B C.如果它们共线,当且仅当线AB和线AC与Ox线形成相同的角度系数。所以,这里是我的伪代码:
// Type : an object to store information to use later
List<Type> res = new ArrayList<Type>();
for (int i = 0; i < points.lenght(); i++) {
for (int j = i+1; j < points.length(); j++) {
double coefficient = CoeffiecientBetweenTwoLine(
line(points[i], points[j]), line((0,0), (0,1));
res.add(new Type(points[i], points[j], coefficient);
}
}
之后,您使用QuickSort,再次在基于系数的列表基础上进行排序。而任何系数相等,我们可以知道哪些点是共线的。该算法的复杂度为O(N^2logN)
(以O(N^2)
元素对列表进行排序为主,仅需要构建列表O(N^2)
)。
@编辑: 那么当我们显示相等的系数时,我们怎么能知道多少点共线? 有很多方法可以解决这个问题。
从以上建筑,你只需要看到的条纹1.在这个例子中,是2。所以结果应该是3。(总是K + 1)
- 使用式:因为总是等于对数:
n*(n-1)/2
。所以,你将有:n*(n-1)/2 = 3
。你可以知道n = 3(n> = 0)。这意味着你可以在这里解决二次方程(但不要太 困难,因为你总是知道它有解决方案,以及刚刚获得 一个解决方案,它正)
编辑2 上述步骤知道有多少共线点是不正确的,因为例如AB和CD是两条平行线(并且线AB不同于线CD),结果,它们仍然与Ox具有相同的系数。所以,我认为要解决这个问题,可以使用Union-Find
数据结构来解决这个问题。步骤将是:
排序再次角系数 例如:(1 2 3 4)共线,他们是与(5,6,7)和第8点看台别处平行。这样,排序后,结果应该是:
(1 2)(1 3)(1 4)(2 3)(2 4)(5 6)(5,7)(6,7)的角系数等于,但在两个不同的行
(1,5)(1,6).. //将有一些对的两个组平行线之间的连接。 (1,8)
(5,8)(3,8)... //随机顺序。因为不知道。
使用联盟查找数据结构来连接树:从第二个元素开始迭代,如果你看到它的角系数等于与以前的,加入自己和同前面。例如,
(1,3)==(1,2):加入1和2,加入1和3
(1,4)==(1,3):加入1和3,加入1和4 ....
(5,6):加入2和4,加入5和6
(5,7):加入5和7,加入5,6 ...
(1,8):不加入任何东西。 (5,8):不加入任何东西...
完成该步骤后。你所拥有的只是一棵多树,在每棵树中,是一组共点,它们是共线的。
上面的步骤中,您会看到有些对是多次加入的。你可以简单地通过标记来解决这个问题,如果他们已经加入,忽略以提高性能。
@:我觉得这个方案不好,我只是通过我的大脑思维,不是一个真正的算法背后做。所以,其他任何明确的想法,请告诉我。
来源
2014-01-10 01:42:47
hqt
你在行'return(y1 - y2)*(x1 - x3)=(y1 - y3)*(x1 - x2)中有问题;'因为这是一个赋值,而不是比较 –
还有一个O n^2)解决方案,但它是基于点线二元性的。对于原始平面中的每个点,都可以在双平面中创建一条线。双平面中度数最大的点对应于通过最大点数的原始平面中的线。这可以通过使用线的排列在O(n^2)时间内计算。 –