OpenCASCADE点向平面投影
OpenCASCADE的ProjLib类提供了解析曲线(直线、圆、椭圆、抛物线、双曲线)向解析曲面(平面、圆柱面、圆锥面、球面、圆环面)投影的功能,主要用来计算三维曲线在二维参数空间的参数。
其中点向平面投影是最简单的情况,本文主要介绍点向平面投影的注意事项。ProjLib类是个工具类,因为其函数都是静态函数。点向平面投影很简单,直接用ProjLib::Project(aPlane, aPoint)即可。
其实现代码如下:
gp_Pnt2d ProjLib::Project(const gp_Pln& Pl, const gp_Pnt& P) { Standard_Real U, V; ElSLib::Parameters(Pl, P, U, V); return gp_Pnt2d(U,V); } inline void ElSLib::Parameters(const gp_Pln& Pl, const gp_Pnt& P, Standard_Real& U, Standard_Real& V) { ElSLib::PlaneParameters(Pl.Position(),P,U,V); } void ElSLib::PlaneParameters (const gp_Ax3& Pos, const gp_Pnt& P, Standard_Real& U, Standard_Real& V) { gp_Trsf T; T.SetTransformation (Pos); gp_Pnt Ploc = P.Transformed (T); U = Ploc.X(); V = Ploc.Y(); }
从上面的代码可以看出,点向平面投影实现就是将点变换到平面所在的坐标系中。使用这个类向平面投影要注意的事项是平面的构造。平面gp_Pln有如下构造函数:
l 默认构造函数:构造了一个XOY平面
l 基于一个坐标系gp_Ax3构造平面
l 基于一个点和一个方向构造平面
l 基于平面的系数方程,即AX+BY+CZ+D=0
前两个构造函数很清晰,而第三个构造函数即基于一个点和一个方向构造平面的方式没有明确,注释不清晰。这里的方向指定了平面的法向,但是还缺少一个方向来确定一个坐标系,所以使用这个构造函数来生成平面的时候,需要理解其生成另外一个方向的算法是不是自己需要的。
gp_Pln::gp_Pln (const gp_Pnt& P, const gp_Dir& V) { Standard_Real A = V.X(); Standard_Real B = V.Y(); Standard_Real C = V.Z(); Standard_Real Aabs = A; if (Aabs < 0) Aabs = - Aabs; Standard_Real Babs = B; if (Babs < 0) Babs = - Babs; Standard_Real Cabs = C; if (Cabs < 0) Cabs = - Cabs; // pour determiner l'axe X : // on dit que le produit scalaire Vx.V = 0. // et on recherche le max(A,B,C) pour faire la division. // l'une des coordonnees du vecteur est nulle. if( Babs <= Aabs && Babs <= Cabs) { if (Aabs > Cabs) pos = gp_Ax3 (P, V, gp_Dir (-C,0., A)); else pos = gp_Ax3 (P, V, gp_Dir ( C,0.,-A)); } else if( Aabs <= Babs && Aabs <= Cabs) { if (Babs > Cabs) pos = gp_Ax3 (P, V, gp_Dir (0.,-C, B)); else pos = gp_Ax3 (P, V, gp_Dir (0., C,-B)); } else { if (Aabs > Babs) pos = gp_Ax3 (P, V, gp_Dir (-B, A,0.)); else pos = gp_Ax3 (P, V, gp_Dir ( B,-A,0.)); } }
当这里确定平面坐标系的方式与需要的不一致时,在使用投影算法的时候就会产生问题。