Методы, которое мы сейчас рассмотрим, также можно использовать для нахождения пересечения прямой и плоскости. Пересечения с более сложными многоугольниками можно найти путем их триангуляции.
Исходник, помещенный внизу, скорее иллюстрирует путь решения, нежели действительно эффективен.
Модель и соглашения о наименованиях обозначены на данном рисунке
Процедура, которую мы сейчас рассмотрим, будет получать на входе отрезок, заданный двумя точками, и треугольник, заданный тремя вершинами.
Решение будет состоять из следующих шагов
Проверка: параллельна ли прямая плоскости
Нахождение пересечения плоскости треугольника с отрезком
Проверка: лежит ли точка пересечения на отрезке
Проверка: лежит ли точка пересечения внутри треугольника
Точка пересечения P находится подстановкой в уравнение плоскости Ax + By + Cz + D = 0 уравнения прямой P = P1 + мю (P2 - P1).
Заметим, что значения A,B,C являются компонентами вектора нормали к плоскости, который можно найти взятием векторного произведения любых двух нормализованных векторов, например
(A,B,C)
= (Pb - Pa) cross (Pc - Pa)
D можно затем получить, подставлив одну из вершин в уравнение плоскости, например
A Pax + B Pay + C Paz = -D
Это дает нам выражение для мю, из которого точка пересечения P может быть найдена через уравнение прямой.
мю =
( D + A P1x + B P1y + C P1z ) /
( A (P1x - P2x)
+ B (P1y - P2y)
+ C (P1z - P2z) )
Если знаменатель выше равен нулю, то прямая параллельна плоскости и пересечения нет. Для того, чтобы точка пересечения лежала на отрезке, мю должно принимать значения от 0 до 1.
Ну и в последнюю очередь необходимо установить, лежит ли точка пересечения внутри треугольника, ограниченного Pa, Pb, Pc.
Способ, которым мы воспользуемся, опирается на то, что сумма внутренних углов вида вершина-точка-вершина равна 2pi, если точка внутри треугольника. Для точки вне треугольника эта сумма будет меньше. Очевидно, сумма берется для одной точки - точки пересечения линии и плоскости и по всем сочетаниям вершин, как проиллюстрировано на рисунке
Если мы вычислим единичные векторы Pa1,
Pa2, Pa3 как (мы проверяем точку P на принадлежность треугольнику)