0020139: EDF 944 SMESH : Get 2D/3D element with X, Y, Z coordinates

+  bool IsOut(double X, double Y, double Z, double tol);
+  // Classify a point
This commit is contained in:
eap 2009-09-10 05:19:01 +00:00
parent ec71bd93d2
commit ba741219df
2 changed files with 39 additions and 8 deletions

View File

@ -368,6 +368,8 @@ static int QuadHexa_nbN [] = { 8, 8, 8, 8, 8, 8 };
// ======================================================== // ========================================================
// to perform some calculations without linkage to CASCADE // to perform some calculations without linkage to CASCADE
// ======================================================== // ========================================================
namespace
{
struct XYZ { struct XYZ {
double x; double x;
double y; double y;
@ -376,25 +378,26 @@ struct XYZ {
XYZ( double X, double Y, double Z ) { x = X; y = Y; z = Z; } XYZ( double X, double Y, double Z ) { x = X; y = Y; z = Z; }
XYZ( const XYZ& other ) { x = other.x; y = other.y; z = other.z; } XYZ( const XYZ& other ) { x = other.x; y = other.y; z = other.z; }
XYZ( const SMDS_MeshNode* n ) { x = n->X(); y = n->Y(); z = n->Z(); } XYZ( const SMDS_MeshNode* n ) { x = n->X(); y = n->Y(); z = n->Z(); }
XYZ operator-( const XYZ& other ); inline XYZ operator-( const XYZ& other );
XYZ Crossed( const XYZ& other ); inline XYZ Crossed( const XYZ& other );
double Dot( const XYZ& other ); inline double Dot( const XYZ& other );
double Magnitude(); inline double Magnitude();
}; };
XYZ XYZ::operator-( const XYZ& Right ) { inline XYZ XYZ::operator-( const XYZ& Right ) {
return XYZ(x - Right.x, y - Right.y, z - Right.z); return XYZ(x - Right.x, y - Right.y, z - Right.z);
} }
XYZ XYZ::Crossed( const XYZ& Right ) { inline XYZ XYZ::Crossed( const XYZ& Right ) {
return XYZ (y * Right.z - z * Right.y, return XYZ (y * Right.z - z * Right.y,
z * Right.x - x * Right.z, z * Right.x - x * Right.z,
x * Right.y - y * Right.x); x * Right.y - y * Right.x);
} }
double XYZ::Dot( const XYZ& Other ) { inline double XYZ::Dot( const XYZ& Other ) {
return(x * Other.x + y * Other.y + z * Other.z); return(x * Other.x + y * Other.y + z * Other.z);
} }
double XYZ::Magnitude() { inline double XYZ::Magnitude() {
return sqrt (x * x + y * y + z * z); return sqrt (x * x + y * y + z * z);
} }
}
//======================================================================= //=======================================================================
//function : SMDS_VolumeTool //function : SMDS_VolumeTool
@ -837,6 +840,32 @@ bool SMDS_VolumeTool::GetBaryCenter(double & X, double & Y, double & Z) const
return true; return true;
} }
//================================================================================
/*!
* \brief Classify a point
* \param tol - thickness of faces
*/
//================================================================================
bool SMDS_VolumeTool::IsOut(double X, double Y, double Z, double tol)
{
// LIMITATION: for convex volumes only
XYZ p( X,Y,Z );
for ( int iF = 0; iF < myNbFaces; ++iF )
{
XYZ faceNormal;
if ( !GetFaceNormal( iF, faceNormal.x, faceNormal.y, faceNormal.z ))
continue;
if ( !IsFaceExternal( iF ))
faceNormal = XYZ() - faceNormal; // reverse
XYZ face2p( p - XYZ( myFaceNodes[0] ));
if ( face2p.Dot( faceNormal ) > tol )
return true;
}
return false;
}
//======================================================================= //=======================================================================
//function : SetExternalNormal //function : SetExternalNormal
//purpose : Node order will be so that faces normals are external //purpose : Node order will be so that faces normals are external

View File

@ -93,6 +93,8 @@ class SMDS_EXPORT SMDS_VolumeTool
bool GetBaryCenter (double & X, double & Y, double & Z) const; bool GetBaryCenter (double & X, double & Y, double & Z) const;
bool IsOut(double X, double Y, double Z, double tol);
// Classify a point
// ----------------------- // -----------------------
// info on node connection // info on node connection