Render.ru

Catmull-Rom spline implemen...

#1
tation...

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

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

Что такое Catmull-Rom Subdivision Surface я знаю. А вот алгоритм кривой...
 
#2
Незнаю поможет ли...но в
слимовских тэмплах как то это реализовано
причем учавствуют в этом процессе несколько
тэмплов которые в свою очередь питаються
TCL скриптами. Я не разбирался как, что и почему
потому как они к SL никакого отношения неимеют....
Может там что и найдеш.
 
#3
Эта функция встроена в стандарт, так что искать в TCL смысла нет (хотя и поискал...).
 
#4
Странно - я залез в яху и сразу нашел с десяток ссылок
Например пдфка: http://www.gpi.infomedia.it/sviluppo/papers/archivio/Catmull-Rom%20Splines/Catmull-Rom-Spline.pdf
Еще там вроде где-то видел что есть сигграфовский папер по этому поводу.
 
#5
Отлично, спасибо.

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

Еще раз повторю - при печати все OK.
 
#8
У меня есть вот что:

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;
}

Буду рад, если поможет...
 
Сверху