ElSLib
ElSLib
(Elementary Surfaces Library)是 OpenCASCADE 中处理基础参数化曲面的核心数学工具类,与 ElCLib
对应曲线处理形成互补。以下是针对 7.9.0 版本的全面解析:
1.类定位与核心功能
- 设计目标
提供无状态静态方法处理基础解析曲面(平面、圆柱面、圆锥面、球面、圆环面)的数学计算,避免重复创建曲面对象。 - 核心功能:
- 曲面点坐标计算(
Value()
) - 曲面偏导数计算(
D1()
,D2()
) - 法向量计算(
Normal()
) - 参数空间与3D空间转换(
Parameters()
) - 曲面几何特性分析
- 曲面点坐标计算(
2.支持曲面类型与参数方程
曲面类型 | 参数方程 (U, V) | 关键参数 |
---|---|---|
平面 | P = O + U*XDir + V*YDir | 原点O,X/Y方向向量 |
圆柱面 | P = O + R*(cosU*XDir + sinU*YDir) + V*ZDir | 原点O,半径R,坐标系 |
圆锥面 | P = O + (R + V*tan(θ))*(cosU*XDir + sinU*YDir) + V*ZDir | 半角θ,坐标系 |
球面 | P = O + R*(cosV*(cosU*XDir + sinU*YDir) + sinV*ZDir) | 半径R,坐标系 |
圆环面 | P = O + (R1 + R2*cosV)*(cosU*XDir + sinU*YDir) + R2*sinV*ZDir | 主半径R1,次半径R2 |
3.核心方法实现解析
3.1. 曲面点计算(Value)
圆柱面实现示例:
void ElSLib::CylinderValue(const double U, const double V, const gp_Cylinder& C, gp_Pnt& P) {
const double R = C.Radius();
const gp_Ax3& pos = C.Position();
// 计算参数三角函数
const double cosU = cos(U);
const double sinU = sin(U);
// 计算点坐标
P.ChangeCoord() = pos.Location().XYZ() + (cosU * pos.XDirection().XYZ() + sinU * pos.YDirection().XYZ()) * R + V * pos.Direction().XYZ();
}
3.2. 偏导数计算(D1/D2)
球面一阶导数实现:
void ElSLib::SphereD1(const double U, const double V, const gp_Sphere& S, gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) {
const double R = S.Radius();
const gp_Ax3& pos = S.Position();
// 计算三角函数
const double cosU = cos(U), sinU = sin(U);
const double cosV = cos(V), sinV = sin(V);
// 点坐标
P = pos.Location().XYZ() + R * (cosV * (cosU * pos.XDirection().XYZ() + sinU * pos.YDirection().XYZ()) + sinV * pos.Direction().XYZ());
// U方向偏导(经线方向)
D1U = R * cosV * (-sinU * pos.XDirection().XYZ() + cosU * pos.YDirection().XYZ());
// V方向偏导(纬线方向)
D1V = R * (-sinV * (cosU * pos.XDirection().XYZ() + sinU * pos.YDirection().XYZ()) + cosV * pos.Direction().XYZ());
}
3.3. 法向量计算
通用法向量计算(基于偏导数叉积):
gp_Dir ElSLib::Normal(const double U, const double V, const gp_Cone& C) {
gp_Pnt P;
gp_Vec D1U, D1V;
ConeD1(U, V, C, P, D1U, D1V); // 计算一阶偏导
gp_Vec N = D1U.Crossed(D1V); // 叉积得法向量
if (N.Magnitude() <= gp::Resolution()) {
// 退化情况处理
}
return gp_Dir(N);
}
3.4. 参数空间转换
平面参数反求:
void ElSLib::PlaneParameters(const gp_Pln& Pln, const gp_Pnt& P, double& U, double& V) {
// 将点转换到平面坐标系
gp_Vec OP = P.XYZ() - Pln.Location().XYZ();
U = OP.Dot(Pln.XAxis().Direction());
V = OP.Dot(Pln.YAxis().Direction());
}
4.性能优化设计
- 内联函数:所有方法声明为
inline
减少调用开销 - 三角函数复用:在 D2 方法中复用 D1 的三角函数计算结果
- 避免虚函数:通过函数重载而非继承实现多态
- 几何缓存:高阶导数计算复用低阶结果
5.关键接口汇总
方法类别 | 典型函数签名 |
---|---|
点计算 | Value(U, V, Surface, P) |
一阶导数 | D1(U, V, Surface, P, D1U, D1V) |
二阶导数 | D2(U, V, Surface, P, D1U, D1V, D2U, D2V, D2UV) |
法向量 | Normal(U, V, Surface) |
参数反求 | Parameters(Surface, P, U, V) |
边界处理 | InPeriod(U, UFirst, ULast) |
6.应用场景
-
曲面离散化(BRepMesh 算法):
for(double u = uMin; u <= uMax; u += uStep) { for(double v = vMin; v <= vMax; v += vStep) { gp_Pnt P = ElSLib::Value(u, v, cylinder); mesh.AddVertex(P); } }
-
点投影到曲面:
double u, v; ElSLib::Parameters(sphere, point, u, v); gp_Pnt projected = ElSLib::Value(u, v, sphere);
-
曲面求交计算(IntAna_QuadQuadGeo):
// 计算两个曲面在参数点处的法向量 gp_Dir N1 = ElSLib::Normal(u1, v1, surf1); gp_Dir N2 = ElSLib::Normal(u2, v2, surf2);
-
等参线提取:
// 提取u=0.5的等参线 for(double v = 0; v <= 1; v += 0.01) { curvePts.Add(ElSLib::Value(0.5, v, torus)); }
7.设计特点分析
-
数学与几何分离:
纯数学计算与Geom_Surface
等高级几何对象解耦 -
类型安全重载:
通过不同曲面类型(gp_Pln
/gp_Sphere
等)的函数重载保证类型安全 -
数值稳定性处理:
// 圆锥面参数归一化处理 void ElSLib::ConeParameters(const gp_Cone& C, const gp_Pnt& P, double& U, double& V) { // 处理极点退化情况 if (Abs(P.Distance(C.Apex())) < Precision::Confusion()) { V = -C.RefRadius() / Tan(C.SemiAngle()); } // ...正常计算 }
-
参数标准化:
// 将参数值规范到[0, 2PI]区间 double ElSLib::InPeriod(double U, const double UFirst, const double ULast) { const double period = ULast - UFirst; while (U < UFirst) U += period; while (U > ULast) U -= period; return U; }
源码位置:
src/ElSLib
目录下的ElSLib.cxx
和ElSLib.hxx
。调试时可重点关注边界参数(如球面的极点)和退化情形的处理逻辑。