LINUX.ORG.RU

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

 ,


0

1

Помогите вывести уравнение для пересечения 2х прямых в пространстве. Моя попытка как-то не удалась.

 (x-xo)/p=(y-yo)/q=(z-zo)/r
 (x-x1)/p1=(y-y1)/q1=(z-z1)/r1

 x=(xo*q*p1 - x1*q1*p - yo*p*p1 + y1*p*p1) / (q*p1-q1*p) 
 y=(yo*p*q1 - y1*p1*q - xo*q*q1 + x1*q*q1) / (p*q1-p1*q)
 z=(zo*q*r1 - z1*q1*r - yo*r*r1 + y1*r*r1) / (q*r1-q1*r)
Вот пример вывода для x, в нём я приравниваю всё к 0, взяв z=z0, что было слизано отсюда
 1. (x-xo)/p=(y-yo)/q=(z-zo)/r
 (x-x1)/p1=(y-y1)/q1=(z-z1)/r1
 2.z=z0; вот так, наверное, делать нельзя
 (x-xo)/p=(y-yo)/q = 0
 (x-x1)/p1=(y-y1)/q1 = z0-z1/r1
 3. y=(x-xo)*q/p+yo
 y=(x-x1)*q1/p1+y1 
 4. (x-xo)*q/p+yo=(x-x1)*q1/p1+y1
 5. (x-xo)*q*p1+yo*p*p1=(x-x1)*q1*p+y1*p*p1
 6. x*(q*p1-p*q1)=xo*q*p1-x1*q1*p-yo*p*p1+y1*p*p1
 7. x=(xo*q*p1-x1*q1*p-yo*p*p1+y1*p*p1)/(q*p1-p*q1)

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

AIv ★★★★★
()

Что там составлять?
У тебя есть две прямые, если записать в векторной форме:

g1 = p1 + l*v1
g2 = p2 + m*v2
g - радиус вектор точки прямой, p - радиус вектор точки, задающей прямую, v - направляющий вектор, задающий прямую.

Приравниваешь g1 = g2, получаешь систему уравнений три уравнения с двумя неизвестными (m и l). Решаешь её.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)

посмотрите пожалуйста, по ссылке бред написан или этим можно пользоваться, но в каких-то особых случаях? Только когда прямые скрещиваются, к примеру

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от AIv

Эти уравнения называются параметрическими уравнениями прямой. Они имеют механический смысл: если параметр t рассматривать как время, а x, y, z — как координаты материальной точки, то параметрические уравнения описывают равномерное прямолинейное движение точки

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

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Это расстояние от задающей точки px до заданной точки на прямой, направляющий если вектор vx — орт.

Anon
()

если приравнять z=0, найти точки пересечения проекций.

anonymous
()
Ответ на: комментарий от pseudo-cat

Действительные числа, которые тебе надо найти.

Подставив одно из них в уравнение на g1 или g2 найдёшь это самое g1 = g2 - точку пересечения.

Если уравнения линейно независимы, что означает, что соответстующая система несовместна - то пересечений нет.

Подходит для любой размерности.

aedeph_ ★★
()
Последнее исправление: aedeph_ (всего исправлений: 1)
Ответ на: комментарий от aedeph_

я правильно тебя понял?

p1 + l*v1 = p2 + m*v2
p1 = (x0,y0,z0)
p2 = (x1,y1,z1)
v1 = (p, q, r)
v2 = (p1, q1, r1)
(x0+l*p, y0+l*q, z0+l*r) = (x1+m*p1, y1+m*q1, z1+m*r1)

[ x0+l*p = x1+m*p1
[ y0+l*q = y1+m*q1
[ z0+l*r = z1+m*r1

l = (x1+m*p1-x0)/p
m = (y0+l*q-q1)/q1
l = (x1+(y0+l*q-q1)*p1/q1 - x0)/p
l*p*q1 + x0*q1 = x1*q1 + y0*p1 + l*q*p1 - q1*p1
l*p*q1 - l*q*p1 = x1*q1 + y0*p1 - q1*p1 - x0*q1
l = (x1*q1 + y0*p1 - q1*p1 - x0*q1) / (p*q1 - q*p1)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

(x0+l*p, y0+l*q, z0+l*r) = (x1+m*p1, y1+m*q1, z1+m*r1)

Понял правильно. Арифметику проверять не буду.

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

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

а случай, когда система не имеет решения(либо знаменатель равен 0), нельзя считать условием, что прямые не пересекаются?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

а случай, когда система не имеет решения(либо знаменатель равен 0), нельзя считать условием, что прямые не пересекаются?

Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. стр.87, кратчайшее расстояние между прямыми в пространстве, формула 3.4-10. Если d=0, то пересекаются.

quickquest ★★★★★
()

ТС, осиль LaTeX, читать тяжело же.

BattleCoder ★★★★★
()
Ответ на: комментарий от pseudo-cat

Если знаменатель равен 0, то есть два варианта: решений нет, решений бесконечное множество.

anonymous
()
Ответ на: комментарий от pseudo-cat

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

и по логике aa' - это векторное произведение, понял теперь

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Ну скачай Корна, посмотри, он и в дальнейшем пригодится. Там громоздкая формула, мне лень по клавишам тыкать :)

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

я по ней и говорю, там формула -

d1 = |[(r1-r1')aa']| / |axa'|
только я что-то запутался где какое произведение. Если векторное произведение - *, то получается так -
((r1-r1') * aa') / (a  * a')
где aa' - скалярное?

pseudo-cat ★★★
() автор топика
Последнее исправление: pseudo-cat (всего исправлений: 2)
Ответ на: комментарий от pseudo-cat

только я что-то запутался где какое произведение.

В числителе — скалярное aa, в знаменателе — векторное a x a.

quickquest ★★★★★
()
Ответ на: комментарий от pseudo-cat

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

quickquest ★★★★★
()
Ответ на: комментарий от pseudo-cat

то есть когда векторное произведение a*a' = (0,0,0)?

тогда они параллельны или совпадают, при наличии хотя бы 1 общей точки.

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

в итоге,

  • 0~(0,0,0)
  • если числитель = 0 и знаменатель = 0, то 2 прямые совпадают
  • если числитель != 0, а знаменатель = 0, то параллельны
  • если числитель = 0, а знаменатель != 0, то пересекаются

верно?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

m и l - параметры, задавая которые ты получишь все точки на прямой соответствующей прямой.

Если ты вспомнишь, что из себя представляет сумма векторов (графически, «правило треугольника»), то довольно очевидно будет.

invy ★★★★★
()
Ответ на: комментарий от quickquest

так как (r1-r1') - вектор, а скалярное произведение aa' - число, то получается вектор с координатами ((x1-x1')*aa; (y1-y1')*aa; (z1-z1')*aa')

Или я что-то не так понял?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от quickquest
Прямая 1: M(0;0;0), R(10;10;10)
Прямая 2: M(10;0;0), R(-10;10;10)
Очевидно, что пересекаются в точке (5;5;5), хотя я уже ни в чём не уверен

r1-r1' = (0;0;0) - (10;0;0) = (-10;0;0)
aa' = (10;10;10) (-10;10;10) = -100 + 100 + 100 

третье слагаемое в aa' никак не приводит общую сумму к 0

в общем это как-то не так работает

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Я, кажется, ошибся. Совсем забыл, про третье уравнение. Если знаминатель равен 0 и числитель равен 0, то надо рассматривать одно из первых двух и третье уравнения. В этом случае первые два уравнения получаются эквивалентными.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.