diff --git a/contrib/FourierModel/ParaboloidProjectionSurface.cpp b/contrib/FourierModel/ParaboloidProjectionSurface.cpp index da82567e0a11242ac62e0a31d6711c38d4efdd16..52830b97e27a5064457b5602fdefe2020fac76a5 100755 --- a/contrib/FourierModel/ParaboloidProjectionSurface.cpp +++ b/contrib/FourierModel/ParaboloidProjectionSurface.cpp @@ -47,7 +47,7 @@ void ParaboloidProjectionSurface::F y = O_[1] + (u - 0.5) * scale_[1] * E1_[1] + (v - 0.5) * scale_[2] * E2_[1] + ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] + (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[1]; - z = O_[0] + (u - 0.5) * scale_[1] * E1_[2] + (v - 0.5) * scale_[2] * E2_[2] + + z = O_[2] + (u - 0.5) * scale_[1] * E1_[2] + (v - 0.5) * scale_[2] * E2_[2] + ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] + (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[2]; } @@ -141,51 +141,46 @@ void ParaboloidProjectionSurface::Dfdfdfdvdvdv bool ParaboloidProjectionSurface::OrthoProjectionOnSurface (double x, double y, double z, double& u, double& v) { - /* double R[3]; R[0] = x - O_[0]; R[1] = y - O_[1]; R[2] = z - O_[2]; - double RdotT = 0., RdotNcT = 0.; + double x0 = 0., y0 = 0., z0 = 0.; for (int i=0;i<3;i++) { - RdotT += R[i] * E1_[i]; - RdotNcT += R[i] * E2_[i]; + x0 += R[i] * E1_[i]; + y0 += R[i] * E2_[i]; + z0 += R[i] * E0_[i]; } - RdotT /= scale_[1]; - RdotNcT /= scale_[2]; + z0 /= scale_[0]; - u = atan2(RdotNcT,RdotT); - u /= twoPi_; - u += 0.5; + double a = 4.; + double b = 4. * (1. + z0); + double c = 1 + 4. * z0; + double d = z0 - x0 * x0 - y0 * y0; - double r1 = 0., r2 = 0.; - for (int i=0;i<3;i++) { - r1 += R[i] * (E1_[i] * scale_[1] * cos(twoPi_ * (u - 0.5)) + - E2_[i] * scale_[2] * sin(twoPi_ * (u - 0.5))); - r2 += R[i] * scale_[0] * E0_[i]; - } - - double A = - scale_[1] * scale_[1] * cos(twoPi_ * (u - 0.5)) * cos(twoPi_ * (u - 0.5)) + - scale_[2] * scale_[2] * sin(twoPi_ * (u - 0.5)) * sin(twoPi_ * (u - 0.5)); - double B = scale_[0] * scale_[0]; - - double a = 2 * K_[1] * K_[1] * B * B; - double b = K_[0] * K_[0] * A * A - 2 * K_[1] * r2 * B; - double c = - K_[0] * r1 * A; - - std::vector<double> root = SolveCubic(a,b,c); + std::vector<double> root = SolveCubic(a,b,c,d); if (root.size()) { - + double xP,yP,zP; + double minDist = 1.e12; + double minRoot; for (int i=0;i<root.size();i++) { - if (root[i] >= 0.) { - v = root[i]; - break; + xP = x0 / (2 * root[i] + 1.); + yP = y0 / (2 * root[i] + 1.); + zP = z0 + root[i]; + double dist = sqrt((x0-xP)*(x0-xP)+(y0-yP)*(y0-yP)+(z0-zP)*(z0-zP)); + if (dist < minDist) { + minDist = dist; + minRoot = root[i]; } } + xP = x0 / (2 * minRoot + 1.); + yP = y0 / (2 * minRoot + 1.); + zP = z0 + minRoot; + u = xP / scale_[1] + 0.5; + v = yP / scale_[2] + 0.5; double tol =1.e-4; if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol)) return true; @@ -194,7 +189,6 @@ bool ParaboloidProjectionSurface::OrthoProjectionOnSurface } else return false; -*/ } void ParaboloidProjectionSurface::