diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index ef02713b92f7bcdce224b93ba9bd8557a7b50fba..6dcb922de7a53e7c1a14cb37d49277a81e922375 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -799,8 +799,8 @@ void GFace::XYZtoUV(double X, double Y, double Z, double &U, double &V, int iter; double mat[3][3], jac[3][3]; double umin, umax, vmin, vmax; - double initu[NumInitGuess] = {0.487, 0.6, 0.4, 0.7, 0.3, 0.8, 0.2, 1., 0., 0., 1.}; - double initv[NumInitGuess] = {0.487, 0.6, 0.4, 0.7, 0.3, 0.8, 0.2, 0., 1., 0., 1.}; + double initu[NumInitGuess] = {0.5, 0.6, 0.4, 0.7, 0.3, 0.8, 0.2, 0.9, 0.1, 1., 0.}; + double initv[NumInitGuess] = {0.5, 0.6, 0.4, 0.7, 0.3, 0.8, 0.2, 0.9, 0.1, 1., 0.}; Range<double> ru = parBounds(0); Range<double> rv = parBounds(1); @@ -809,6 +809,12 @@ void GFace::XYZtoUV(double X, double Y, double Z, double &U, double &V, vmin = rv.low(); vmax = rv.high(); + const double tol = Precision*(SQU(umax-umin)+SQU(vmax-vmin)); + for(int i = 0; i < NumInitGuess; i++) { + initu[i] = umin + initu[i]*(umax-umin); + initv[i] = vmin + initv[i]*(vmax-vmin); + } + for(int i = 0; i < NumInitGuess; i++){ for(int j = 0; j < NumInitGuess; j++){ @@ -821,7 +827,7 @@ void GFace::XYZtoUV(double X, double Y, double Z, double &U, double &V, err2 = sqrt(SQU(X - P.x()) + SQU(Y - P.y()) + SQU(Z - P.z())); if (err2 < 1.e-8 * CTX::instance()->lc) return; - while(err > Precision && iter < MaxIter) { + while(err > tol && iter < MaxIter) { P = point(U, V); Pair<SVector3, SVector3> der = firstDer(SPoint2(U, V)); mat[0][0] = der.left().x(); @@ -851,7 +857,7 @@ void GFace::XYZtoUV(double X, double Y, double Z, double &U, double &V, V = Vnew; } - if(iter < MaxIter && err <= Precision && + if(iter < MaxIter && err <= tol && Unew <= umax && Vnew <= vmax && Unew >= umin && Vnew >= vmin){ if (onSurface && err2 > 1.e-4 * CTX::instance()->lc)