Дано множество точек на плоскости. Сколько точек не принадлежит прямой, проходящей через две первые точки? - C#
Формулировка задачи:
Доброго вечера!
Подскажите, пожалуйста, по следующей задаче:
Дано множество точек на плоскости. Сколько точек не принадлежит прямой, проходящей через две первые точки?
Множество точек я ввожу. Нахожу, которые лежат на прямой. Но не понимаю вторую часть задания. Мне нужно из всех введённых мною точек найти те, которые на этой прямой не лежат ?Решение задачи: «Дано множество точек на плоскости. Сколько точек не принадлежит прямой, проходящей через две первые точки?»
textual
Листинг программы
class Program
{
static void Main(string[] args)
{
//Ввод точек
var pts = new Point[]
{
new Point(),
new Point(1, 1),
new Point(2, 2),
new Point(3, 1),
new Point(100, 100),
new Point(-10,23),
new Point(15,-15),
new Point(78,78),
new Point(6, 6),
};
//Выбираем те, что не лежат на прямой, образованной двумя первыми точками
var outOfLine = pts.Skip(2).Where(pt => !LineContainsPoint(pts[0], pts[1], pt)).ToList();
//Выводим результат.
Console.WriteLine("На прямой не лежат точки:");
Console.WriteLine(string.Join(Environment.NewLine, outOfLine));
Console.Read();
}
/// <summary>
/// Функция проверяет принадлежность заданной точки прямой, заданной двумя точками
/// </summary>
/// <param name="pt1">Первая точка прямой</param>
/// <param name="pt2">Вторая точка прямой</param>
/// <param name="pt">Точка, принадлежность которой нужно проверить.</param>
private static bool LineContainsPoint(Point pt1, Point pt2, Point pt)
{
//Вектор прямой
var v = new Point(pt2.X - pt1.X, pt2.Y - pt1.Y);
//Вектор к точке
var v1 = new Point(pt.X - pt1.X, pt.Y - pt1.Y);
//Если векторы коллинеарны, то точка лежит на прямой
return v.X * v1.Y == v1.X * v.Y;
}
}