Коллинеарность здесь не имеет смысла, если вы не начнете с двух точек.Так сказать, «найти все коллинеарные точки в данном наборе», по моему мнению, не имеет большого смысла, если только вы не сконцентрируетесь на двух точках и не протестируете остальные, чтобы убедиться, что они коллинеарны.
Может быть, лучший вопрос, каково максимальное количество коллинеарных точек в данном наборе?В этом случае вы можете зафиксировать 2 точки (просто используйте 2 контура), затем зациклить другие точки и убедиться, что наклон совпадает между фиксированными точками и другими точками.Вы можете использовать что-то подобное для этой проверки, предполагая, что координаты целочисленные (в противном случае вы можете изменить типы параметров на удвоенные).
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Returns whether 3 points are collinear
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bool collinear(int x1, int y1, int x2, int y2, int x3, int y3) {
return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}
Таким образом, логика становится такой:
int best = 2;
for (int i = 0; i < number of points; ++i) {
for (int j = i+1, j < number of points; j++) {
int count = 2;
for (int k = 0; i < number of points; ++k) {
if (k==i || k==j)
continue;
check that points i, j and k are collinear (use function above), if so, increment count.
}
best = max(best,count);
}
}