鉴于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);
}