3D-линия — пересечение плоскостей?

У меня есть два вектора (X, Y, Z), один выше Y=0 и один ниже Y=0. Я хочу найти вектор (X, Y, Z), где линия между двумя исходными векторами пересекается с уровнем Y=0. Как мне это сделать?

Пример точки А:

X = -43.54235
Y = 95.2679138
Z = -98.2120361

Пример точки Б:

X = -43.54235
Y = 97.23531
Z = -96.24464

Эти точки считываются из двух непроекций по щелчку пользователя, и я пытаюсь нацелить непроекцию на Y=0.

(Я нашел пересечение плоскости трехмерной линии с простой плоскостью, но не не понимаю принятый ответ, так как он для 2D)


person Cobra_Fast    schedule 07.12.2010    source источник


Ответы (2)


Я подозреваю, что под двумя векторами вы действительно подразумеваете две точки и хотите пересечь линию, соединяющую эти две точки с плоскостью, определенной Y=0.

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

<A + (D - A)*u, B + (E - B)*u, C + (F - C)*u>

Где <A,B,C> — одна из ваших точек, а <D,E,F> — другая. u — это неопределенный скаляр, который используется для вычисления точек вдоль этой линии.

Поскольку вы пересекаете эту линию с плоскостью Y=0, вам просто нужно найти точку на линии, где отрезок "Y" равен 0.

В частности, найдите u в B + (E - B)*u = 0, а затем верните его в исходное линейное уравнение, чтобы найти компоненты X и Z.

person Walt W    schedule 07.12.2010
comment
Я не понимаю. Как мне определить линию, когда я еще не знаю тебя? Кроме того, как мне применить этот скаляр, если я в конце концов его получу? - person Cobra_Fast; 08.12.2010
comment
u неизвестно; позвольте мне попытаться выразить это так: линию можно рассматривать как набор точек, которые выстраиваются в линию. Правильно? u — это способ найти любую конкретную точку на линии, которую вы ищете. И вы пытаетесь найти единственную точку, лежащую на плоскости Y=0. Когда у вас есть u (которое можно найти, потому что вы знаете, что вам нужно значение u, которое делает ваше предложение Y=0 истинным), просто подставьте A + (D - A)*u, чтобы получить X, или C + (F - C)*u, чтобы получить Z. - person Walt W; 08.12.2010
comment
Я не понимаю, как мне получить скаляр для Y=0 из -B / (E - B). В настоящее время похоже, что скаляр масштабируется дальше от Y = 0, чем ближе к нему. - person Cobra_Fast; 08.12.2010
comment
Если вы используете u = -B / (E - B) и подставляете его в исходное уравнение точки на линии <A + (D - A)*u, B + (E - B)*u, C + (F - C)*u>, вы получите точку на линии между двумя вашими точками, которая пересекается в точке Y=0. - person Walt W; 08.12.2010
comment
С визуальной точки зрения ваше значение u — это расстояние между двумя вашими точками, на котором происходит пересечение с Y=0. Например, если u=0, то <A,B,C> находится в Y=0. Если u=1, то <D,E,F> находится в Y=0. Если u=0.5, то Y=0 точно между двумя точками. Если u=2.0, то Y=0 находится ближе к вашей второй точке, но находится на дополнительном расстоянии, равном и в направлении расстояния между вашими точками. Модным словом для этого является интерполяция. - person Walt W; 08.12.2010
comment
В моем случае u ~= -46 так будет ближе к первой точке, да? Применение u обратно к X и Z вообще не меняет X и относительно увеличивает Z. Я делаю что-то неправильно? - person Cobra_Fast; 08.12.2010
comment
Каковы ваши два пункта? Это единственный способ помочь вам в отношении действительных чисел :) И нет, X вообще не меняется, не является неразумным, если ваши две точки имеют одинаковую X-координату. И относительное масштабирование Z также разумно. - person Walt W; 08.12.2010
comment
Мои точки зрения варьируются в зависимости от того, где пользователь нажимает на экран. Я успешно перепроецирую этот щелчок куда-то далеко в положительную сторону Y. Имея ближнюю и дальнюю непроекцию, я разбираю тебя. В любом случае, я сразу же добавлю примеры значений из отладки в вопрос. - person Cobra_Fast; 08.12.2010
comment
Хорошо, похоже, что в моем коде непроецирования есть одна или две ошибки, так как с этим он работает лучше. Спасибо. - person Cobra_Fast; 08.12.2010

Уравнение для линии

(x–x1)/(x2–x1)  = (y–y1)/(y2–y1) = (z–z1)/(z2–z1)  

Таким образом, создание y=0 дает ваши координаты пересечения.

x = -y1 * (x2-x1)/(y2-y1) + x1 

и

z = -y1 * (z2-z1) /(y2-y1) + z1 
person Dr. belisarius    schedule 07.12.2010
comment
Не следует ли float z = -y1 * (z2 - z1) / (y2 - y1) + z1;? - person user8709; 22.03.2014
comment
@ user8709 Ага. Спасибо. Исправлено - person Dr. belisarius; 26.03.2014