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

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

  • автор:

Точка пересечения 2 векторов

Координаты x,y я то нашел, спроецировав на плоскость вектора.

#1
12:45, 15 июня 2008

stl
А что такое пересечение векторов?

#2
13:06, 15 июня 2008

Есть обобщенная задача — поиск двух БЛИЖАЙШИХ ТОЧЕК у двух отрезков в пространстве. Я щас не дома и не могу показать код, да и в двух словах алгоритм не опишешь. Гугли.

#3
13:30, 15 июня 2008

stl
>Даны 2 вектора: x1,y1,z1; x2,y2,z2;
Как найти точку пересечения?
Элементарно: (0; 0; 0)

#4
13:43, 15 июня 2008

если честно , я не понял ваших ответов. Мне нужны не ближайшие точки, и причем тут 0,0,0 я тоже не понял.

2 вектора точно пересекаются в пространстве в какой-то точке. У векторов есть координаты начала и конца. Найти x,y точки пересечения легко — проецируем на экран, отбрасывая z, находим.

А как найти координату z, если она может потребоваться в дальнейшем?

#5
13:46, 15 июня 2008

1 | Точка пересечения 2 векторов

#6
13:52, 15 июня 2008

stl
>2 вектора точно пересекаются в пространстве в какой-то точке. У векторов есть
>координаты начала и конца.

У настоящих брутальных векторов координаты начала находятся в точке

  • Tweedle Dee
  • Постоялец

#7
13:57, 15 июня 2008

ты у каждого вектора указал лишь один набор координат. потому их от (0,0,0) и отсчитали 😉 вопрос надо правильней формулировать. тебя интересует пересение ОТРЕЗКОВ? ну так элементарно, пусть отрезки

(x1, y1, z1) — (x2, y2, z2) и (a1, b1, c1) — (a2, b2, c2)
тогда уравнение первого
x = x1*t + x2*(1 — t)
y = y1*t + y2*(1 — t)
z = z2*t + z2*(1 — t)

аналогично для второго
x = a1*s + a2*(1 — s)
y = b1*s + b2*(1 — s)
z = c2*s + c2*(1 — s)

приравниваем x,y,z, получаем

x1 t + x2 (1 — t) = a1 s + a2 (1 — s)
y1 t + y2 (1 — t) = b1 s + b2 (1 — s)

система из 2 уравнений с 2мя неизвестными, решаем, подставляем s и t во третьи уравнения, убеждаемся, что z-координаты совпали тоже (если нет, то и пересечения нет)

#8
14:09, 15 июня 2008

stl
>У векторов есть координаты начала и конца
А нету!

Вектор это упорядоченное конечное множество своих координат.
Вектор может представлять множество отрезков, которые будут по длине равны абсолютному значению вектора и паралельны.
И вот разница координат отрезков следовательно равна координатам вектора.
Если проще, вектор — это не отрезок. Вектор — это точка. А его направление — это направление отрезка из начала координат в эту точку.

#9
14:10, 15 июня 2008

Tweedle Dee
>ты у каждого вектора указал лишь один набор координат. потому их от (0,0,0) и отсчитали 😉
Он указал правильно а отсчитывают от нулей всегда.

#10
14:14, 15 июня 2008

>У настоящих брутальных векторов координаты начала находятся в точке
Координаты у труЪ-математиков задаются либо (0; 0; 0) либо А вот — смахивает на неупорядоченное множество.

#11
14:24, 15 июня 2008

stl
Короче объясняю.
Такс. Если у тебя есть отрезок <(x1; y1; z1), (x2; y2; z2)>то вектор, который задаст множество отрезков, равных по модулю длине твоего отрезка и паралельных ему равен (x2 — x1; y2 — y1; z2 — z1). И любой отрезок, входящий в это множество будет равен <(c1 + x1; c2 + y1; c3 + z1), (c1 + x2; c2 + y2; c3 + z2)>,
Отрезок, совпадающий с радиус-вектором на графике будет равен <(0; 0; 0), >.
Где c1, c2, c3 — произвольные константы из множества декартовой степени 1/n пространства, которому принадлежит вектор, где n — мерность пространства. Например пространство R^3 возводим в декартовую степень 1/3 получаем R — множество действительных чисел (частный случай для трёхмерного пространства).
x, y, z — координаты вектора, равные x2 — x1, y2 — y1 и z2 — z1 соответственно.

ПРАВКА: поумничал малость
ПРАВКА: афрографея
ПРАВКА: поумничал малость

  • Sbtrn. Devil
  • Постоялец

#12
15:21, 15 июня 2008

Векторы в пространстве — не пересекаются! Их пересечение возможно только при строгом и абсолютно точном соотношении параметров (как минимум, «лежат в одной плоскости»). Однако, поскольку в реальном мире имеют место квантовые флуктуации, а малейшего отклонения параметра достаточно для разрушения необходимого равенства (в случае компутера эта особенность физического мира симулируется неабсолютной точностью вычислений), то вероятность пересечения изничтожающе стремится к нулю.

А поэтому мораль такова: не надо математически эстетствовать, ибо жизнь сурова. А надо взять и найти, как предлагали в посте 2, ближайшие точки A и B обоих векторов. Если расстояние AB меньше некоторого епсилон (скажем, 0.001), то можно условно считать, что вектора пересеклись, и точка пересечения — середина AB. Если же больше епсилона — значит, не пересеклись.

  • Alexander K
  • Постоялец

Определение точки пересечения двух отрезков

Пусть даны два отрезка. Первый задан точками P1(x1;y1) и P2(x2;y2). Второй задан точками P3(x3;y3) и P4(x4;y4).

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

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

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

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

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

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

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

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

Пусть на прямой заданы две не совпадающие точки:P1 с координатами (x1;y1) и P2 с координатами (x2; y2). Соответственно вектор с началом в точке P1 и концом в точке P2 имеет координаты (x2-x1, y2-y1). Если P(x, y) – произвольная точка на прямой, то координаты вектора P1P равны (x — x1, y – y1).

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

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

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

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

например есть вектор AB равный 6, 2. И вектор CD 0, -3. Как узнать существует ли точка пересечения, и если да то как ее найти?

  • Вопрос задан более трёх лет назад
  • 2919 просмотров

3 комментария

Простой 3 комментария

Вектор — это, грубо говоря, направление. Потому вопрос бессмысленный.

Можно говорить о пересечении отрезков или прямых. Но не векторов.

Вы должны задать координаты обоих концов (A и B, C и D).

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

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

Решения вопроса 1

Griboks

Вам надо научиться гуглить — первая ссылка.
Ответ написан более трёх лет назад
Нравится 1 4 комментария

samodum

Пересечение прямых и отрезков — немного разные вещи. Прямые, на которых лежат отрезки, могут пересекаться, а вот сами отрезки — нет

Griboks

Developer, тут идёт речь про вектора. Это не прямые и не отрезки.

samodum

Griboks, тогда почему у вас ответ про прямые, а не вектора?
Замечу, что вектор — это отрезок, имеющий направление, что в данном случае совершенно не важно. Но вектор — это никак не прямая.

Где в вашем ответе ответ на первую часть вопроса — «Как узнать существует ли точка пересечения»?

Griboks

Developer, вы, видимо, не читали мой ответ, если не увидели достаточного условия пересечения.

Замечу, что вектор — это отрезок, имеющий направление

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

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

Уравнения линий имеют вид

Pa = P1 + ua ( P2P1 )

Pb = P3 + ub ( P4P3 )

Решение относительно точки Pa = Pb дает два уравнения на координаты (ua и ub)

x1 + ua (x2 — x1) = x3 + ub (x4 — x3)
и
y1 + ua (y2 — y1) = y3 + ub (y4 — y3)

Решая относительно ua и ub имеем

Подстановка любого из этих значений в соответствующее уравнение прямой даст точку пересечения. Пусть, например, точка пересечения (x,y):

x = x1 + ua (x2 — x1)

y = y1 + ua (y2 — y1)

BOOL IsLinesCross(_int64 x11, _int64 y11, _int64 x12, _int64 y12, _int64 x21, _int64 y21, _int64 x22, _int64 y22) < _int64 maxx1 = max(x11, x12), maxy1 = max(y11, y12); _int64 minx1 = min(x11, x12), miny1 = min(y11, y12); _int64 maxx2 = max(x21, x22), maxy2 = max(y21, y22); _int64 minx2 = min(x21, x22), miny2 = min(y21, y22); if (minx1 >maxx2 || maxx1 < minx2 || miny1 >maxy2 || maxy1 < miny2) return FALSE; // Момент, када линии имеют одну общую вершину. _int64 dx1 = x12-x11, dy1 = y12-y11; // Длина проекций первой линии на ось x и y _int64 dx2 = x22-x21, dy2 = y22-y21; // Длина проекций второй линии на ось x и y _int64 dxx = x11-x21, dyy = y11-y21; _int64 div, mul; if ((div = (_int64)((double)dy2*dx1-(double)dx2*dy1)) == 0) return FALSE; // Линии параллельны. if (div > 0) < if ((mul = (_int64)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul >div) return FALSE; // Первый отрезок пересекается за своими границами. if ((mul = (_int64)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul >div) return FALSE; // Второй отрезок пересекается за своими границами. > if ((mul = -(_int64)((double)dx1*dyy-(double)dy1*dxx)) < 0 || mul >-div) return FALSE; // Первый отрезок пересекается за своими границами. if ((mul = -(_int64)((double)dx2*dyy-(double)dy2*dxx)) < 0 || mul >-div) return FALSE; // Второй отрезок пересекается за своими границами. return TRUE; >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *