[Moscow.pm] B-spline (было: графики)

Ruslan Zakirov ruslan.zakirov на gmail.com
Пт Дек 12 11:58:20 PST 2008


без опорных точек никак, но можно упростить.

Берем кубический сплайн в непараметризованом виде:
y(x) = a(x-x0)^3+b(x-x0)^2+c(x-x0)+d

Составляем систему
y0 = y(x0) = d          # известно
y1 = y(x1)               (1)

два уравнения - 4 неизвестных. Вычисляем первую производную:
y'(x) = 3a(x-x0)^2+2b(x-x0)+c

y0' = y'(x0) = c        # апроксимируем
y1' = y'(x1)              (2)

Чтобы гарфик выглядел визульно плавным небходима C1 непрерывность
кривой. То есть прозводная на конце одного куска равно производной в
начале другого куска.

Для начала и конца направляем производную по линии к последующей точке, то есть:
tg(a) = (y1-y0)/(x1-x0) = y0'

Для промежуточных узлов берем за производную направление от
предыдущего узла к последющему, то eсть:
y'0|i = (y1|i - y0|i-1)/(x1|i - x0|i-1)

Вычислили производные и автоматом получаем с - равно производной.

Далее умножаем (1) на 2, а (2) на (x-x0) и получаем:
2*y1 = 2a(x1-x0)^3+2b(x1-x0)^2+2c(x1-x0)+2d
y1'(x-x0) = 3a(x1-x0)^3+2b(x1-x0)^2+c(x1-x0)

вычитаем:

y1'(x1-x0) - 2*y1 = a(x1-x0)^3 - c(x1-x0) - 2d

a = ( y1'(x1-x0) - 2*y1 + c(x1-x0) + 2d )/(x1-x0)

посчитать b не сложно.

2008/12/12 Orlovsky Alexander <nordicdyno на yandex.ru>:
> А вот есть на Perl либа, которая мне по массиву точек (координат x,y), расчитала бы опорные точки для кубических кривых Безье - по которым я бы нарисовал "кубический сплайн" (функцию для рисования кубических курв Безье я ужо нашел, нужны опорные точки :).
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm