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); }