2016-10-13 6 views
0

Учитывая 3D твердую модель и ребро, я проверяю, является ли этот край вогнутым или выпуклым.Является ли этот край 3D сплошным вогнутым или выпуклым?

Каков наилучший способ для этого? Я хотел бы свести к минимуму предположения относительно входной геометрии. Мой первый проход при задании принимает среднее значение вершин двух соседних граней для создания центральных точек, смещает одну из этих точек лицом, нормальным в этой точке, и проверяет, находится ли точка смещения ближе или ближе к противоположной грани, чем оригинал. Это работает для пар простых лиц, примерно одинакового размера. Например, он терпит неудачу, когда маленькие лица находятся далеко от центра больших лиц.

Я делаю это в Revit, но я думаю, что проблема такая же у Rhino, Catia, любого твердого модельера. Из края я могу извлечь смежные грани. Я знаю, что лица ориентированы правильно, так что нормали указывают наружу. Я могу проецировать 3D-очки для лица, вычислить нормали граней в этих точках и т.д.

Вот код для наивной версии:

public static Boolean AreFacesConcave(Face face_0, Face face_1, Document doc) 
    { 
     UV uvMid_0 = VertexAverageUV(face_0); //3D average of the vertices 
     UV uvMid_1 = VertexAverageUV(face_1); // approximates the center of the face 

     XYZ pt_0 = face_0.Evaluate(uvMid_0); 
     XYZ pt_1 = face_1.Evaluate(uvMid_1); 

     // normals at those points 
     XYZ normal_0 = face_0.ComputeNormal(uvMid_0); 
     XYZ normal_1 = face_1.ComputeNormal(uvMid_1); 

     // third point, offset from face 2 by normal 
     XYZ pt_2 = pt_1.Add(normal_1.Normalize()); 


     Double d0 = pt_0.DistanceTo(pt_1); 
     Double d1 = pt_0.DistanceTo(pt_2); 

     return (d1 < d0); 

    } 

ответ

0

Если вы знаете, что нормальные векторы всегда являются внешними, получаю две точки A и B внутри двух смежных граней (либо три из трех неколлинеарных вершин, либо ваши «центральные точки»).

Затем проверьте знак точечного (скалярного) произведения векторов AB и nA (нормали к грани, содержащей точку A).

Result = DotProduct(AB, nA) 

Отрицательный знак обозначает «выпуклый» край, положительный - «вогнутый».

2D пример: пА внешней нормали, D-кромка для CDF является вогнутой, D-кромка для CDE выпукла

enter image description here