diff --git a/src/SMESH/SMESH_Block.cxx b/src/SMESH/SMESH_Block.cxx index 4c55ca8e4..431208fcf 100644 --- a/src/SMESH/SMESH_Block.cxx +++ b/src/SMESH/SMESH_Block.cxx @@ -239,6 +239,42 @@ bool SMESH_Block::ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const return true; } +//======================================================================= +//function : ShellPoint +//purpose : computes coordinates of a point in shell by points on sub-shapes; +// thePointOnShape[ subShapeID ] must be a point on a subShape +//======================================================================= + +bool SMESH_Block::ShellPoint(const gp_XYZ& theParams, + const vector& thePointOnShape, + gp_XYZ& thePoint ) +{ + if ( thePointOnShape.size() < ID_F1yz ) + return false; + + double x = theParams.X(), y = theParams.Y(), z = theParams.Z(); + double x1 = 1. - x, y1 = 1. - y, z1 = 1. - z; + const vector& p = thePointOnShape; + + thePoint = + x1 * p[ID_F0yz] + x * p[ID_F1yz] + + y1 * p[ID_Fx0z] + y * p[ID_Fx1z] + + z1 * p[ID_Fxy0] + z * p[ID_Fxy1] + + x1 * (y1 * (z1 * p[ID_V000] + z * p[ID_V001]) + + y * (z1 * p[ID_V010] + z * p[ID_V011])) + + x * (y1 * (z1 * p[ID_V100] + z * p[ID_V101]) + + y * (z1 * p[ID_V110] + z * p[ID_V111])); + thePoint -= + x1 * (y1 * p[ID_E00z] + y * p[ID_E01z]) + + x * (y1 * p[ID_E10z] + y * p[ID_E11z]) + + y1 * (z1 * p[ID_Ex00] + z * p[ID_Ex01]) + + y * (z1 * p[ID_Ex10] + z * p[ID_Ex11]) + + z1 * (x1 * p[ID_E0y0] + x * p[ID_E1y0]) + + z * (x1 * p[ID_E0y1] + x * p[ID_E1y1]); + + return true; +} + //======================================================================= //function : NbVariables //purpose :