我正在学习Bezier曲线,并想使用一种估计方法来参数化距离方程。到目前为止,我的代码似乎只适用于单点(例如,EG Bezier(start=0, mid=1, end=5, nPoints=6)
的收益为[0 1 2 3 4 5]
)。但是,当我尝试将其应用到多维曲线时,我的结果与预期不符。
C#代码(在Unity中执行以实现可视化)。该函数(应该)在曲线上的一个点(由点pts
定义)的长度为长度的l
%。
Vector3 BezierL(Vector3[] pts, float l)
{
int i;
float[] tVals = new float[n];
Vector3[] points = new Vector3[n];
float[] cumDist = new float[n];
for (i = 1; i < n; i++)
{
tVals[i] = i / (float)(n - 1);
points[i] = Bezier(pts, tVals[i]);
cumDist[i] = cumDist[i - 1] +
(points[i] - points[i - 1]).magnitude;
}
// Interpolate to estimate t
float targetLen = l * cumDist[n - 1];
int ind = Array.BinarySearch(cumDist, targetLen);
if (ind < 0)
ind = ~ind;
float t = Mathf.Lerp(tVals[ind - 1], tVals[ind],
(targetLen - cumDist[ind - 1]) / (cumDist[ind] - cumDist[ind - 1]));
return Bezier(pts, t);
}
其中Bezier(Vector3[] pts, t)
在时间pts
上由t
定义的曲线上得到一个点。无论出于何种原因,这部分起作用是因为所有点均等距分布,但有些点在初始点处堆叠,而不是沿曲线分布。
This是我开发此算法的参考,所以我不确定我的实现是否不正确,或者仅适用于低维曲线。
谢谢!
答案 0 :(得分:0)
令人尴尬的是,我只是忘了计算第0点!