Взаимное расположение прямых в пространстве. Задачи с прямой в пространстве

Перпендикулярная прямая

Это задача наверное одна из самых популярных и востребованных в школьных учебниках. Задачи, основанные на эту тему многообразны. Это и определение точки пересечения двух прямых, это и определение уравнения прямой, проходящяя через точку на исходной прямой под каким либо углом.

Эту тему мы раскроем, используя в своих вычислениях данные полученные с помощью

Именно там было рассмотрено преобразование общего уравнения прямой, в уравнение с угловым коэффициентом и обратно, и определения остальных парметров прямой по заданным условиям.

Что же нам не хвататет для того, что бы решать те задачи, которым посвящена эта страница?

1. Формулы вычисления одного из углов между двумя пересекающимися прямыми.

Если мы имеем две прямые которые заданы уравнениями:

то один из углов вычисляется так:

2. Уравнение прямой с угловым коэффициентом, проходящяя через заданную точку

Из формулы 1, мы можем увидеть два пограничных состояния

а) когда тогда и следовательно эти две заданные прямые паралельны (или совпадают)

б) когда , тогда , и следовательно эти прямые перпендикулярны, то есть пересекаются под прямым углом.

Какие могут быть исходные данные для решения подобных задач, кроме заданной прямой?

Точка на прямой и угол под которым вторая прямая его пересекает

Второе уравнение прямой

Какие же задачи может позволить решить бот?

1. Заданы две прямые (явным или не явным образом например по двум точкам). Вычислить точку пересечения и углы по которыми они пересекаются.

2. Задана одна прямая, точка на прямой и один угол. Определить уравнение прямой, перескающую заданную под указанным углом

Примеры

Две прямые заданы уравнениями. Найти точку пересечения этих прямых и углы под которым они пересекаются

line_p A=11;B=-5;C=6,k=3/7;b=-5

Получаем следующий результат

Уравнение первой прямой

y = 2.2 x + (1.2)

Уравнение второй прямой

y = 0.4285714285714 x + (-5)

Угол пересечения двух прямых(в градусах)

-42.357454705937

Точка пересечения двух прямых

x = -3.5

y = -6.5


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

Прямая проходит через две точки (1:-4) и (5:2) . Найти уравнение прямой, которая проходит через точку (-2:-8) и пересекает исходную прямую под углом 30 градусов.

Одна прямая нам известна, так как известны две точки через которые она проходит.

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

Вроде все известно, но тут главное не ошибится. Речь идет об угле(30 градусов) не между осью абсцисс и линией, а между первой и второй линией.

Для этого мы постим так. Определим параметры первой линии, и узнаем под каким углом она пересекает ось абсцисс.

line xa=1;xb=5;ya=-4;yb=2

Общее уравнение Ax+By+C = 0

Коэффициент А = -6

Коэффициент B = 4

Коэффициент C = 22

Коэффициент a= 3.6666666666667

Коэффициент b = -5.5

Коэффициент k = 1.5

Угол наклона к оси (в градусах) f = 56.309932474019

Коэффициент p = 3.0508510792386

Коэффициент q = 2.5535900500422

Расстояние между точками=7.211102550928

Видим что первая линия пересекает ось под углом 56.309932474019 градусов.

В искходных данных не сказано как именно пересекает вторая линия, первую. Можно ведь построить две линии удовлетворяющих условиям, первая повернутая на 30 градусов ПО часовой стрелке, а вторая на 30 градусов ПРОТИВ часовой стрелке.

Давайте их и посчитаем

Если вторая линия повернута на 30 градусов ПРОТИВ часовой стрелке, то вторая линия будет иметь градус пересечения с осью абсцисс 30+56.309932474019 = 86 .309932474019 градусов

line_p xa=-2;ya=-8;f=86.309932474019

Параметры прямой линии по заданным параметрам

Общее уравнение Ax+By+C = 0

Коэффициент А = 23.011106998916

Коэффициент B = -1.4840558255286

Коэффициент C = 34.149767393603

Уравнение прямой в отрезках x/a+y/b = 1

Коэффициент a= -1.4840558255286

Коэффициент b = 23.011106998916

Уравнение прямой c угловым коэфициентом y = kx + b

Коэффициент k = 15.505553499458

Угол наклона к оси (в градусах) f = 86.309932474019

Нормальное уравнение прямой x*cos(q)+y*sin(q)-p = 0

Коэффициент p = -1.4809790664999

Коэффициент q = 3.0771888256405

Расстояние между точками=23.058912962428

Расстояние от точки до прямой li =

то есть наше уравнение второй линии есть y=15.505553499458x + 23.011106998916

В былые времена я увлекался компьютерной графикой, как 2х так и 3х мерной, в том числе математическими визуализациями. Что называется just for fun, будучи студентом, написал программу визуализирующую N-мерные фигуры, вращающиеся в любых измерениях, хотя практически меня хватило только на определение точек для 4-D гиперкуба. Но это только присказка. Любовь к геометрии осталась у меня с тех пор и по сей день, и я до сих пор люблю решать интересные задачи интересными способами.
Одна из таких задач попалась мне в 2010 году. Сама задача достаточно тривиальна: необходимо найти, пересекаются ли два 2-D отрезка, и если пересекаются - найти точку их пересечения. Более интересно решение, которое, я считаю, получилось достаточно элегантным, и которое я хочу предложить на суд читателя. На оригинальность алгоритма не претендую (хотя и хотелось бы), но в сети подобных решений я найти не смог.
Задача
Даны два отрезка, каждый из которых задан двумя точками: (v11, v12), (v21, v22). Необходимо определить, пересекаются ли они, и если пересекаются, найти точку их пересечения.
Решение
Для начала необходимо определить, пересекаются ли отрезки. Необходимое и достаточное условие пересечения, которое должно быть соблюдено для обоих отрезков следующее: конечные точки одного из отрезков должны лежать в разных полуплоскостях, если разделить плоскость линией, на которой лежит второй из отрезков. Продемонстрируем это рисунком.

На левом рисунке (1) показаны два отрезка, для обоих из которых условие соблюдено, и отрезки пересекаются. На правом (2) рисунке условие соблюдено для отрезка b, но для отрезка a оно не соблюдается, соответственно отрезки не пересекаются.
Может показаться, что определить, с какой стороны от линии лежит точка - нетривиальная задача, но у страха глаза велики, и всё не так сложно. Мы знаем, что векторное умножение двух векторов даёт нам третий вектор, направление которого зависит от того, положительный или отрицательный угол между первым и вторым вектором, соответственно такая операция антикоммутативна. А так как все вектора лежат на плоскости X-Y, то их векторное произведение (которое обязано быть перпендикулярным перемножаемым векторам) будет иметь ненулевой только компоненту Z, соответственно и отличие произведений векторов будет только в этой компоненте. Причем при изменении порядка перемножения векторов (читай: угла между перемножаемыми векторами) состоять оно будет исключительно в изменении знака этой компоненты.
Поэтому мы можем умножить попарно-векторно вектор разделяющего отрезка на векторы направленные от начала разделяющего отрезка к обеим точкам проверяемого отрезка.

Если компоненты Z обоих произведений будет иметь различный знак, значит один из углов меньше 0 но больше -180, а второй больше 0 и меньше 180, соответственно точки лежат по разные стороны от прямой. Если компоненты Z обоих произведений имеют одинаковый знак, следовательно и лежат они по одну сторону от прямой.
Если один из компонент Z является нулём, значит мы имеем пограничный случай, когда точка лежит аккурат на проверяемой прямой. Оставим пользователю определять, хочет ли он считать это пересечением.
Затем нам необходимо повторить операцию для другого отрезка и прямой, и убедиться в том, что расположение его конечных точек также удовлетворяет условию.
Итак, если всё хорошо и оба отрезка удовлетворяют условию, значит пересечение существует. Давайте найдём его, и в этом нам также поможет векторное произведение.
Так как в векторном произведении мы имеем ненулевой лишь компоненту Z, то его модуль (длина вектора) будет численно равен именно этой компоненте. Давайте посмотрим, как найти точку пересечения.

Длина векторного произведения векторов a и b (как мы выяснили, численно равная его компоненте Z) равна произведению модулей этих векторов на синус угла между ними (|a| |b| sin(ab)). Соответственно, для конфигурации на рисунке мы имеем следующее: |AB x AC| = |AB||AC|sin(α), и |AB x AD| = |AB||AD| sin(β). |AC|sin(α) является перпендикуляром, опущенным из точки C на отрезок AB, а |AD|sin(β) является перпендикуляром, опущенным из точки D на отрезок AB (катетом ADD"). Так как углы γ и δ - вертикальные углы, то они равны, а значит треугольники PCC" и PDD" подобны, а соответственно и длины всех их сторон пропорциональны в равном отношении.
Имея Z1 (AB x AC, а значит |AB||AC|sin(α)) и Z2 (AB x AD, а значит |AB||AD|sin(β)), мы можем рассчитать CC"/DD" (которая будет равна Z1/Z2), а также зная что CC"/DD" = CP/DP легко можно высчитать местоположение точки P. Лично я делаю это следующим образом:

Px = Cx + (Dx-Cx)*|Z1|/|Z2-Z1|;
Py = Cy + (Dy-Cy)*|Z1|/|Z2-Z1|;

Вот и все. Мне кажется что это действительно очень просто, и элегантно. В заключение хочу привести код функции, реализующий данный алгоритм. В функции использован самодельный шаблон vector, который является шаблоном вектора размерностью int с компонентами типа typename. Желающие легко могут подогнать функцию к своим типам векторов.

1 template 2 bool are_crossing(vector const &v11, vector const &v12, vector const &v21, vector const &v22, vector *crossing) 3 { 4 vector cut1(v12-v11), cut2(v22-v21); 5 vector prod1, prod2; 6 7 prod1 = cross(cut1 * (v21-v11)); 8 prod2 = cross(cut1 * (v22-v11)); 9 10 if(sign(prod1[Z]) == sign(prod2[Z]) || (prod1[Z] == 0) || (prod2[Z] == 0)) // Отсекаем также и пограничные случаи 11 return false; 12 13 prod1 = cross(cut2 * (v11-v21)); 14 prod2 = cross(cut2 * (v12-v21)); 15 16 if(sign(prod1[Z]) == sign(prod2[Z]) || (prod1[Z] == 0) || (prod2[Z] == 0)) // Отсекаем также и пограничные случаи 17 return false; 18 19 if(crossing) { // Проверяем, надо ли определять место пересечения 20 (*crossing)[X] = v11[X] + cut1[X]*fabs(prod1[Z])/fabs(prod2[Z]-prod1[Z]); 21 (*crossing)[Y] = v11[Y] + cut1[Y]*fabs(prod1[Z])/fabs(prod2[Z]-prod1[Z]); 22 } 23 24 return true; 25 }

Если прямые пересекаются в точке , то её координаты являются решениемсистемы линейных уравнений

Как найти точку пересечения прямых? Решить систему.

Вот вам и геометрический смысл системы двух линейных уравнений с двумя неизвестными – это две пересекающиеся (чаще всего) прямые на плоскости.

Задачу удобно разбить на несколько этапов. Анализ условия подсказывает, что необходимо:
1) Составить уравнение одной прямой.
2) Составить уравнение второй прямой.
3) Выяснить взаимное расположение прямых.
4) Если прямые пересекаются, то найти точку пересечения.

Пример 13.

Найти точку пересечения прямых

Решение : Точку пересечения целесообразно искать аналитическим методом. Решим систему:

Ответ :

П.6.4. Расстояние от точки до прямой

Перед нами прямая полоса реки и наша задача состоит в том, чтобы дойти до неё кратчайшим путём. Препятствий нет, и самым оптимальным маршрутом будет движение по перпендикуляру. То есть, расстояние от точки до прямой – это длина перпендикулярного отрезка.

Расстояние в геометрии традиционно обозначают греческой буквой «ро», например: – расстояние от точки «эм» до прямой «дэ».

Расстояние от точкидо прямой выражается формулой

Пример 14.

Найти расстояние от точки до прямой

Решение : всё что нужно - аккуратно подставить числа в формулу и провести вычисления:

Ответ :

П.6.5. Угол между прямыми.

Пример 15.

Найти угол между прямыми .

1. Проверяем перпендикулярны ли прямые:

Вычислим скалярное произведение направляющих векторов прямых:
, значит, прямые не перпендикулярны.
2. Угол между прямыми найдём с помощью формулы:

Таким образом:

Ответ :

Кривые второго порядка. Окружность

Пусть на плоскости задана прямоугольная система координат 0ху.

Кривой второго порядка называется линия на плоскости, определяемая уравнением второй степени относительно текущих координат точки М(х, у, z). В общем случае это уравнение имеет вид:

где коэффициенты А, В, С, D, E, L – любые действительные числа, причем хотя бы одно из чисел А, B, С отлично от нуля.



1.Окружностью называется множество точек на плоскости, расстояние от которых до фиксированной точки М 0 (х 0 , у 0) постоянно и равно R. Точка М 0 называется центром окружности, а число R – ее радиусом

– уравнение окружности с центром в точке М 0 (х 0 , у 0) и радиусом R.

Если центр окружности совпадает с началом координат, то имеем:

каноническое уравнение окружности.

Эллипс.

Эллипсом называется множество точек на плоскости, для каждой из которых сумма расстояний до двух данных точек есть величина постоянная (причем эта величина больше расстояний между данными точками). Данные точки называются фокусами эллипса .

– каноническое уравнение эллипса.

Отношение называется эксцентриситетом эллипса и обозначается: , . Так как , то < 1.

Следовательно, с уменьшением отношение стремится к 1, т.е. b мало отличается от а и форма эллипса становится ближе к форме окружности. В предельном случае при , получается окружность, уравнение которой есть

х 2 + у 2 = а 2 .

Гипербола

Гиперболой называется множество точек на плоскости, для каждой из которых абсолютная величина разности расстояний до двух данных точек, называемыхфокусами , есть величина постоянная (при условии, что эта величина меньше расстояния между фокусами и не равна 0).

Пусть F 1 , F 2 – фокусы, расстояние между ними обозначим через 2с, параметром параболы).

– каноническое уравнение параболы.

Заметим, что уравнение при отрицательном р также задает параболу, которая будет расположена слева от оси 0у. Уравнение описывает параболу, симметричную относительно оси 0у, лежащую выше оси 0х при р > 0 и лежащую ниже оси 0х при р < 0.

Точка пересечения прямых

Пусть нам даны две прямые, заданные своими коэффициентами и . Требуется найти их точку пересечения, или выяснить, что прямые параллельны.

Решение

Если две прямые не параллельны, то они пересекаются. Чтобы найти точку пересечения, достаточно составить из двух уравнений прямых систему и решить её:

Пользуясь формулой Крамера, сразу находим решение системы, которое и будет искомой точкой пересечения :



Если знаменатель нулевой, т.е.

то система решений не имеет (прямые параллельны и не совпадают) или имеет бесконечно много (прямые совпадают ). Если необходимо различить эти два случая, надо проверить, что коэффициенты прямых пропорциональны с тем же коэффициентом пропорциональности, что и коэффициенты и , для чего достаточно посчитать два определителя, если они оба равны нулю, то прямые совпадают:

Реализация

struct pt {double x, y;}; struct line {double a, b, c;}; constdouble EPS =1e-9; double det (double a, double b, double c, double d){return a * d — b * c;} bool intersect (line m, line n, pt & res){double zn = det (m.a, m.b, n.a, n.b);if(abs(zn)< EPS)returnfalse; res.x=- det (m.c, m.b, n.c, n.b)/ zn; res.y=- det (m.a, m.c, n.a, n.c)/ zn;returntrue;} bool parallel (line m, line n){returnabs(det (m.a, m.b, n.a, n.b))< EPS;} bool equivalent (line m, line n){returnabs(det (m.a, m.b, n.a, n.b))< EPS &&abs(det (m.a, m.c, n.a, n.c))< EPS &&abs(det (m.b, m.c, n.b, n.c))< EPS;}

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

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

Совет 1: Как найти координаты точки пересечения двух прямых

Напишем еще три новые функции.

Функция LinesCross() будет определять, пересекаются ли два отрезка . В ней взаимное расположение отрезков определяется с помощью векторных произведений. Для вычисления векторных произведений напишем функцию – VektorMulti().

Функция RealLess() будет использоваться для реализации операции сравнения “<” (строго меньше) для вещественных чисел.

Задача1. Два отрезка заданы своими координатами. Составить программу, которая определяет, пересекаются ли эти отрезки , не находя точку пересечения.

Решение
. Второй задан точками .



Рассмотрим отрезок и точки и .

Точка лежит слева от прямой , для нее векторное произведение > 0, так как векторы положительно ориентированы.

Точка расположена справа от прямой, для нее векторное произведение < 0, так как векторы отрицательно ориентированы.

Для того чтобы точки и , лежали по разные стороны от прямой , достаточно, чтобы выполнялось условие < 0 (векторные произведения имели противоположные знаки).

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

Итак, если , то отрезки пересекаются.

Для проверки этого условия используется функцию LinesCross(), а для вычисления векторных произведений – функция VektorMulti().

ax, ay – координаты первого вектора,

bx, by – координаты второго вектора.

Program geometr4; {Пересекаются ли 2 отрезка?} Const _Eps: Real=1e-4; {точность вычслений} var x1,y1,x2,y2,x3,y3,x4,y4: real; var v1,v2,v3,v4: real;function RealLess(Const a, b: Real): Boolean; {Строго меньше} begin RealLess:= b-a> _Eps end; {RealLess}function VektorMulti(ax,ay,bx,by:real): real; {ax,ay — координаты a bx,by — координаты b } begin vektormulti:= ax*by-bx*ay; end;Function LinesCross(x1,y1,x2,y2,x3,y3,x4,y4:real): boolean; {Пересекаются ли отрезки?} begin v1:=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3); v2:=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3); v3:=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1); v4:=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1); if RealLess(v1*v2,0) and RealLess(v3*v4,0) {v1v2<0 и v3v4<0, отрезки пересекаются} then LinesCross:= true else LinesCross:= false end; {LinesCross}begin {main} writeln(‘Введите координаты отрезков: x1,y1,x2,y2,x3,y3,x4,y4’); readln(x1,y1,x2,y2,x3,y3,x4,y4); if LinesCross(x1,y1,x2,y2,x3,y3,x4,y4) then writeln (‘Да’) else writeln (‘Нет’) end.

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

Введите координаты отрезков: -1 1 2 2.52 2 1 -1 3
Да.

Мы написали программу, определяющую, пересекаются ли отрезки, заданные своими координатами.

На следующем уроке мы составим алгоритм, с помощью которого можно будет определить, лежит ли точка внутри треугольника.

Уважаемый читатель.

Вы уже познакомились с несколькими уроками из серии «Геометрические алгоритмы». Все ли доступно написано? Я буду Вам очень признательна, если Вы оставите отзыв об этих уроках. Возможно, что-то нужно еще доработать.

С уважением, Вера Господарец.

Пусть даны два отрезка. Первый задан точками P 1 (x 1 ;y 1) и P 2 (x 2 ;y 2) . Второй задан точками P 3 (x 3 ;y 3) и P 4 (x 4 ;y 4) .

Взаимное расположение отрезков можно проверить с помощью векторных произведений:

Рассмотрим отрезок P 3 P 4 и точки P 1 и P 2 .

Точка P 1 лежит слева от прямой P 3 P 4 , для нее векторное произведение v 1 > 0 , так как векторы положительно ориентированы.
Точка P 2 расположена справа от прямой, для нее векторное произведение v 2 < 0 , так как векторы отрицательно ориентированы.

Для того чтобы точки P 1 и P 2 лежали по разные стороны от прямой P 3 P 4 , достаточно, чтобы выполнялось условие v 1 v 2 < 0 (векторные произведения имели противоположные знаки).

Аналогичные рассуждения можно провести для отрезка P 1 P 2 и точек P 3 и P 4 .

Итак, если v 1 v 2 < 0 и v 3 v 4 < 0 , то отрезки пересекаются.

Векторное произведение двух векторов вычисляется по формуле:

где:
ax , ay — координаты первого вектора,
bx , by — координаты второго вектора.

Уравнение прямой, проходящей через две различные точки, заданные своими координатами.

Пусть на прямой заданы две не совпадающие точки:P 1 с координатами (x 1 ;y 1) и P 2 с координатами (x 2 ; y 2) .

Пересечение прямых

Соответственно вектор с началом в точке P 1 и концом в точке P 2 имеет координаты (x 2 -x 1 , y 2 -y 1) . Если P(x, y) – произвольная точка на прямой, то координаты вектора P 1 P равны (x — x 1 , y – y 1).

С помощью векторного произведения условие коллинеарности векторов P 1 P и P 1 P 2 можно записать так:
|P 1 P,P 1 P 2 |=0 , т.е. (x-x 1)(y 2 -y 1)-(y-y 1)(x 2 -x 1)=0
или
(y 2 -y 1)x + (x 1 -x 2)y + x 1 (y 1 -y 2) + y 1 (x 2 -x 1) = 0

Последнее уравнение переписывается следующим образом:
ax + by + c = 0, (1)
где
a = (y 2 -y 1),
b = (x 1 -x 2),
c = x 1 (y 1 -y 2) + y 1 (x 2 -x 1)

Итак, прямую можно задать уравнением вида (1).

Как найти точку пересечения прямых?
Очевидное решение состоит в том, чтобы решить систему уравнений прямых:

ax 1 +by 1 =-c 1
ax 2 +by 2 =-c 2
(2)

Ввести обозначения:

Здесь D – определитель системы, а D x ,D y — определители, получающиеся в результате замены столбца коэффициентов при соответствующем неизвестном столбцом свободных членов. Если D ≠ 0 , то система (2) является определенной, то есть имеет единственное решение. Это решение можно найти по следующим формулам: x 1 =D x /D, y 1 =D y /D , которые называются формулами Крамера. Небольшое напоминание, как вычисляется определитель второго порядка. В определителе различают две диагонали: главную и побочную. Главная диагональ состоит из элементов, взятых по направлению от верхнего левого угла определителя в нижний правый угол. Побочная диагональ – из правого верхнего в нижний левый. Определитель второго порядка равен произведению элементов главной диагонали минус произведение элементов побочной диагонали.



Похожие статьи