这个边缘是3D立体凹面还是凸面?

时间:2016-10-13 05:17:36

标签: c# 3d geometry revit-api

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

    }

1 个答案:

答案 0 :(得分:0)

如果你知道法向量总是向外,那么在两个相邻面内得到两个点A和B(三个非共线顶点的平均值或你的&#39;中心点&#39;)。

然后检查向量AB和nA的点(标量)乘积的符号(垂直于包含A点的面)。

 Result = DotProduct(AB, nA)

负号表示&#39;凸&#39;边缘,正面 - 凹面&#39;之一。

2D示例:nA是向外法线,CDF的D边是凹的,CDE的D边是凸的

enter image description here