public float approximate(Vector3 _in, int near)
        {
            int     n = near;
            Vector3 nearest = controlPoints[n];
            Vector3 previous = controlPoints[n > 0 ? n - 1 : spanCount - 1];
            Vector3 next = controlPoints[(n + 1) % spanCount];
            float   dstPrev2 = _in.Dst2(previous);
            float   dstNext2 = _in.Dst2(next);
            Vector3 P1, P2, P3;

            if (dstNext2 < dstPrev2)
            {
                P1 = nearest;
                P2 = next;
                P3 = _in;
            }
            else
            {
                P1 = previous;
                P2 = nearest;
                P3 = _in;
                n  = n > 0 ? n - 1 : spanCount - 1;
            }
            float L1Sqr = P1.Dst2(P2);
            float L2Sqr = P3.Dst2(P2);
            float L3Sqr = P3.Dst2(P1);
            var   L1    = (float)Math.Sqrt(L1Sqr);
            float s     = (L2Sqr + L1Sqr - L3Sqr) / (2f * L1);
            float u     = Mathf.Clamp((L1 - s) / L1, 0f, 1f);

            return((n + u) / spanCount);
        }