Опираясь на обсуждения здесь и здесь . Я пытаюсь вычислить кратчайшее расстояние между 3D-линией и 3D-треугольником.
Я использую барицентрические координаты, чтобы определить, находится ли точка внутри треугольника . Поэтому, учитывая треугольник, определенный вершинами UVW
, и линию, определенную точкой AB
, я сначала вычисляю пересечение линии AB
с плоскостью, определенной как UVW
. Давайте назовем это пересечение P
и предположим, что я уже выполнил проверки, чтобы проверить, действительно ли точка действительно пересекает плоскость.
Затем я вычисляю барицентрические координаты (S,T)
, так что S
определяется вдоль края UV
, а T
определяется вдоль края UW
. Естественно, если 0≤S
и 0≤T
и S+T≤1
, тогда P
находится на треугольнике (или его ребре), и мое расстояние до треугольника, очевидно, равно нулю.
Если это не так, тогда P
находится за пределами треугольника, и мне нужно вычислить расстояние. Руководство из первой ссылки говорит, чтобы проецировать точку P
на все три ребра, чтобы получить три балла-кандидата. Добавив эти точки к вершинам трех треугольников, вы получите шесть точек для проверки.
Разве это не проще? Если T<0
, то разве вы не знаете, что UV
является ближайшим краем, и вам нужно только проверить проекцию P на эту линию? Аналогично, если S<0
, то UW
будет ближайшим краем. Если T>0
и S>0
, то VW
является ближайшим краем.
Таким образом, основываясь на знаках S
и T
, вы уже знаете ближайший край и вам нужно только вычислить расстояние от P
до его проекции на этот край. Если проекция не находится внутри треугольника, то ближайшей точкой является либо вершина. Таким образом, ваши расчеты составляют около 1/3 предложенных методов.
Я что-то здесь упускаю или это действительная оптимизация? Я довольно плохо знаком с барицентрическими координатами и их атрибутами.