Пересечение линии/плоскости по точкам

У меня есть две точки в пространстве, L1 и L2, которые определяют две точки на линии.

У меня есть три точки в пространстве, P1, P2 и P3, которые 3 точки на плоскости.

Итак, учитывая эти входные данные, в какой точке прямая пересекает плоскость?

FX. уравнение плоскости A*x+B*y+C*z+D=0:

A = p1.Y * (p2.Z - p3.Z) + p2.Y * (p3.Z - p1.Z) + p3.Y * (p1.Z - p2.Z)
B = p1.Z * (p2.X - p3.X) + p2.Z * (p3.X - p1.X) + p3.Z * (p1.X - p2.X)
C = p1.X * (p2.Y - p3.Y) + p2.X * (p3.Y - p1.Y) + p3.X * (p1.Y - p2.Y)
D = -(p1.X * (p2.Y * p3.Z - p3.Y * p2.Z) + p2.X * (p3.Y * p1.Z - p1.Y * p3.Z) + p3.X * (p1.Y * p2.Z - p2.Y * p1.Z))

Но как насчет остальных?


person Morten Nielsen    schedule 08.02.2011    source источник


Ответы (2)


Самый простой (и очень обобщающий) способ решить эту проблему состоит в том, чтобы сказать, что

L1 + x*(L2 - L1) = (P1 + y*(P2 - P1)) + (P1 + z*(P3 - P1))

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

Для альтернативного подхода векторное произведение N (P2-P1) и (P3-P1) представляет собой вектор, который находится под прямым углом к ​​плоскости. Это означает, что плоскость может быть определена как набор точек P, так что скалярное произведение P и N является скалярным произведением P1 и N. Решение для x таким образом, что (L1 + x*(L2 - L1)) dot N является этой константой, дает вам одно уравнение с одной переменной, которое легко решить. Если вы собираетесь пересекать много линий этой плоскостью, этот подход определенно стоит того.

Написано явно, это дает:

N = cross(P2-P1, P3 - P1)
Answer = L1 + (dot(N, P1 - L1) / dot(N, L2 - L1)) * (L2 - L1)

куда

cross([x, y, z], [u, v, w]) = x*u + y*w + z*u - x*w - y*u - z*v
dot([x, y, z], [u, v, w]) = x*u + y*v + z*w

Обратите внимание, что этот трюк с перекрестным произведением только работает в 3 измерениях и только для вашей конкретной проблемы плоскости и линии.

person btilly    schedule 08.02.2011
comment
Интернет уже завален уравнениями для этого, но не тем окончательным уравнением, которое вам нужно для нахождения x, y, z. Что мне было нужно, так это фактический окончательный набор простых формул для получения x, y, z результата. Этот ответ по-прежнему требует решения уравнений, так что это лишь очень малая часть ответа. Я прошу ответ, например: x = [формула, основанная на P1.X, P1.Y, P1.Z, P2.X... и т. д.] и аналогично для y и z. - person Morten Nielsen; 09.02.2011
comment
@Morten Nielsen: Причина этого в том, что финальное уравнение чудовищно, его невозможно понять, и оно гарантированно будет неправильно введено в вашу программу. Тем более, что я не знаю, как вы представляете свои очки. Но я отредактирую свой узел, чтобы сделать формулу перекрестного произведения более понятной для вас. - person btilly; 09.02.2011

Вот как я сделал это в коде прихода. К счастью, в одной библиотеке кода (XNA) была половина того, что мне было нужно, а остальное было легко.

var lv = L2-L1;
var ray = new Microsoft.Xna.Framework.Ray(L1,lv);
var plane = new Microsoft.Xna.Framework.Plane(P1, P2, P3);

var t = ray.Intersects(plane); //Distance along line from L1
///Result:
var x = L1.X + t * lv.X;
var y = L1.Y + t * lv.Y;
var z = L1.Z + t * lv.Z;

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

person Morten Nielsen    schedule 09.02.2011
comment
Это не вопрос о XNA. - person ideasman42; 03.03.2015