Кривая Катмулла-рома без выступов и без самопересечений

У меня есть следующий код для вычисления точек между четырьмя контрольными точками для создания кривой catmull-rom:

CGPoint interpolatedPosition(CGPoint p0, CGPoint p1, CGPoint p2, CGPoint p3, float t)
{
    float t3 = t * t * t;
    float t2 = t * t;

    float f1 = -0.5 * t3 + t2 - 0.5 * t;
    float f2 = 1.5 * t3 - 2.5 * t2 + 1.0;
    float f3 = -1.5 * t3 + 2.0 * t2 + 0.5 * t;
    float f4 = 0.5 * t3 - 0.5 * t2;

    float x = p0.x * f1 + p1.x * f2 + p2.x * f3 + p3.x * f4;
    float y = p0.y * f1 + p1.y * f2 + p2.y * f3 + p3.y * f4;

    return CGPointMake(x, y);
}

Это отлично работает, но я хочу создать что-то, что, как мне кажется, называется центростремительной параметризацией. Это означает, что у кривой не будет выступов и самопересечений. Если я перемещу одну контрольную точку очень близко к другой, кривая должна стать «меньше». Я погуглил, пытаясь найти способ сделать это. Кто-нибудь знает, как это сделать?

42
задан Ali Shakiba 28 April 2014 в 01:56
поделиться