Проверка наличия 3 точек на одной линии. - PullRequest
26 голосов
/ 28 сентября 2010

Я хочу знать фрагмент кода, который на самом деле может сказать мне, находятся ли 3 точки в двухмерном пространстве на одной линии или нет. Псевдокод также достаточен, но Python лучше.

Ответы [ 5 ]

62 голосов
/ 28 сентября 2010

Вы можете проверить, равна ли площадь треугольника ABC 0:

[ Ax * (By - Cy) + Bx * (Cy - Ay) + Cx * (Ay - By) ] / 2

Конечно, вам не нужно делить на 2.

53 голосов
/ 28 сентября 2010

Это C ++, но вы можете адаптировать его к python:

bool collinear(int x1, int y1, int x2, int y2, int x3, int y3) {
  return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}

По сути, мы проверяем, что наклоны между точкой 1 и точкой 2 и точкой 1 и точкой 3 совпадают.Наклон - это изменение по y, деленное на изменение по x, поэтому мы имеем:

y1 - y2     y1 - y3
-------  =  --------
x1 - x2     x1 - x3

Перекрестное умножение дает (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);

Обратите внимание: если вы используете удвоения, вы можете проверить поэпсилон:

bool collinear(double x1, double y1, double x2, double y2, double x3, double y3) {
  return fabs((y1 - y2) * (x1 - x3) - (y1 - y3) * (x1 - x2)) <= 1e-9;
}
0 голосов
/ 28 сентября 2010

Правило 1: В любом линейном 2-мерном пространстве две точки всегда находятся на одной линии.

Возьмите 2 точки и постройте уравнение, представляющее линию через них.Затем проверьте, находится ли третий пункт также на этой линии.

Удачи.

0 голосов
/ 28 сентября 2010

Прочитайте это и используйте его, чтобы найти уравнение прямой через первые две точки. Следуйте инструкциям, чтобы найти m и b. Затем для вашей третьей точки рассчитайте mx + b - y. Если результат равен нулю, третья точка находится на той же линии, что и первые два.

0 голосов
/ 28 сентября 2010

y - y0 = a(x-x0) (1), в то время как a = (y1 - y0)/(x1 - x0) и A(x0, y0) B(x1, y1) C(x2, y2). Посмотрите, есть ли C statisfies (1). Вы просто замените соответствующие значения.

Подробнее

...