2016-10-13 67 views
0

給定一個三維實體模型和一個邊,我測試這個邊是凹的還是凸的。這是一個三維固體邊緣凹或凸?

這樣做的最好方法是什麼?我想盡量減少有關輸入幾何的假設。我在這個問題上的第一次傳球需要兩個相鄰人臉的頂點的平均值生成中心點,用這個點上的人臉法線偏移其中一個點,然後測試偏移點離對面人臉的距離是否更接近或更遠原本的。這適用於大小相同的簡單面對。例如,它失敗了,面對遠離較大面部中心的小面。

我在Revit中這樣做,但我想象的問題是犀牛,卡蒂亞,任何可靠的建模者都一樣。從邊緣我可以提取相鄰的面。我知道面孔的方向是正確的,法線指向外面。我可以預測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例如:NA是外向法線,d-邊緣爲CDF是凹的,用於CDE d-邊緣是凸

enter image description here