//获取面中心点的法线,法线方向统一指向实体外部
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;
}