Учитывая 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);
}