//擷取面中心點的法線,法線方向統一指向實體外部
Standard_Bool SurfaceCenterNormal(const TopoDS_Face& aFace, gp_Vec& aCNormal)
{
if (aFace.IsNull())
return Standard_False;
BRepAdaptor_Surface aSurface(aFace);
//擷取曲面最大最小UV值
Standard_Real aUmin = aSurface.FirstUParameter();
Standard_Real aUmax = aSurface.LastUParameter();
Standard_Real aVmin = aSurface.FirstVParameter();
Standard_Real aVmax = aSurface.LastVParameter();
//曲面中心點UV值
Standard_Real aMidU = (aUmax + aUmin) / 2;
Standard_Real aMidV = (aVmax + aVmin) / 2;
gp_Pnt aCenterPoint;
gp_Vec aV1, aV2;
//面中心點坐标和此點切線向量
aSurface.D1(aMidU, aMidV, aCenterPoint, aV1, aV2);
//向量叉乘,即中心點法向,也是邏輯方向
aCNormal = aV1.Crossed(aV2);
//法相量的模
double dMagnitude = aCNormal.Magnitude();
//無效相量
if (dMagnitude <= 0.0)
return Standard_False;
//Orientation 擷取曲面相對性實體模型的方向,指向實體模型外部
//TopAbs_REVERSED 邏輯方向與曲面方向相反
//TopAbs_FORWARD 邏輯方向與曲面方向相同
if (aFace.Orientation() == TopAbs_REVERSED)
aCNormal.Reverse();//相量反向
return Standard_True;
}