Учитывая точку P и треугольник A, B, C, вычислим:
1. the unit normal of triange (A, B, P) - call it N1
2. the unit normal of triangle (B, C, P) - call it N2
(получите заказ правильно!)
Теперь подумайте о точечном произведении N1 * N2. если P находится в плоскости треугольника и внутри трех сторон, эти нормали должны быть параллельны, поэтому это произведение будет 1,0000 (или 0,999 ...). Если P удерживается в плоскости, но выходит за пределы BC, эти две нормали будут противоположными: N1 * N2 == - 1. Если P не в плоскости, произведение точки будет некоторым промежуточным значением. К сожалению, у нас все еще есть лазейка - если P выходит за пределы CA. Нам нужно вычислить еще один:
3. the unit normal (C,A,P) called N3
Сделайте эти два теста (в идеальном мире):
N1*N2 == 1.0 ?
N2*N3 == 1.0 ?
(тестирование N3 * N1 является избыточным) Конечно, тест должен допустить некоторое отклонение от недостатков компьютерной арифметики. Найдите (N1 * N2> 1-эпсилон), где эпсилон - это небольшое значение, зависящее от необходимой точности и типов с плавающей запятой.
Возможно, вам понадобится формула для этих единиц нормалей. Учитывая (A, B, C), вычислите перекрестное произведение N = (B-A) x (C-B). Затем разделите на sqrt (N * N). Определения «точечного произведения» и «перекрестного произведения» легко найти в учебниках, википедии и т. Д. С некоторой алгеброй можно повысить производительность примерно до квадратных корней.
Я не утверждаю, что это самый быстрый алгоритм, но он должен работать (до тех пор, пока