X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHUtils%2FSMESH_MeshAlgos.cxx;h=f42e24c11603b48beb73ef36b8881f127679de89;hp=c953da5155596fde6f73177c80acad78a284b118;hb=441a2df90cb97ea7d035771a49e28dc53469e3d6;hpb=4c16067d4281f56bd07d3f92fb63fff9c0c1d169 diff --git a/src/SMESHUtils/SMESH_MeshAlgos.cxx b/src/SMESHUtils/SMESH_MeshAlgos.cxx index c953da515..f42e24c11 100644 --- a/src/SMESHUtils/SMESH_MeshAlgos.cxx +++ b/src/SMESHUtils/SMESH_MeshAlgos.cxx @@ -1243,11 +1243,11 @@ gp_XYZ SMESH_ElementSearcherImpl::Project(const gp_Pnt& point, ElementBndBoxTree*& ebbTree = _ebbTree[ _elementType ]; if ( !ebbTree ) - ebbTree = new ElementBndBoxTree( *_mesh, _elementType ); + ebbTree = new ElementBndBoxTree( *_mesh, _elementType, _meshPartIt ); gp_XYZ p = point.XYZ(); ElementBndBoxTree* ebbLeaf = ebbTree->getLeafAtPoint( p ); - const Bnd_B3d* box = ebbLeaf->getBox(); + const Bnd_B3d* box = ebbLeaf ? ebbLeaf->getBox() : ebbTree->getBox(); double radius = ( box->CornerMax() - box->CornerMin() ).Modulus(); ElementBndBoxTree::TElemSeq elems; @@ -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 ) { - if ( distToFacePlane < std::numeric_limits::min() ) { - *closestPnt = point.XYZ(); + 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; } - else { - tmpPnt.SetY( 0 ); - trsf.Inverted().Transforms( tmpPnt ); - *closestPnt = tmpPnt; + break; + } + + case POS_RIGHT: // point is inside the face + { + 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; + } } + 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 ); } //======================================================================= @@ -1790,7 +1807,7 @@ void SMESH_MeshAlgos::GetBarycentricCoords( const gp_XY& p, const double t11 = T22, t12 = -T12, t21 = -T21, t22 = T11; // vector const double r11 = p.X()-t2.X(), r12 = p.Y()-t2.Y(); - // barycentric coordinates: mutiply matrix by vector + // barycentric coordinates: multiply matrix by vector bc0 = (t11 * r11 + t12 * r12)/Tdet; bc1 = (t21 * r11 + t22 * r12)/Tdet; }