Длина кривой кривой Безье всегда равна нулю - PullRequest
0 голосов
/ 05 марта 2019

Я написал следующий код для вычисления длины кубической кривой Безье.Я получил идею от Рассчитать длину дуги, длину кривой кубической кривой Безье.Почему не работает? .Проблема в том, что он всегда выдает длину ноль.

public Vector2 SegmentAtPoint(int segmentIndex, float t)
{
    t = Mathf.Clamp01(t);
    float oneMinusT = 1f - t;

    return
        oneMinusT * oneMinusT * oneMinusT * points[segmentIndex * 3] + 
        3f * oneMinusT * oneMinusT * t * points[segmentIndex * 3 + 1] +
        3f * oneMinusT * t * t * points[segmentIndex * 3 + 2] +
        t * t * t * points[segmentIndex * 3 + 3];

}

public float SegmentLength(int segmentIndex)    {
    var steps = 10;
    var t = 1 / steps;
    var sumArc = 0.0f;
    var j = 0.0f;
    var a = new Vector2(0.0f, 0.0f);
    var b = points[segmentIndex * 3];

    var dX = 0.0f;
    var dY = 0.0f;
    var dS = 0.0f;

    for (int i = 0; i < steps; j = j + t)
    {
        a = SegmentAtPoint(segmentIndex, j);

        dX = a.x - b.x;
        dY = a.y - b.y;
        dS = Mathf.Sqrt((dX * dX) + (dY * dY));

        sumArc = sumArc + dS;
        b.x = a.x;
        b.y = a.y;
        i++;
    }

    return sumArc;

}

1 Ответ

3 голосов
/ 05 марта 2019

Код var t = 1 / steps; составляет целочисленное деление, , поэтому результат t равен нулю

Также обратите внимание, что j = j + t выполняется после каждого цикла, поэтому на первой итерации j==0

Этот недостаток вызывает такую ​​проблему: и b, и a равны на первой итерации, потому что j все еще остается = 0. Таким образом, вы рассчитываете длину сегмента на интервалах: 0-0, 0-0.1, 0.1-0.2...0.7-0.8,0.8-0.9 - игнорирование 0.9-1.0 интервал

...