public float GetArcLength(float t)
{
var halfT = t / 2f;
float sum = 0f;
foreach (var wx in gaussWX)
{
var w = wx[0];
var x = wx[1];
// 权值w乘以公式带入特定值x
sum += w * GetPointDer(halfT * x + halfT).magnitude;
}
sum *= halfT;
return sum;
}
获得了该公式后,我们实际已知的是s,而需要求t,这个时候使用牛顿迭代法迭代3、4次就可以快速的获得精确的t:
其中t0是初始迭代值,t1是下一个迭代值,这边我们t0就直接选用s了:
public float S2T(float s)
{
const int NEWTON_SEGMENT = 4;
s = Mathf.Clamp01(s);
float t = s;
// 牛顿迭代法
for (int i = 0; i < NEWTON_SEGMENT; i++)
{
t = t - (T2S(t) - s) / T2SDer(t);
}
return t;
}
结果: