Самый простой (и очень обобщающий) способ решить эту проблему состоит в том, чтобы сказать, что
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