Параметризация длины дуги кривой Безье - PullRequest
0 голосов
/ 24 июня 2018

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

Этот был моей ссылкой для разработки этого алгоритма, поэтому я не уверен, что моя реализация неверна или она применима только к кривым меньшего размера.

Заранее спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Как неловко, я просто забыл вычислить 0-ую точку!

...