OpenCASCADE點(diǎn)向平面投影
OpenCASCADE的ProjLib類提供了解析曲線(直線、圓、橢圓、拋物線、雙曲線)向解析曲面(平面、圓柱面、圓錐面、球面、圓環(huán)面)投影的功能,主要用來(lái)計(jì)算三維曲線在二維參數(shù)空間的參數(shù)。
其中點(diǎn)向平面投影是最簡(jiǎn)單的情況,本文主要介紹點(diǎn)向平面投影的注意事項(xiàng)。ProjLib類是個(gè)工具類,因?yàn)槠浜瘮?shù)都是靜態(tài)函數(shù)。點(diǎn)向平面投影很簡(jiǎn)單,直接用ProjLib::Project(aPlane, aPoint)即可。
其實(shí)現(xiàn)代碼如下:
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();
}
從上面的代碼可以看出,點(diǎn)向平面投影實(shí)現(xiàn)就是將點(diǎn)變換到平面所在的坐標(biāo)系中。使用這個(gè)類向平面投影要注意的事項(xiàng)是平面的構(gòu)造。平面gp_Pln有如下構(gòu)造函數(shù):
l 默認(rèn)構(gòu)造函數(shù):構(gòu)造了一個(gè)XOY平面
l 基于一個(gè)坐標(biāo)系gp_Ax3構(gòu)造平面
l 基于一個(gè)點(diǎn)和一個(gè)方向構(gòu)造平面
l 基于平面的系數(shù)方程,即AX+BY+CZ+D=0
前兩個(gè)構(gòu)造函數(shù)很清晰,而第三個(gè)構(gòu)造函數(shù)即基于一個(gè)點(diǎn)和一個(gè)方向構(gòu)造平面的方式?jīng)]有明確,注釋不清晰。這里的方向指定了平面的法向,但是還缺少一個(gè)方向來(lái)確定一個(gè)坐標(biāo)系,所以使用這個(gè)構(gòu)造函數(shù)來(lái)生成平面的時(shí)候,需要理解其生成另外一個(gè)方向的算法是不是自己需要的。
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.));
}
}
當(dāng)這里確定平面坐標(biāo)系的方式與需要的不一致時(shí),在使用投影算法的時(shí)候就會(huì)產(chǎn)生問(wèn)題。