1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Catmull-Rom spline implemen...

Тема в разделе "RenderMan", создана пользователем -, 20 дек 2000.

Модераторы: Moderator.
  1. Guest

    tation...

    [ доска не позволяет длинные сабжекты ;-)) ]

    Итак, делаю для ShaderMan редакторы Color Ramp и Spline. Для того, чтобы можно было задавать их визуально. Отсюда возникает вопрос - что представляет из себя алгоритм Catmull-Rom для интерполяции кривых? Где ни искал - ничего нет, вчера все книжки перерыл.

    Что такое Catmull-Rom Subdivision Surface я знаю. А вот алгоритм кривой...
     
  2. Guest

    Незнаю поможет ли...но в
    слимовских тэмплах как то это реализовано
    причем учавствуют в этом процессе несколько
    тэмплов которые в свою очередь питаються
    TCL скриптами. Я не разбирался как, что и почему
    потому как они к SL никакого отношения неимеют....
    Может там что и найдеш.
     
  3. Guest

    Эта функция встроена в стандарт, так что искать в TCL смысла нет (хотя и поискал...).
     
  4. Guest

    Странно - я залез в яху и сразу нашел с десяток ссылок
    Например пдфка: http://www.gpi.infomedia.it/sviluppo/papers/archivio/Catmull-Rom%20Splines/Catmull-Rom-Spline.pdf
    Еще там вроде где-то видел что есть сигграфовский папер по этому поводу.
     
  5. Guest

    Отлично, спасибо.

    Кстати, для всех, кто интересуется - именно так выглядит PDF файл, сделанный из последних версий TeX'а, если не принять специальных мер. То есть печатается от замечательно, а вот на экране...
     
  6. Guest

    А какие меры надо принимать, если не секрет?
     
  7. Guest

    Надо научить dvips подставлять Postscript Level 1 фонты (выкачиваются отдельно) вместо Postscript Level 3, которые мало того, идут по умолчанию, так еще и растеризуются (!) из *.pk файлов и соответственно плохо воспроизводятся на экране Акробатом.

    Еще раз повторю - при печати все OK.
     
  8. Guest

    У меня есть вот что:

    RtFloat RiCatmullRomFilter( RtFloat x, RtFloat y,
    RtFloat xwidth, RtFloat ywidth )
    {
    /*
    * From page 223 of [MITC88]
    *
    * if abs(d) < 1
    * f(d) = 1/6*( (12-9*B-9*C)*abs(d*d*d)
    * + (-18 + 12*B + 6*C)*d*d + (6-2*B) )
    *
    * if 1 <= abs(d) < 2
    * f(d) = 1/6*( (-B-6*C)*abs(d*d*d)
    * + (6*B + 30*C)*d*d
    * + (-12*B - 48*C)*d
    * + (8*B + 24*C) )
    *
    * otherwise f(d)=0
    *
    * -------------------------------------------------------------
    * When B = 0.0 and C = 0.5 the filter is a Catmull-Rom cubic spline.
    *
    * if abs(d) < 1
    * f(d) = 1/6*[ (12-3)*abs(d*d*d) + (-18 + 3)*d*d + (6) ]
    *
    * if 1 <= abs(d) < 2
    * f(d) = 1/6*[ (-3)*abs(d*d*d) + (15)*d*d + (-24)*d + (12) ]
    *
    * otherwise f(d)=0
    * -------------------------------------------------------------
    * Simplifying:
    *
    * if abs(d) < 1
    * f(d) = (3/2)*abs(d*d*d) - (5/2)*d*d + 1
    *
    * if 1 <= abs(d) <2
    * f(d) = (-0.5)*abs(d*d*d) + (5/2)*d*d - 4*abs(d) + 2
    *
    * otherwise f(d)=0
    *
    */

    double d,d1,d2,d3;

    d = sqrt(x*x+y*y); /* distance from origin */
    d1 = abs(d);
    d2 = d*d;
    d3 = d2*d1; /* abs(d*d*d) */

    if ( d1 < 1 )
    return ( (3/2)*d3 - (5/2)*d2 + 1 );
    else if ( d1 < 2 )
    return ( (-0.5)*d3 + (5/2)*d2 - 4*d1 + 2 );
    else
    return 0.0;
    }

    Буду рад, если поможет...
     
Модераторы: Moderator.

Поделиться этой страницей