Принадлежность точки отрезку формула

Урок из серии «Геометрические алгоритмы»

Здравствуйте, дорогой читатель!

Сегодня мы рассмотрим еще одну типовую задачу из серии геометрические алгоритмы. Напишем функцию, которая будет проверять принадлежность произвольной точки отрезку, заданному координатами своего начала и конца.

Для реализации операций сравнения над вещественными данными напишем еще две функции: функцию EqPoint(), которая ,будет проверять, совпадают ли две точки на плоскости и функцию RealMoreEq() , которую будем использовать для проверки отношения «>=» (больше или равно). Причина ввода специальных функций нам уже известна.

Задача. Проверить, принадлежит ли точка отрезку.

Пусть точки — начальная и конечные точки отрезка. — произвольная точка на плоскости.

Вектор с началом в точке и концом в точке будет иметь координаты (x2-x1, y2-y1).

Если P(x, y) – произвольная точка, то координаты вектора равны: (x-x1, y – y1).

Точка Р будет принадлежать отрезку если:

  1. Векторы в и коллинеарны (равно нулю их векторное произведение):
    , т.е. (x-x1)(y2-y1)-(y-y1)(x2-x1) = 0
  2. Абсцисса точки P удовлетворяет условию: или . Иначе точка будет находиться на прямой левее или правее отрезка.

Результаты выполнения программы.

Введите координаты точек: x1, y1, x2, y2, x,y
0.5 1 2.5 2.8 1.203 1.633
Да.

Результаты тестирования в программе GeoGebra:


Сегодня мы написали функцию AtOtres() , которая проверяет принадлежность произвольной точки отрезку, заданному своими координатами.

Ввели еще две функции: EqPoint() и RealMoreEq() для реализации операций сравнения над вещественными данными. Первая проверяет, совпадают ли две точки на плоскости, вторая — используется для проверки отношения «>=».

Читайте также  Рокетбанк рокетрубли как потратить

На следующем уроке, на основе ранее написанных процедур, напишем процедуру определения координат точки пересечения двух отрезков.

На этом я с вами прощаюсь. До встречи на следующем уроке.

Спасибо, сам уже догадался до этого.. .
Кому интересно вот пример (не полный листинг) :
var
Form1: TForm1;
start:integer;
back:TBitmap;
AB,Am,Bm:real;

function LLine(x1,y1,x2,y2:real):real;
begin
LLine:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
end;

Полезно помнить про документацию на модуль math (ужатая версия на русском). Там есть очень полезные функции, например, atan2 .

Для тех, кто допускает, что его жизнь будет так или иначе связана с программированием, рекомендуется создавать классы для базовых примитивов (точка, вектор, прямая, луч, окружность и т.п.) и определять соответствующие операции с ними. Например, разность двух точек может давать вектор, вектора можно скалярно и векторно перемножать. Сами вектора можно умножать на числа, складывать и вычитать. Прямую можно собрать по двум точкам, по точке и вектору, которому прямая должна быть параллельна или перпендикулярна. Функция "Пересечение" может выдавать список точек (возможно, пустой) И т.п. Здесь хороший простор для продумывания удобной архитектуры решения.

Русско-английский тематический словарик

точка point
вектор vector
прямая line
луч ray
отрезок segment
угол angle
окружность circle
треугольник triangle
прямоугольник rectangle
квадрат square
многоугольник polygon
окружность circle
медиана median
биссектриса bisector
высота altitude
пересечение intersection
длина length
периметр perimeter
площадь area
касательная tangent
скалярное произведение dot product
векторное произведение cross product
вектор нормали normal vector
ограничивающий прямоугольник bounding box

0: Класс «Точка»

Реализуйте класс Pt , поддерживающих следующие операции:

  • Создание из пары чисел или из строки;
  • Сложение и вычитание точек;
  • Умножение и деление на число (целое и действительное);
  • Скалярное и косое произведения;
  • Вычисление длины при помощи abs ;
  • Проверка на равенство.
Читайте также  Проверить на ошибки текст и исправить

Могущество скалярного и косого (векторного) произведения

Рассмотрим какой-нибудь ненулевой вектор $overrightarrow$ на плоскости. Для каждого вектора $overrightarrow$ посчитаем скалярное и векторные произведения. И в зависимости от знаков и равенства нулю покрасим области разным цветом. В результате плоскость будет разбита на 4 четвертушки, 4 луча и точку. Это позволяет очень быстро и эффективно определять взаимное расположение точек и векторов.

Упражнения на векторные и скалярные произведения

A: Расстояние между двумя точками

Даны координаты двух точек. Найдите расстояние между ними.

Для решения используйте math.hypot .

B: Полярный угол точки

Даны два числа – координаты точки, не совпадающей с началом координат. Выведите ее полярный угол (величину от 0 до $2pi$).

Для решения используйте math.atan2 .

C: Угол между векторами

Даны четыре числа: координаты двух невырожденных векторов.

Выведите величину неориентированного угла между ними.

Для решения используйте math.atan2 .

D: Площадь треугольника

Даны шесть чисел: координаты трех вершин треугольника.

Выведите значение площади треугольника.

В решении разрешается использовать только скалярное и косое произведения. Никаких корней и тригонометрии.

E: Классификация векторов

Даны четыре числа: координаты двух ненулевых векторов. Если эти вектора коллинеарны, выведите 1. Если эти вектора перпендикулярны, выведите 2. Иначе выведите 0.

В решении разрешается использовать только скалярное и косое произведения. Никаких корней и тригонометрии.

Ссылка на основную публикацию
Adblock
detector