Я изучаю кривые Безье и хотел бы параметризовать уравнения для расстояния, используя метод оценки. Пока что мой код работает для отдельных точек (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
. По какой-то причине это частично работает в том смысле, что все точки расположены на равных расстояниях, но некоторые точки расположены в начальной точке, а не распределены вдоль кривой.
Этот был моей ссылкой для разработки этого алгоритма, поэтому я не уверен, что моя реализация неверна или она применима только к кривым меньшего размера.
Заранее спасибо!