예제 #1
0
 /// <inheritdoc />
 protected override void OnInverse(double[] xy, double[] lp, int startIndex, int numPoints)
 {
     for (int i = startIndex; i < startIndex + numPoints; i++)
     {
         int      phi = i * 2 + PHI;
         int      lam = i * 2 + LAMBDA;
         int      x   = i * 2 + X;
         int      y   = i * 2 + Y;
         int      nn;
         double[] p  = new double[2];
         double[] dp = new double[2];
         p[R] = xy[y];
         p[I] = xy[x];
         for (nn = 20; nn > 0; --nn)
         {
             double[] fp;
             double[] f = Proj.Zpolyd1(p, _bf, NBF, out fp);
             f[R] -= xy[y];
             f[I] -= xy[x];
             double den = fp[R] * fp[R] + fp[I] * fp[I];
             p[R] += dp[R] = -(f[R] * fp[R] + f[I] * fp[I]) / den;
             p[I] += dp[I] = -(f[I] * fp[R] - f[R] * fp[I]) / den;
             if ((Math.Abs(dp[R]) + Math.Abs(dp[I])) <= EPS10)
             {
                 break;
             }
         }
         if (nn > 0)
         {
             lp[lam] = p[I];
             lp[phi] = _tphi[NTPHI];
             for (int j = NTPHI - 1; j >= 0; j--)
             {
                 lp[phi] = _tphi[j] + p[R] * lp[phi];
             }
             lp[phi] = Phi0 + p[R] * lp[phi] * SEC5_TO_RAD;
         }
         else
         {
             lp[lam] = lp[phi] = double.MaxValue;
         }
     }
 }