曲率是曲线和曲面的重要性质,表征了几何的“弯曲程度”。曲率越大,越弯曲;曲率越小,越趋近于直线、平面。直线、平面的曲率为零。
在《曲面网格剖分》中,介绍了,可以通过控制曲面的曲率划分网格。在曲率大的地方,网格密一些;曲率小的地方,网格疏一些。并且在参考1中,4.2.5节中,可以通过控制不同曲率处离散边界的长度而控制离散边与几何的误差。故本文介绍几何曲线、曲面的曲率的求法,以及使用曲率控制网格划分。
1.曲线曲率
曲线曲率定义为:曲线上一点的切线相对于弧长的变化快慢,示意图及计算公式如下,用到曲线的一阶、二阶导数。
曲线曲率需要解决如下几个量的计算:曲率半径(曲率倒数),切线(一阶导数)、法线,密切圆圆心,密切圆所在平面。
密切圆圆心为,切点沿着法线方向,移动曲率半径的距离。密切圆所在平面为,切向量与法向量所在的平面。
使用OCC提供的,BRepLProp_CLProps类,可以计算曲线的上述信息。以下代码,求一条空间Bezier曲线上的曲率圆。
TopoDS_Edge aEdgeCurve = BRepBuilderAPI_MakeEdge(&bezierFace1);
BRepAdaptor_Curve aCurveAda(aEdgeCurve);
BRepLProp_CLProps aCurveLocalProp(aCurveAda, 2, 0.00001); //注意此值的取法,不可太大
Standard_Real interVal_c = (u1 - u0) / 5;
for (int i = 0; i < 6; i++) {
aCurveLocalProp.SetParameter(u0 + i * interVal_c);
gp_Pnt center;
gp_Dir tanDir;
gp_Dir normalDir;
aCurveLocalProp.CentreOfCurvature(center);
Standard_Boolean f=aCurveLocalProp.IsTangentDefined();
aCurveLocalProp.Tangent(tanDir);
aCurveLocalProp.Normal(normalDir);
//切线法线定义一个平面,曲率圆在这个平面上
normalDir.Cross(tanDir);
gp_Circ cir(gp_Ax2(center, normalDir), 1 / aCurveLocalProp.Curvature());
TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(cir);
curvatures.push_back(aEdge)
}
2. 曲面曲率
现在讨论曲率k, 切平面上的向量u,v(任意两个垂直向量)有无数多个。那么曲率k的取值就有无数多个。每个曲率k,对应于切平面上的一个确定向量V(a,b,u,v均取定)。故,每个曲率也对应于切线方向,这也正好是曲率定义,切线方向的变化。所以,我们关注曲率的最大值、最小值--主曲率。下式,曲率取极值,
2.1 曲面上一点的曲率及切平面
gp_Torus aTorus(gp_Ax3(), 8.0,4.0);
Geom_ToroidalSurface torSur(aTorus);
TopoDS_Face aTourF = BRepBuilderAPI_MakeFace(aTorus);
gp_Vec DirTanV;
gp_Vec DirTanU;
gp_Vec DirZMain;
gp_Pnt p0;
torSur.D1(1.0, 1.0, p0, DirTanU, DirTanV);
DirZMain = DirTanU;
DirZMain.Cross(DirTanV);
gp_Pln TPlane(p0, DirZMain); //求切平面
//求曲率
BRepAdaptor_Surface adaptor(aTourF);
GeomLProp_SLProps aProp(adaptor.Surface().Surface(),2,0.000001);
aProp.SetParameters(1.0,1.0);
gp_Dir Max; //主曲率方向
gp_Dir Min; //主曲率方向
Standard_Real maxCurvature=aProp.MaxCurvature();
Standard_Real minCurvature = aProp.MinCurvature();
aProp.CurvatureDirections(Max, Min);
Geom_Line aMaxVec(p0, Max);
Geom_Line aMinVec(p0, Min);
//aProp.GaussianCurvature();
//aProp.MeanCurvature();
曲面上一点任意方向(任意切线方向)的曲率似乎很难求得。不知是否是,两个主曲率的线性组合,暂未看到肯定说法。由于一点处各个方向的曲率不同,所以造成各向异性。简单来说,就是各个方向的尺寸度量不统一,这也是曲面黎曼度量要解决的问题。
3. 曲率控制网格划分
由于曲面上一点处沿各个方向的曲率不同,故而参数平面网格映射到三维曲面网格时,会出现网格畸变。以下陈述,通过曲率控制容差。
参考书籍一的4.2.5节《Geometry Control》,计算如下。假如取容差为0.01,那么三角形边长不应大于0.282倍的曲率半径。
曲率控制的网格实例,后续专门再写一点。
参考:
联系客服