Как найти точку пересечения двух векторов

Добрый день, возник такой вопрос: есть плоскость, в моем случае y = 0, положение точки 1: (x1, y1, z1), и положение точки 2 (x2, y2, z2). Как найти точку пересечения вектора, направленного от точки 1 к точке 2, и плоскости? Затем нужно посчитать расстояние до этой точки пересечения (но это уже не сложно).

задан 20 Май ’14 14:10

@сергей111: одно замечание по поводу терминологии. Обычно не говорят о пересечении вектора и плоскости. Задачу можно рассматривать в трёх вариантах, проводя либо прямую, либо луч, либо отрезок. В принципе, все они решаются однотипным способом.

@сергей111, Если вы получили исчерпывающий ответ, отметьте его как принятый.

2 ответа

Стандартный способ решения таких задач – использовать параметрическую запись прямой, заданной направляющим вектором и точкой: $$eginx=mt+x_0,\y=nt+y_0,\z=pt+z_0.end$$ Здесь $%(m,n,p)$% – координаты вектора от одной точки до другой, а $%(x_0,y_0,z_0)$% – координаты одной из точек. Подставляете эти значения в уравнение плоскости, откуда находите параметр $%t$%. По этому параметру находите $%(x,y,z)$%.

Введение
Задача

Даны два отрезка, каждый из которых задан двумя точками: (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. Лично я делаю это следующим образом:

Читайте также:  Стоит ли покупать ноутбук dell

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

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

Если точка M, является точкой пересечения двух прямых, то она должна принадлежать этим прямым, а ее координаты удовлетворять уравнения этих прямых.

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

Если система уравнений:

  • имеет единственное решение, то прямые пересекаются;
  • имеет бесконечное множество решений, то прямые совпадают;
  • не имеет решений, то прямые не пересекаются (прямые параллельны между собой)

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

y = 2 x – 1 y = -3 x + 1

Вычтем из первого уравнения второе

y – y = 2 x – 1 – (-3 x + 1) y = -3 x + 1 => 0 = 5 x – 2 y = -3 x + 1

Из первого уравнения найдем значение x

5 x = 2 y = -3 x + 1 => x = 2 5 = 0.4 y = -3 x + 1

Подставим значение x во второе уравнение и найдем значение y

x = 0.4 y = -3·(0.4) + 1 = -1.2 + 1 = -0.2

Ответ. Точка пересечения двух прямых имеет координаты (0.4, -0.2)

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

y = 2 x – 1 x = 2 t + 1 y = t

В первое уравнение подставим значения x и y из второго и третьего уравнений.

t = 2·(2 t + 1) – 1 x = 2 t + 1 y = t => t = 4 t + 1 x = 2 t + 1 y = t =>

-3 t = 1 x = 2 t + 1 y = t => t = – 1 3 x = 2 t + 1 y = t

Подставим значение t во второе и третье уравнение

t = – 1 3 x = 2·(- 1 3 ) + 1 = – 2 3 + 1 = 1 3 y = – 1 3

Ответ. Точка пересечения двух прямых имеет координаты ( 1 3 , – 1 3 )

Решение: Для вычисления координат точки пересечения прямых, решим систему уравнений:

2 x + 3 y = 0 x – 2 3 = y 4

Из второго уравнения выразим y через x

2 x + 3 y = 0 y = 4· x – 2 3

Подставим y в первое уравнение

2 x + 3·4· x – 2 3 = 0 y = 4· x – 2 3 => 2 x + 4·( x – 2) = 0 y = 4· x – 2 3 =>

2 x + 4 x – 8 = 0 y = 4· x – 2 3 => 6 x = 8 y = 4· x – 2 3 =>

Читайте также:  Пользователь удалил свою страницу

x = 8 6 = 4 3 y = 4· x – 2 3 => x = 8 6 = 4 3 y = 4· 4/3 – 2 3 = 4· -2/3 3 = – 8 9

Ответ. Точка пересечения двух прямых имеет координаты ( 4 3 , – 8 9 )

Решение: Обе прямые заданы уравнениями с угловым коэффициентом. Так как k 1 = k 2 = 2, то прямые параллельны. Так как эти прямые не совпадают то точек пересечения нет.

Решим также эту задачу используя систему уравнений:

y = 2 x – 1 y = 2 x + 1

Вычтем из первого уравнения второе

y – y = 2 x – 1 – (2 x + 1) y = -3 x + 1 => 0 = -2 y = -3 x + 1

В первом уравнении получили противоречие (0 ≠ -2), значит система не имеет решений – отсутствуют точки пересечения прямых (прямые параллельны).

Ответ. Прямые не пересекаются (прямые параллельны).

Решение: Подставим координаты точки N в уравнения прямых.

Ответ. Так как оба уравнения превратились в тождества, то точка N – точка пересечения этих прямых.

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

Если система уравнений:

  • имеет единственное решение, то прямые пересекаются;
  • имеет бесконечное множество решений, то прямые совпадают;
  • не имеет решений, то прямые не пересекаются (прямые параллельны или скрещиваются между собой)

Решение: Составим систему уравнений

x – 1 = a y – 1 = a z – 1 = a x – 3 -2 = b 2 – y = b z = b => x = a + 1 y = a + 1 z = a + 1 x – 3 -2 = b 2 – y = b z = b =>

Подставим значения x , y , z из 1, 2, 3 уравнений в 4, 5, 6 уравнения

x = a + 1 y = a + 1 z = a + 1 a + 1 – 3 -2 = b 2 – ( a + 1) = b a + 1 = b => x = a + 1 y = a + 1 z = a + 1 a – 2 -2 = b 1 – a = b a + 1 = b

К шестому уравнению добавим пятое уравнение

x = a + 1 y = a + 1 z = a + 1 a – 2 -2 = b 1 – a = b a + 1 + (1 – a ) = b + b => x = a + 1 y = a + 1 z = a + 1 a – 2 -2 = b 1 – a = b b = 1

Подставим значение b в четвертое и пятое уравнения

x = a + 1 y = a + 1 z = a + 1 a – 2 -2 = 1 1 – a = 1 b = 1 => x = a + 1 y = a + 1 z = a + 1 a – 2 = -2 a = 0 b = 1 =>

x = a + 1 y = a + 1 z = a + 1 a = 0 a = 0 b = 1 => x = 0 + 1 = 1 y = 0 + 1 = 1 z = 0 + 1 = 1 a = 0 a = 0 b = 1

Ответ. Прямые пересекаются в точке с координатами (1, 1, 1).

Решение: Составим систему уравнений заменив во втором уравнении параметр t на a

x = 2 t – 3 y = t z = – t + 2 x = a + 1 y = 3 a – 2 z = 3

Подставим значения x , y , z из 1, 2, 3 уравнений в 4, 5, 6 уравнения

x = 2 t – 3 y = t z = – t + 2 2 t – 3 = a + 1 t = 3 a – 2 – t + 2 = 3 => x = 2 t – 3 y = t z = – t + 2 2 t = a + 4 t = 3 a – 2 t = -1 =>

Читайте также:  Почему в браузере яндекс темнеет экран

Подставим значение t из шестого уравнения в остальные уравнения

x = 2·(-1) – 3 y = (-1) z = -(-1) + 2 2·(-1) = a + 4 -1 = 3 a – 2 t = -1 => x = -5 y = -1 z = 3 a = -6 a = 1 3 t = -1

Ответ. Так как -6 ≠ 1 3 , то прямые не пересекаются.

Оцените статью
ПК Знаток
Добавить комментарий

Adblock
detector