Воскресенье, 06.10.2024, 03:41
Страничка программиста
Приветствую Вас Гость | RSS
Главная Определение положение точки относительно прямой, заданной двумя точками. Регистрация Вход
Меню сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Определение положение точки относительно прямой, заданной двумя точками.

 

Скажу сразу, что речь идет о 2D пространстве.

Итак, для начала давайте условимся называть:

  • lp1,lp2 – точки задающие прямую
  • tp – точка, положение которой выясняем

Для определения положения необходимо построить два вектора:

  1. из lp1 в lp2
  2. из lp1 в tp

Далее найдем векторное произведение этих двух векторов, если оно положительно то точка слева от прямой, если отрицательно – справа, если равно 0 то вектора параллельны, следовательно, точка лежит на прямой.

Иллюстрации вышесказанного:

точка слева от прямой

точка справа от прямой


Векторное произведение двух векторов v_1 \times v_2 = v_1.x*v_2.y - v_1.y*v_2.x

Знак векторного произведения зависит от знака синуса угла между векторами, которым мы собственно и пользуемся чтобы определить относительное положение точки.

Что значит слева/справа от прямой? Да, слегка не очевидно, но ответ прост – представьте, что вы стоите в точке где начинается вектор (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;
}
Поиск

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Сидорук Евгений © 2024 Создать бесплатный сайт с uCoz