X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_MeshAlgos.cxx;fp=src%2FSMESHUtils%2FSMESH_MeshAlgos.cxx;h=f42e24c11603b48beb73ef36b8881f127679de89;hb=441a2df90cb97ea7d035771a49e28dc53469e3d6;hp=0fc388e75939e987fed1b662f93419fbce4a79fd;hpb=858b4bff6498075831d120d54f3dfe25566336b9;p=modules%2Fsmesh.git diff --git a/src/SMESHUtils/SMESH_MeshAlgos.cxx b/src/SMESHUtils/SMESH_MeshAlgos.cxx index 0fc388e75..f42e24c11 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.cxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.cxx @@ -1476,9 +1476,9 @@ namespace //================================================================================ /*! - * \brief Return of a point relative to a segment + * \brief Return position of a point relative to a segment * \param point2D - the point to analyze position of - * \param xyVec - end points of segments + * \param segEnds - end points of segments * \param index0 - 0-based index of the first point of segment * \param posToFindOut - flags of positions to detect * \retval PointPos - point position @@ -1607,46 +1607,63 @@ double SMESH_MeshAlgos::GetDistance( const SMDS_MeshFace* face, } // compute distance - PointPos pos = *pntPosSet.begin(); - switch ( pos._name ) - { - case POS_LEFT: - { - // point is most close to an edge - gp_Vec edge( xyz[ pos._index ], xyz[ pos._index+1 ]); - gp_Vec n1p ( xyz[ pos._index ], point ); - double u = ( edge * n1p ) / edge.SquareMagnitude(); // param [0,1] on the edge - // projection of the point on the edge - gp_XYZ proj = xyz[ pos._index ] + u * edge.XYZ(); - if ( closestPnt ) *closestPnt = proj; - return point.Distance( proj ); - } - case POS_RIGHT: + + double minDist2 = Precision::Infinite(); + for ( std::set< PointPos >::iterator posIt = pntPosSet.begin(); posIt != pntPosSet.end(); ++posIt) { - // point is inside the face - double distToFacePlane = Abs( tmpPnt.Y() ); - if ( closestPnt ) + PointPos pos = *posIt; + if ( pos._name != pntPosSet.begin()->_name ) + break; + switch ( pos._name ) + { + case POS_LEFT: // point is most close to an edge + { + gp_Vec edge( xyz[ pos._index ], xyz[ pos._index+1 ]); + gp_Vec n1p ( xyz[ pos._index ], point ); + double u = ( edge * n1p ) / edge.SquareMagnitude(); // param [0,1] on the edge + // projection of the point on the edge + gp_XYZ proj = xyz[ pos._index ] + u * edge.XYZ(); + double dist2 = point.SquareDistance( proj ); + if ( dist2 < minDist2 ) + { + if ( closestPnt ) *closestPnt = proj; + minDist2 = dist2; + } + break; + } + + case POS_RIGHT: // point is inside the face { - if ( distToFacePlane < std::numeric_limits::min() ) { - *closestPnt = point.XYZ(); + double distToFacePlane = Abs( tmpPnt.Y() ); + if ( closestPnt ) + { + if ( distToFacePlane < std::numeric_limits::min() ) { + *closestPnt = point.XYZ(); + } + else { + tmpPnt.SetY( 0 ); + trsf.Inverted().Transforms( tmpPnt ); + *closestPnt = tmpPnt; + } } - else { - tmpPnt.SetY( 0 ); - trsf.Inverted().Transforms( tmpPnt ); - *closestPnt = tmpPnt; + return distToFacePlane; + } + + case POS_VERTEX: // point is most close to a node + { + double dist2 = point.SquareDistance( xyz[ pos._index ]); + if ( dist2 < minDist2 ) + { + if ( closestPnt ) *closestPnt = xyz[ pos._index ]; + minDist2 = dist2; } + break; + } + default:; + return badDistance; } - return distToFacePlane; - } - case POS_VERTEX: - { - // point is most close to a node - gp_Vec distVec( point, xyz[ pos._index ]); - return distVec.Magnitude(); - } - default:; } - return badDistance; + return Sqrt( minDist2 ); } //=======================================================================