X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FINTERP_KERNEL%2FVolSurfUser.cxx;h=963b7319c5f68d199a227208a343c928cf159d2f;hb=e3f6dbd1cff92acf8d57c61e38bd5c3eb68a85ae;hp=5097e47edc7bbd826602a09005be4a56d34fa2de;hpb=f1a947b32a36d8dc8e3079b25305bb50e8cb59a0;p=tools%2Fmedcoupling.git diff --git a/src/INTERP_KERNEL/VolSurfUser.cxx b/src/INTERP_KERNEL/VolSurfUser.cxx index 5097e47ed..963b7319c 100644 --- a/src/INTERP_KERNEL/VolSurfUser.cxx +++ b/src/INTERP_KERNEL/VolSurfUser.cxx @@ -24,25 +24,27 @@ #include #include #include +#include namespace INTERP_KERNEL { - double SquareDistanceFromPtToSegInSpaceDim2(const double *pt, const double *pt0Seg2, const double *pt1Seg2) throw(INTERP_KERNEL::Exception) + double SquareDistanceFromPtToSegInSpaceDim2(const double *pt, const double *pt0Seg2, const double *pt1Seg2, std::size_t &nbOfHint) { double dx=pt1Seg2[0]-pt0Seg2[0],dy=pt1Seg2[1]-pt0Seg2[1]; double norm=sqrt(dx*dx+dy*dy); if(norm==0.) - return std::numeric_limits::max(); + return (pt[0]-pt0Seg2[0])*(pt[0]-pt0Seg2[0])+(pt[1]-pt0Seg2[1])*(pt[1]-pt0Seg2[1]);//return std::numeric_limits::max(); dx/=norm; dy/=norm; double dx2=pt[0]-pt0Seg2[0],dy2=pt[1]-pt0Seg2[1]; double dotP=(dx2*dx+dy2*dy); if(dotP<0. || dotP>norm) - return std::numeric_limits::max(); + return dotP<0.?(pt[0]-pt0Seg2[0])*(pt[0]-pt0Seg2[0])+(pt[1]-pt0Seg2[1])*(pt[1]-pt0Seg2[1]):(pt[0]-pt1Seg2[0])*(pt[0]-pt1Seg2[0])+(pt[1]-pt1Seg2[1])*(pt[1]-pt1Seg2[1]); + nbOfHint++; double x=pt0Seg2[0]+dotP*dx,y=pt0Seg2[1]+dotP*dy; return (x-pt[0])*(x-pt[0])+(y-pt[1])*(y-pt[1]); } - double DistanceFromPtToTriInSpaceDim3(const double *pt, const double *pt0Tri3, const double *pt1Tri3, const double *pt2Tri3) throw(INTERP_KERNEL::Exception) + double DistanceFromPtToTriInSpaceDim3(const double *pt, const double *pt0Tri3, const double *pt1Tri3, const double *pt2Tri3) { double matrix[12]; if(!ComputeRotTranslationMatrixToPut3PointsOnOXY(pt0Tri3,pt1Tri3,pt2Tri3,matrix)) @@ -55,21 +57,19 @@ namespace INTERP_KERNEL xy[1]=matrix[4]*pt[0]+matrix[5]*pt[1]+matrix[6]*pt[2]+matrix[7]; double z=matrix[8]*pt[0]+matrix[9]*pt[1]+matrix[10]*pt[2]+matrix[11]; double ret=std::numeric_limits::max(); - int nbOfHint=0; + std::size_t nbOfHint=0; if(xy[0]>0. && xy[0]::max()) - { ret=std::min(ret,sqrt(z*z+tmp)); nbOfHint++; } - tmp=SquareDistanceFromPtToSegInSpaceDim2(xy,xy2,xy0);//distance pt to edge [pt2Tri3,pt0Tri3] - if(tmp!=std::numeric_limits::max()) - { ret=std::min(ret,sqrt(z*z+tmp)); nbOfHint++; } + { ret=std::min(ret,z*z+xy[1]*xy[1]); nbOfHint++; } //distance pt to edge [pt0Tri3,pt1Tri3] + double tmp=SquareDistanceFromPtToSegInSpaceDim2(xy,xy1,xy2,nbOfHint); //distance pt to edge [pt1Tri3,pt2Tri3] + ret=std::min(ret,z*z+tmp); + tmp=SquareDistanceFromPtToSegInSpaceDim2(xy,xy2,xy0,nbOfHint);//distance pt to edge [pt2Tri3,pt0Tri3] + ret=std::min(ret,z*z+tmp); if(nbOfHint==3) - ret=std::min(ret,fabs(z)); - return ret; + ret=std::min(ret,z*z); + return sqrt(ret); } - double DistanceFromPtToPolygonInSpaceDim3(const double *pt, const int *connOfPolygonBg, const int *connOfPolygonEnd, const double *coords) throw(INTERP_KERNEL::Exception) + double DistanceFromPtToPolygonInSpaceDim3(const double *pt, const int *connOfPolygonBg, const int *connOfPolygonEnd, const double *coords) { std::size_t nbOfEdges=std::distance(connOfPolygonBg,connOfPolygonEnd); if(nbOfEdges<3) @@ -94,13 +94,12 @@ namespace INTERP_KERNEL std::size_t nbOfHint=0; for(std::size_t i=0;i::max()) - { ret=std::min(ret,sqrt(z*z+tmp)); nbOfHint++; } + double tmp=SquareDistanceFromPtToSegInSpaceDim2(xy,((double *)ptXY)+2*i,((double *)ptXY)+2*((i+1)%nbOfEdges),nbOfHint); + ret=std::min(ret,z*z+tmp); } if(nbOfHint==nbOfEdges) - ret=std::min(ret,fabs(z)); - return ret; + ret=std::min(ret,z*z); + return sqrt(ret); } /*!