簡體   English   中英

這是3D立體凹面還是凸面的邊緣?

[英]Is this Edge of a 3D solid Concave or Convex?

給定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);

    }

如果知道法線向量總是向外,則在兩個相鄰的面內得到兩個點A和B(三個非共線頂點的平均值或您的“中心點”)。

然后檢查矢量AB和nA的點(標量)乘積的符號(垂直於包含點A的面)。

 Result = DotProduct(AB, nA)

負號表示“凸”邊,正號表示“凹”邊。

2D示例:nA是向外法線,CDF的D邊緣是凹面,CDE的D邊緣是凸面

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM