Определение положение точки относительно прямой, заданной двумя точками.
Скажу сразу, что речь идет о 2D пространстве.
Итак, для начала давайте условимся называть:
- lp1,lp2 – точки задающие прямую
- tp – точка, положение которой выясняем
Для определения положения необходимо построить два вектора:
- из lp1 в lp2
- из lp1 в tp
Далее найдем векторное произведение этих двух векторов, если оно положительно то точка слева от прямой, если отрицательно – справа, если равно 0 то вектора параллельны, следовательно, точка лежит на прямой.
Иллюстрации вышесказанного:
точка слева от прямой
точка справа от прямой
Векторное произведение двух векторов
Знак векторного произведения зависит от знака синуса угла между векторами, которым мы собственно и пользуемся чтобы определить относительное положение точки.
Что значит слева/справа от прямой? Да, слегка не очевидно, но ответ прост – представьте, что вы стоите в точке где начинается вектор (lp1, в нашем случае) и направлены лицом на lp2, тогда слева от вас будет означать слева от прямой, справа от вас – аналогично.
А вот собственно и код:
/// <summary>
/// Определение положения точки относительно прямой
/// </summary>
/// <param name="line_point1">первая точка задающая линию</param>
/// <param name="line_point2">вторая точка задающая линию</param>
/// <param name="testPoint">
/// точка, положение которой необходимо узнать
/// </param>
/// <returns>
/// 1 - точка слева от прямой
/// 0 - точка принадлежит прямой
/// -1 - точка справа от прямой
/// </returns>
typedef struct __point
{
long double x;
long double y;
}POINT;
int PointNearLine(Point line_point1,Point line_point2, Point testPoint)
{
int tmp = (line_point2.x-line_point1.x)*(testPoint.y-line_point1.y) -
(line_point2.y-line_point1.y)*(testPoint.x-line_point1.x);
if (tmp > 0)
return 1;
else
if (tmp < 0)
return -1;
else
return 0;
}
|