2016-10-13 5 views
0

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

    } 

답변

0

얻을 두 인접한면 안의 두 점 A와 B (세 개의 비 동일 선상 꼭지점 또는 '중심점'중 하나).

그런 다음 벡터 AB 및 nA (점 A가 들어있는면에 수직)의 도트 (스칼라) 부호의 부호를 확인하십시오.

Result = DotProduct(AB, nA) 

음수 기호는 'convex'edge, positive - 'concave'one을 나타냅니다.

예 2D : 노나 외측 정상, D 에지 CDF 용 오목하다 CDE 용 D 가장자리가 볼록

enter image description here

관련 문제